2015-11-02 12 views
11

che sto cercando di chiamare a livello di codice per un numero con codice seguente:il permesso revocato android.permission.CALL_PHONE

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

Ho impostato il permesso nel Manifesto:

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

I' Sto lavorando con un vero dispositivo per test e debugging, è Nexus 5 con Android M, il mio compileSdkVersion ha 23. Ho ottenuto la seguente eccezione di sicurezza:

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 

Ho cercato sul Web e questa comunità per Q/A simili e non ho trovato la risposta. Qualsiasi aiuto sarà apprezzato.

risposta

13

In Android 6.0 (Api lvl 23) abbiamo qualcosa chiamato "Autorizzazioni di runtime". Devi leggere a riguardo.

È possibile trovare la documentazione here.

+0

Grazie, Artur, sono riuscito a risolvere questo con il tutorial della documentazione. Capisco che su Android <23 il permesso verrà comunque richiesto al momento dell'installazione, ho ragione? –

+0

@LuciusHipan Sì, per la retrocompatibilità. –

7

Autorizzazione CALL_PHONE appartiene al gruppo di autorizzazioni pericolose.
Quindi, se le tue app hanno come target SDK uguale o superiore a 23 e il tuo dispositivo è in esecuzione su Android 6.0 o versioni successive, devi richiedere l'autorizzazione CALL_PHONE mentre l'app è in esecuzione.

Esempio:

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

Quando vostre richieste app permessi, il sistema presenta una finestra di dialogo per l'utente. Quando l'utente risponde, il sistema richiama il metodo onRequestPermissionsResult() della tua app, passandogli la risposta dell'utente.

@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 
    } 
} 
Problemi correlati