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

时间:2016-03-04 07:22:09

标签: android android-permissions android-6.0-marshmallow

我正在尝试支持我的应用程序android M?我有一些权限需要在运行时明确询问。我能够在运行时访问其他权限但“ android.permission.READ_PHONE_STATE ”导致SecurityException异常。

这是我的清单文件:

<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" />

4 个答案:

答案 0 :(得分:1)

在你的应用的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
}

答案 1 :(得分:1)

对于Android 23或更高版本,您需要明确询问您的用户是否要授予您权限。处理此问题的两种方法:将Max SDK版本设置为22(或更低),或者除了在清单文件中指定外,还要在运行时询问用户。

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

话虽如此,在发布问题之前尝试进行一些搜索。不鼓励重复的问题。

可能对您有所帮助的其他链接:similar question on StackOverFlow

答案 2 :(得分:0)

您需要在M设备上请求permission,并在未授予permission的情况下处理。您可以参考android文档here

答案 3 :(得分: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

上的代码