SecurityException:权限拒绝:通过显式意图启动 Activity 时

2024-03-09

我正在读关于在活动中声明权限 https://developer.android.com/guide/components/activities/intro-activities#dp。根据文档

您可以使用清单的标签来控制哪些应用程序可以启动特定活动。父活动无法启动子活动,除非两个活动在其清单中具有相同的权限。如果您为特定活动声明一个元素,则调用活动必须有一个匹配的元素。

为了尝试这个,我创建了 2 个示例应用程序。第一个应用程序将尝试直接启动第二个应用程序的活动,使用明确的意图, 此外,第二个应用程序将声明我从第一个应用程序启动的特定活动的权限。

这些是我遵循的步骤

  1. 创建了 2 个应用程序(例如发送者和接收者)
  2. 添加了权限<uses-permission android:name="permission.SHARE_POST"/> in the Manifest发件人的
  3. 现在,通过单击发送者应用程序的按钮,我正在调用名为的接收者活动ShareActivity如下

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("basics.android.com.androidbasics","basics.android.com.androidbasics.ShareActivity"));
        startActivity(intent);
    

    NOTE: basics.android.com.androidbasics是接收者的包名

  4. 下面给出的是第二个应用程序(接收者)清单中的活动声明

           <activity
            android:name=".ShareActivity"
            android:exported="true"
            android:permission="permission.SHARE_POST"/>
    

现在,当我运行这两个应用程序并尝试启动时ShareActivity从发件人处,我收到以下错误

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { cmp=basics.android.com.androidbasics/.ShareActivity } from ProcessRecord{e09a1fc 26267:sender.android.com.sender/u0a925} (pid=26267, uid=10925) requires permission.SHARE_POST

好像发件人没有权限permission.SHARE_POST然而。但我已经在发件人清单中声明了。 这里发生了什么事?


在 Android 中使用自定义权限是相当高级的事情。基本配方是:

  1. 决定您想要的权限名称。它在设备上必须是唯一的。所以,permission.SHARE_POST不是一个好的选择 - 添加与您的域名或您用作应用程序基础的任何其他名称相关联的前缀applicationId values.
  2. 在使用权限保护自己的应用程序中,声明一个<permission>元素,具有android:name属性保存步骤 #1 中的权限名称。或者,给它一个android:protectionLevel属性(例如,signature,因此只有由相同签名密钥签名的应用程序才能协同工作)。
  3. 在使用权限保护自己的应用程序中,添加android:permission组件上的属性(例如,<activity>),值为步骤 #1 中的权限名称。
  4. 在希望与步骤 #3 中的应用程序进行通信的应用程序中,添加<uses-permission>属性,带有一个android:name属性保存步骤 #1 中的权限名称。
  5. 在这两个应用程序中,设置您的minSdkVersion到 21,因为旧版本上的自定义权限存在安全问题。

如果防御者(步骤 #2 和 #3)始终在客户端(步骤 #4)之前安装,那么这将起作用。如果您希望应用程序可以按任一顺序安装,请将上面的步骤 #2 替换为:

  1. In both apps,声明一个<permission>元素,具有android:name属性保存步骤 #1 中的权限名称。或者,给它一个android:protectionLevel属性(例如,signature,因此只有由相同签名密钥签名的应用程序才能协同工作)。另外,请确保两个应用程序始终由相同的签名密钥签名,否则它们不能同时定义相同的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SecurityException:权限拒绝:通过显式意图启动 Activity 时 的相关文章

  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • 我应该选择的最低 SDK 版本是多少? (截至2018年11月)

    据我所知 android studio 中默认的最小 SDK 设置是 15 我读到我应该增加它 因为没有多少人 或者可能没有 仍在使用该 android 版本 另外 我计划使用 android studio 中的一些新功能 这些功能仅适用于
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 从Android客户端登录appengine

    我正在尝试登录应用程序引擎并访问应用程序引擎中的用户服务API 基本上我希望能够看到谁登录了我的 servlet 我正在使用从 android 获取 authtoken 然后从应用程序引擎获取 ASID 或 SACID cookie 的身份
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 从 sqlite 和 mysql 加载数据微调器

    我试试这个tutorial http nielpoenya blogspot com 2012 08 tutorial android spinner dari database html加载Spinner from sqlite and
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports

随机推荐