2015-11-02 83 views
11

我试图用下面的代码编程方式调用了一些:吊销许可android.permission.CALL_PHONE

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

我已经设置清单中的权限:

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

我m与真正的设备进行测试和调试,它是Nexus 5与Android M,我的compileSdkVersion是23.我得到以下安全例外:

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 

我在网上搜索了类似的Q/A并且找不到答案。任何帮助将不胜感激。

回答

13

在android 6.0(Api lvl 23)中,我们有一个名为“运行时权限”的东西。你必须阅读它。

你可以找到文件here

+0

谢谢Artur,我已经用文档教程成功解决了这个问题。我知道在Android上<23安装许可还会被要求,对吗? –

+0

@LhuciusHipan是的,为了向后兼容。 –

7

权限CALL_PHONE属于危险权限组。
因此,如果您的应用目标SDK为23或更高,并且您的设备在Android 6.0或更高版本上运行,则必须在应用运行时请求CALL_PHONE权限。

例子:

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

当你的应用程序请求的权限,系统会显示一个对话框给用户。当用户响应时,系统会调用您的应用程序的onRequestPermissionsResult()方法,并将其传递给用户响应。

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