引起︰java.lang.SecurityException︰android.permission.READ_PHONE_STATE

问题描述:

我想支持我的应用程序Android M?我有一些权限需要明确要求在运行时。我能够访问其他权限在运行时,但“ android.permission.READ_PHONE_STATE“导致SecurityException。引起︰java.lang.SecurityException︰android.permission.READ_PHONE_STATE

这里是我的清单文件:

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="23" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<!-- Map related permissions --> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<!-- --> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
+0

请发表您的gradle这个代码 – Amy

+0

HTTPS我的代码://developer.android.com/intl/in/training/permissions/requesting.html –

+0

@Amy我正在使用eclipse ..我没有看到任何gradle。 – Joe

在您的应用的build.gradle

<uses-sdk 
android:minSdkVersion="14" 
android:targetSdkVersion="23" /> 

变化

<uses-sdk 
android:minSdkVersion="14" 
android:targetSdkVersion="22" /> 

并从这些manifest.xml中一行。 然后它也会在android M中工作。

请参阅本

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     applicationId "your.package.name" 
     minSdkVersion 14 
     targetSdkVersion 22 
     // other lines defaultConfig 
    } 
// other lines in android 
} 
+0

,谢谢,雅我知道它会在目标= 22,但我需要目标版本是23. – Joe

+0

把目标22.它也将在Android M工作。 – Android

+0

是你的权利..但我想在目标23中达到同样的效果...... 23不可能吗? – Joe

你需要在需要时为permission要求,对M器件和处理,如果permission不granted.You可以参考Android文档here

对于Android的23或更高,如果他们想给你一个许可,你需要明确地询问你的用户。两种处理方法:除了在清单文件中指定外,还要将最大SDK版本设置为22(或更低),或者在运行时询问用户。

有关如何在运行时询问权限的详细信息,请参阅Working with System Permissions。 “Requesting Permissions at Run Time”会话从第一个链接中解释了如何在您的代码中以非常详细的方式执行此操作。

这就是说,在发布问题之前尝试做一些搜索。不鼓励重复的问题。

其它链接,可以帮助你:similar question on *

+0

检查这个答案。 –

你需要requestPermissions,这里的一些例子

private final static int REQUEST_CODE_ASK_PERMISSIONS = 1002; 

@Override 
protected void onStart() { 
    super.onStart(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

     int res = checkSelfPermission(Manifest.permission.READ_PHONE_STATE); 
     if (res != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 
        REQUEST_CODE_OVERLAY_PERMISSION); 
     } 

    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
     @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_PERMISSIONS: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(MainActivity.this, "READ_PHONE_STATE Denied", Toast.LENGTH_SHORT) 
         .show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

有关详细信息,请参阅GitHub