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

5

背景

我正在调查一款办公室应用程序需要更改哪些权限,以便良好支持Android 6。

问题

我已经确定了哪些权限需要确认,哪些不需要,但还有一个问题:

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

看起来我在寻找的权限没有被自动授予,但我找不到用户可以启用它作为确认的地方。

我尝试过的方法

为了找出哪些权限是默认授予的,哪些权限不是,默认调用了以下代码:

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 时,它会显示该权限未被授予。

问题

这是怎么回事? 我如何授予应用程序此权限? 是否在任何地方都有提到?


“这个权限”是什么,确切地说是什么?它的“protectionLevel”是什么? - CommonsWare
1
一开始看起来似乎不是一个有效的权限名称。曾经,您需要为GCM创建一个特定于应用程序的自定义权限,其中包含您的包名称。如果我没记错的话,那是一个“签名”权限,“签名”权限不属于运行时权限系统。它们是基于签名匹配自动授予的。但是我已经有几年没有涉及GCM了。 - CommonsWare
@Android开发者,这个权限可以防止其他Android应用程序注册并接收Android应用程序的消息。权限名称必须完全匹配此模式,否则Android应用程序将无法接收消息。https://developers.google.com/cloud-messaging/android/client - yashodhan divakaran
根据我们目前的观察,它确实有效很长一段时间,因此开头的“.”是有效的,因为它在packageName之前添加了。然而,当我自己检查时,它会失败/崩溃以检查权限是否已授予。 - android developer
使用POC,在Android 6上调用pm.checkPermission时会崩溃,但在Android 5.1上不会(尽管仍然显示未授予权限)。我现在将在实际应用程序中检查它。 - android developer
显示剩余7条评论
2个回答

1

好的,我不确定为什么会这样,但是据说只有在以下情况下才会授予权限:

  1. The package name of the app is its prefix
  2. you also declare the permission, as such:

    <permission
       android:name="com.example.user.androidmtest.permission.C2D_MESSAGE"
        android:protectionLevel="signature"/>
    

奇怪的是,即使在没有添加包名的情况下,代码表明权限未被授予,但应用程序仍能正常工作。


1

文档于2015年10月更新,仍然表明您需要签名权限。

另请参见在GCM(Android)中未收到推送通知

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接