为什么在Android 6上未授予GCM权限?

时间:2015-11-01 15:00:16

标签: android permissions google-cloud-messaging android-6.0-marshmallow

背景

我试图调查办公室的应用程序需要更改其权限,以便很好地支持Android 6.

问题

我发现哪个权限需要确认,哪个不是,除了一个:

<uses-permission android:name=".permission.C2D_MESSAGE"/>

似乎在我查找的任何地方都没有提到此权限,因为我们未自动授予此权限,但我无法找到用户可以将其作为确认启用的位置。< / p>

我尝试了什么

为了找到默认授予的权限以及哪些权限不是,我只是调用了这段代码:

private void checkPermissionsOfApp(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        final ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
        Log.d("AppLog", "Listing all permissions of app with PackageName: " + applicationInfo.packageName);
        PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
        //Get Permissions
        String[] requestedPermissions = packageInfo.requestedPermissions;
        if (requestedPermissions != null) {
            for (String permission : requestedPermissions) {
                boolean permissionGranted = pm.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED;
                Log.d("AppLog", "permission:" + permission + " permissionGranted:" + permissionGranted);
            }
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
}

电话:

checkPermissionsOfApp(getPackageName());

使用上面的代码,它会因为有问题的权限而崩溃,但是当使用ContextCompat.checkSelfPermission时,它表示它没有被授予。

问题

怎么可能? 我如何授予应用程序此权限? 它在哪里提到过?

2 个答案:

答案 0 :(得分:1)

2015年10月更新的documentation仍表示您需要签名权限。

另见Not receiving push notifications from GCM (Android)

正如@CommonsWare所提到的,这似乎不是新运行时权限检查的一部分,或者至少不被视为“危险”权限,因此应自动授予。

答案 1 :(得分:1)

好吧,我不确定为什么会这样,但据说只有在以下情况下才会授予许可:

  1. 应用的包名称是其前缀
  2. 你也宣布了这样的许可:

    <permission
       android:name="com.example.user.androidmtest.permission.C2D_MESSAGE"
        android:protectionLevel="signature"/>
    
  3. 奇怪的是,尽管代码表示在不添加包名时未授予权限,但它在应用程序上运行。