web-dev-qa-db-de.com

Aufhebung der Erlaubnis Android.permission.CALL_PHONE

Ich versuche, eine Nummer mit folgendem Code programmgesteuert aufzurufen:

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

Ich habe die Erlaubnis im Manifest gesetzt: 

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

Ich arbeite mit echten Geräten zum Testen und Debuggen, es ist Nexus 5 mit Android M, meine compileSdkVersion ist 23. Ich erhalte folgende Sicherheitsausnahme:

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

Ich habe das Web und diese Community nach ähnlichen Fragen und Antworten durchsucht und konnte keine Antwort finden. Jede Hilfe wird geschätzt.

14

In Android 6.0 (API-Ebene 23) haben wir etwas "Laufzeitberechtigungen". Du musst darüber lesen.

Dokumentation finden Sie hier .

14

Berechtigung CALL_PHONE gehört zu einer gefährlichen Berechtigungsgruppe.
Wenn also das SDK Ihrer Apps das Ziel 23 oder höher ist und Ihr Gerät unter Android 6.0 oder höher ausgeführt wird, müssen Sie die CALL_PHONE-Berechtigung anfordern, während die App ausgeführt wird.

Beispiel:

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();
   }
}

Wenn Ihre App Berechtigungen anfordert, zeigt das System dem Benutzer ein Dialogfeld an. Wenn der Benutzer antwortet, ruft das System die onRequestPermissionsResult () - Methode Ihrer App auf und leitet die Benutzerantwort weiter. 

@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

Ihr Code könnte nur funktionieren, wenn Sie einen ACTION_DIAL und keinen ACTION_CALL eingeben, für den Sie eine Berechtigung anfordern müssen.

MANIFEST:

<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