从历史上看,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(复制起来最简单),声明的自定义权限会自动授予。
据我所知,你试图做下一件事(至少,这就是我如何重现你的问题):
>
在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