当前位置: 首页 > 知识库问答 >
问题:

Android自定义权限-Marshmallow

夹谷腾
2023-03-14

从历史上看,Android自定义权限一团糟,并且依赖于安装顺序,这是众所周知的暴露漏洞。

在API 21之前,有一个令人不安的变通方法,即在您的清单中声明另一个应用程序的自定义权限,授予该权限...但是,自API21以来,只有一个应用程序可以声明自定义权限,并且将阻止安装声明相同权限的另一个应用程序。

替代方案是重新安装需要权限的应用程序,这样系统就会检测到它们,但这不是一个好的用户体验。或者在运行时检查调用应用程序的权限,但这并非没有理论上的缺陷。

复制

在清单中声明自定义权限和BroadcastReceiver。

<permission
    android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
    android:description="@string/control_description"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/control_label"
    android:protectionLevel="normal or dangerous"/>

<uses-permission
    android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>

// etc

<receiver
    android:name="com.example.app.MyBroadcastReceiver"
    android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
    <intent-filter android:priority="999">
        <action android:name="com.example.app.REQUEST_RECEIVER"/>
    </intent-filter>
</receiver>

从第三方应用程序中,声明它使用清单中的自定义权限(并通过对话框或设置接受该权限),然后调用:

    final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");

    context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {

        // getResultCode();

        }
    }, null, Activity.RESULT_CANCELED, null, null);

问题

这是意料之中的行为吗?还是我不知何故忽略了什么?

提出一个对话说

Edit:为了澄清,对于其他实现,比如在服务上声明permmission(复制起来最简单),声明的自定义权限会自动授予。

共有1个答案

薛兴德
2023-03-14

据我所知,你试图做下一件事(至少,这就是我如何重现你的问题):

>

  • 在first(我们称之为F)应用程序中声明新的自定义权限

    <permission
        android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
        android:description="@string/control_description"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/control_label"
        android:protectionLevel="normal or dangerous"/>
    

    您定义F应用程序使用com.example.app.permission.control_example_app权限。正如指导方针所说,这是正确的。

    <uses-permission
        android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>
    

    您在F应用程序中声明您的自定义广播接收器。要与广播通信,您的应用程序(不管是哪一个,F还是其他应用程序)必须获得您的自定义权限

    <receiver
        android:name="com.example.app.MyBroadcastReceiver"
        android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
        <intent-filter android:priority="999">
            <action android:name="com.example.app.REQUEST_RECEIVER"/>
        </intent-filter>
    </receiver>
    
    <uses-permission
        android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>
    
    final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");
    context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
            @Override
            public void onReceive(final Context context, final Intent intent) {
                // getResultCode();
            }
        }, null, Activity.RESULT_CANCELED, null, null);
    

    而且,这一点很重要,您授予了S应用程序的权限,但没有授予F应用程序的权限。

    结果你在F应用程序中声明的广播接收器没有收到任何东西。

    在您授予F应用程序权限之后(请注意,现在S和F授予了您的自定义权限),一切都很好。在F应用程序中声明的广播接收器从S应用程序接收消息。

    因此,android API23应该首先获得访问使用您的许可表单用户。我们必须获得2个授予的权限,第一个来自F应用程序(因为guidline是这么说的),第二个来自S应用程序(因为我们只需要获得访问权限)。

    但我没听懂你的下一个观点:

    提出一个对话说

  •  类似资料:
    • 本文向大家介绍Android权限控制之自定义权限,包括了Android权限控制之自定义权限的使用技巧和注意事项,需要的朋友参考一下 天哪,这篇文章终于说道如何自定义权限了,左盼右盼,其实这个自定义权限相当easy。为了方便叙述,我这边会用到两个app作为例子示范。 Permission App: used to define a new permission 这个作为定义权限的App,我称之为Pe

    • 11.6.添加自定义权限 我们曾在第六章的更新Manifest文件,获取Internet权限一节讨论过,应用程序若要访问系统的某项功能(比如连接网络、发短信、打电话、读取通讯录、拍照等等),那就必须获取相应的权限。比如现在的Yamba,就需要连接网络、监视系统启动、监视网络连接情况这三项权限。它们都在Manifest文件中<user-permission>部分给出了声明,至于能否得到这些权限,则由

    • 问题内容: 我在Google Play上的应用出现问题。我有一个免费的应用程序,它利用了自定义权限。此权限允许访问付费应用。这些付费应用程序充当“键”,并在免费应用程序中解锁功能。基本上,免费应用会尝试启动其中一款付费应用的意图。付费应用程序会做一些事情,然后返回免费应用程序是否应该解锁功能。 根据应用安装的顺序出现问题。如果先安装了免费应用程序,然后再安装了付费应用程序,则免费应用程序无法启动意

    • 本文向大家介绍Android 中在有序广播中添加自定义权限的实例,包括了Android 中在有序广播中添加自定义权限的实例的使用技巧和注意事项,需要的朋友参考一下 Android 中在有序广播中添加自定义权限的实例 前言; 有序广播说明: 有序广播因为要处理消息的处理结果,所以要复杂一些。 * sendOrderedBroadcast(Intent intent, String receiverP

    • 功能说明 目睹直播提供了一系列的授权观看方式,如密码验证,付费观看等,然而由于客户业务的多样性,实现如:接入客户自身账户体系,登陆OA系统后再跳转到目睹观看直播等一系列更高级的授权观看方式,此时就需要使用自定义授权。 自定义授权逻辑图 功能设置 首先,需在 某个频道 - 频道管理 - 授权观看 - 授权类型 中点击自定义授权,并输入您希望在观众进入观看页时跳转的链接,如: http://your-

    • 我正在将Apache Shiro实现到我的web应用程序中,在启动时遇到了问题。 我想从postgreSQL数据库加载角色和权限,并检查用户是否具有角色/权限。 我的角色权利系统包括以下内容: 用户- 角色- 可以将角色分配给多个用户 用户角色分配始终与其他两个条件相关: 一个组织单位(在我的例子中称为OE) 一个学院 因此,用户“教员管理员”基本上可能有以下内容: 角色OE-管理员,拥有OE:3