studio permission permisos internet example editar androidmanifest activity android android-intent android-permissions

permission - permisos android studio



La acción de llamada intencionada no funciona en Marshmallow (3)

Intento iniciar una acción de intento de llamada en un dispositivo que tiene Marshmallow como sistema operativo, utilizando los mismos pasos que de costumbre (esto está funcionando en las versiones siguientes):

Agregar permiso:

<uses-permission android:name="android.permission.CALL_PHONE" />

Abre el intento:

Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + getString(R.string.connect_phone))); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

Este es el log que estoy obteniendo:

EXCEPCIÓN FATAL: principal

Proceso: com.app.calling, PID: 4250 java.lang.SecurityException: denegación de permiso: iniciar el intento {act = android.intent.action.CALL dat = tel: xxxxxxxxxxxxx flg = 0x10000000 cmp = com.android.server.telecom / .components.UserCallActivity VirtualScreenParam = Params {mDisplayId = -1, null, mFlags = 0x00000000)}} de ProcessRecord {1618b01 4250: com.app.calling / u0a234} (pid = 4250, uid = 10234) con permiso revocado android.permission .CALL_PHONE en android.os.Parcel.readException (Parcel.java:1620) en android.os.Parcel.readException (Parcel.java:1573) en android.app.ActivityManagerProxy.startActivity (ActivityManagerNative.java:3130) en android. app.Instrumentation.execStartActivity (Instrumentation.java:1540) en android.app.Activity.startActivityForResult (Activity.java:4283) en android.app.Activity.startActivityForResult (Activity.java:4230) en android.support.v4.app .FragmentActivity.startActivityFromFragment (FragmentActivity.java:849) en android.support.v4.app.FragmentActivity $ HostCallbacks.onStartActivityFr omFragment (FragmentActivity.java:907) en android.support.v4.app.Fragment.startActivity (Fragment.java:919) en com.app.calling.activity.fragment.ConnectFragment $ 2.onGroupClick (ConnectFragment.java:44) en android.widget.ExpandableListView.handleItemClick (ExpandableListView.java:676) en android.widget.ExpandableListView.performItemClick (ExpandableListView.java:654) en android.widget.AbsListView $ PerformClick.run (AbsListView.java:3821) en android.widget .AbsListView $ 3.run (AbsListView.java:5841) en android.os.Handler.handleCallback (Handler.java:739) en android.os.Handler.dispatchMessage (Handler.java:95) en android.os.Looper.loop (Looper.java:158) en android.app.ActivityThread.main (ActivityThread.java:7224) en java.lang.reflect.Method.invoke (Método nativo) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Una vez más, este proceso está funcionando bien en la versión anterior (Lollipop y kitkat) desafortunadamente no está en Marshmallow, ¿alguien sabe por qué o qué me falta?


A partir de Android 6.0 (API 23), los permisos peligrosos deben declararse en el manifiesto Y debe solicitar explícitamente ese permiso del usuario. Según esta lista, CALL_PHONE se considera un permiso peligroso.

Cada vez que realiza una operación que requiere un permiso peligroso, debe verificar si el usuario ha otorgado ese permiso. Si no es así, debe solicitar que se otorgue. Consulte Solicitar permisos en tiempo de ejecución en Desarrolladores de Android.


Para la versión de Marshmallow y superior, debe solicitar el permiso en tiempo de ejecución no solo en el archivo de manifiesto. Aquí está la documentación:

Solicitud de permisos en tiempo de ejecución

Espero eso ayude.


Método para hacer llamadas

public void onCall() { int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CALL_PHONE}, "123"); } else { startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:12345678901"))); } }

Verificar permiso

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 123: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { onCall(); } else { Log.d("TAG", "Call Permission Not Granted"); } break; default: break; } }