API 23 Manifest.permission.READ_SMS 总是被拒绝
API 23 Manifest.permission.READ_SMS is always denied
我在使用 Android 6 危险权限功能时遇到了一些麻烦,用户必须明确授予某些权限。就我而言,我使用以下代码请求一组权限:
public class SplashScreenActivity extends BaseActivity implements
RefreshClientOptionsTask.IRefreshClientOptionsListener {
private static final String [] DANGEROUS_PERMISSIONS = {permission.READ_PHONE_STATE,
permission.READ_SMS,
permission.ACCESS_FINE_LOCATION,
permission.CALL_PHONE,
permission.WRITE_EXTERNAL_STORAGE,
permission.READ_EXTERNAL_STORAGE,
permission.CAMERA
};
private void initPermissions() {
List<String> missingPermissions = new ArrayList<String>();
for(String permission : DANGEROUS_PERMISSIONS) {
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
missingPermissions.add(permission);
}
}
if (missingPermissions.size() > 0) {
String [] permissions = new String[missingPermissions.size()];
ActivityCompat.requestPermissions(
this,
missingPermissions.toArray(permissions),
1);
} else {
// we have all permissions, move on
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for(int grantResult : grantResults) {
// handle denied permissions
}
}
}
执行此代码时,我会看到四个权限请求对话框。我在每个对话框中按 'allow' 后 onRequestPermissionsResult
被执行并且 grantResults
参数包含所有零(PERMISSION_GRANTED
)除了 READ_SMS
权限 - 它等于 -1( PERMISSION_DENIED
)。发生了什么事,我应该如何处理这种情况?
我正在物理设备上进行测试 运行 Android 6.0.
在处理 Marshmallow 的新权限模型时,除了在运行时请求危险权限外,任何所需的权限都必须在清单中列出。
在这种情况下,您似乎实际上没有清单中的 READ_SMS
权限,这就是它在运行时被拒绝的原因。
Android 在最新 23 API 级别 中更改了权限接受,在此过程中 一些权限将在安装时自动授予,这些权限在中指定Manifest,剩余的权限是在运行时接受的,因为有很多坏人试图通过这个安全漏洞收集用户的个人数据所以Android更改为运行时权限
有关运行时权限的更多信息
检查以下内容 Link
Everything every Android Developer must know about new Android's Runtime Permission
我在使用 Android 6 危险权限功能时遇到了一些麻烦,用户必须明确授予某些权限。就我而言,我使用以下代码请求一组权限:
public class SplashScreenActivity extends BaseActivity implements
RefreshClientOptionsTask.IRefreshClientOptionsListener {
private static final String [] DANGEROUS_PERMISSIONS = {permission.READ_PHONE_STATE,
permission.READ_SMS,
permission.ACCESS_FINE_LOCATION,
permission.CALL_PHONE,
permission.WRITE_EXTERNAL_STORAGE,
permission.READ_EXTERNAL_STORAGE,
permission.CAMERA
};
private void initPermissions() {
List<String> missingPermissions = new ArrayList<String>();
for(String permission : DANGEROUS_PERMISSIONS) {
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
missingPermissions.add(permission);
}
}
if (missingPermissions.size() > 0) {
String [] permissions = new String[missingPermissions.size()];
ActivityCompat.requestPermissions(
this,
missingPermissions.toArray(permissions),
1);
} else {
// we have all permissions, move on
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for(int grantResult : grantResults) {
// handle denied permissions
}
}
}
执行此代码时,我会看到四个权限请求对话框。我在每个对话框中按 'allow' 后 onRequestPermissionsResult
被执行并且 grantResults
参数包含所有零(PERMISSION_GRANTED
)除了 READ_SMS
权限 - 它等于 -1( PERMISSION_DENIED
)。发生了什么事,我应该如何处理这种情况?
我正在物理设备上进行测试 运行 Android 6.0.
在处理 Marshmallow 的新权限模型时,除了在运行时请求危险权限外,任何所需的权限都必须在清单中列出。
在这种情况下,您似乎实际上没有清单中的 READ_SMS
权限,这就是它在运行时被拒绝的原因。
Android 在最新 23 API 级别 中更改了权限接受,在此过程中 一些权限将在安装时自动授予,这些权限在中指定Manifest,剩余的权限是在运行时接受的,因为有很多坏人试图通过这个安全漏洞收集用户的个人数据所以Android更改为运行时权限
有关运行时权限的更多信息 检查以下内容 Link
Everything every Android Developer must know about new Android's Runtime Permission