2015-11-02 11 views
11

Próbuję programowo zadzwonić na numer z następującego kodu:Revoked pozwolenie android.permission.CALL_PHONE

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

mam ustawić uprawnienie w manifeście:

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

I m pracuje z prawdziwym urządzeniem do testowania i debugowania, to jest Nexus 5 z Androidem M, mój compileSdkVersion to 23. Otrzymuję następujący wyjątek bezpieczeństwa:

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 

Przeszukałem sieć i tę społeczność pod kątem podobnych pytań i odpowiedzi i nie mogłem znaleźć odpowiedzi. Każda pomoc zostanie doceniona.

Odpowiedz

13

W systemie Android 6.0 (Api lvl 23) mamy coś, co nazywa się "Runtime Permissions". Musisz o tym przeczytać.

Możesz znaleźć dokumentację here.

+0

Dziękuję, Artur, udało mi się rozwiązać ten problem za pomocą samouczka do dokumentacji. Rozumiem, że na Androidzie <23 pozwolenie nadal będzie wymagane podczas instalacji, czy mam rację? –

+0

@LuciusHipan Tak, w celu zapewnienia zgodności ze starszymi wersjami. –

7

Pozwolenie CALL_PHONE należy do niebezpiecznej grupy uprawnień.
Jeśli Twoje aplikacje mają SDK 23 lub wyższy, a urządzenie działa na Androidzie 6.0 lub nowszym, musisz poprosić o pozwolenie CALL_PHONE podczas pracy aplikacji.

Przykład:

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

Gdy aplikacja żąda uprawnień, system wyświetla okno dialogowe dla użytkownika. Gdy użytkownik odpowie, system wywołuje metodę onRequestPermissionsResult() aplikacji, przekazując mu odpowiedź użytkownika.

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