我正在尝试支持我的应用程序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" />
答案 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
上的代码