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