web-dev-qa-db-fra.com

Autorisation révoquée Android.permission.CALL_PHONE

J'essaie d'appeler par programme un numéro avec le code suivant:

 String number = ("tel:" + numTxt.getText());
 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse(number));
 startActivity(intent);

J'ai mis la permission dans le manifeste: 

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

Je travaille avec de vrais appareils pour les tests et le débogage, il s’agit du Nexus 5 avec Android M, mon compileSdkVersion a 23 ans. L’exception de sécurité suivante apparaît:

error: Permission Denial: starting Intent { act=Android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.Android.server.telecom/.components.UserCallActivity } from ProcessRecord{cbbd7c1 5228:com.dialerTest.DialerApp/u0a96} (pid=5228, uid=10096) with revoked permission Android.permission.CALL_PHONE

J'ai cherché sur le Web et dans cette communauté des questions similaires et je n'ai pas trouvé de réponse. Toute aide serait appréciée.

14

Dans Android 6.0 (niveau 23 d'API), nous avons quelque chose appelé "Autorisations d'exécution". Vous devez lire à ce sujet.

Vous pouvez trouver la documentation ici .

14
Artur Szymański

La permission CALL_PHONE appartient au groupe de permissions dangereux.
Ainsi, si le SDK cible de votre application est 23 ou supérieur et que votre appareil fonctionne sous Android 6.0 ou supérieur, vous devez demander l'autorisation CALL_PHONE pendant l'exécution de l'application.

Exemple :

String number = ("tel:" + numTxt.getText());
mIntent = new Intent(Intent.ACTION_CALL);
mIntent.setData(Uri.parse(number));
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.CALL_PHONE)
    != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.CALL_PHONE},
            MY_PERMISSIONS_REQUEST_CALL_PHONE);

    // MY_PERMISSIONS_REQUEST_CALL_PHONE is an
    // app-defined int constant. The callback method gets the
    // result of the request.
} else {
    //You already have permission
     try {
        startActivity(mIntent); 
    } catch(SecurityException e) {
       e.printStackTrace();
   }
}

Lorsque votre application demande des autorisations, le système présente une boîte de dialogue à l'utilisateur. Lorsque l'utilisateur répond, le système appelle la méthode onRequestPermissionsResult () de votre application et lui transmet la réponse de l'utilisateur. 

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
  switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! Do the phone call

        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.
        }
        return;
    }

    // other 'case' lines to check for other
    // permissions this app might request
  }
}
10
Faisal T

Votre code ne fonctionne que si vous créez un ACTION_DIAL, et non un ACTION_CALL, sur lequel vous devez demander une autorisation. Si vous souhaitez effectuer un appel, veuillez suivre cet exemple:

MANIFESTE:

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

Code :

import static Android.Manifest.permission.CALL_PHONE;

Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:0612312312"));
/*
Intent i = new Intent(Intent.ACTION_DIAL);
i.setData(Uri.parse("tel:0612312312"));
if (i.resolveActivity(getPackageManager()) != null) {
      startActivity(i);
}*/
if (ContextCompat.checkSelfPermission(getApplicationContext(), CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
      startActivity(i);
} else {
      requestPermissions(new String[]{CALL_PHONE}, 1);
}
1
Alessandro Ornano