API 23 Manifest.permission.READ_SMS始终被拒绝

时间:2016-02-05 11:37:42

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

我在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
            }
        }
}

当这段代码执行时,我会看到四个权限请求对话框。在每个对话框中按“允许”后,onRequestPermissionsResult执行grantResults参数包含除PERMISSION_GRANTED权限之外的所有零(READ_SMS) - 它等于-1({{ 1}})。发生了什么,我该如何处理这种情况?

我正在测试运行Android 6.0的物理设备。

2 个答案:

答案 0 :(得分:2)

在处理Marshmallow的新权限模型时,除了在运行时请求危险权限外,还必须在清单中列出所有必需的权限。

在这种情况下,您似乎在清单中实际上没有READ_SMS权限,这就是它在运行时被拒绝的原因。

答案 1 :(得分:1)

Android已更改权限接受最新 23 API级别,在此过程中某些权限将在安装时自动授予,这些权限在清单中指定,剩余权限是接受的在RunTime中,因为有很多坏人试图通过这个安全漏洞来收集用户的个人数据所以Android更改为运行时权限

有关运行时权限的更多信息 检查以下链接

Everything every Android Developer must know about new Android's Runtime Permission