【问题标题】:setPackage for intent in gingerbread姜饼意图的 setPackage
【发布时间】:2012-02-21 00:43:01
【问题描述】:

根据android documentation

或者,从 ICE_CREAM_SANDWICH 开始,您还可以使用 Intent.setPackage 安全地将广播限制为单个应用程序

Gingerbread 中是否有任何方法(可能使用兼容性库)来限制 sendBroadcat() 事件,使其仅将其发送到指定的包?

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    我的第一个建议是尽可能使用LocalBroadcastManager。这使您可以完全忽略任何安全问题。

    如果您确实需要将广播从一个应用程序发送到另一个应用程序,那么在 ICS 之前 registerReceiver() 确实不遵守 setPackage 限制,因此在此之前您不能依赖它。做你想做的事没有秘诀,只是平台没有相应的功能。

    也就是说...如果您要指定明确的包名称,为什么不直接使用Intent.setComponent()

    另外请记住,即使 setPackage() 或 setComponent() 也不是自动完全安全的——您仍然假设您知道谁在实现该包名称,并且完全有可能与其他应用程序不同即使您在 Play 商店中拥有该名称,您也希望通过侧面加载进行安装。

    【讨论】:

    • 是的,就我而言,我可以保证这些应用程序是我所知道的。我们正在构建一个自定义的 android 设备,并且禁用了侧载。
    【解决方案2】:

    文档说setPackage 是在 API 级别 4 中引入的,但可能存在框架更改,使其在 ICS 中的功能不同/更好。如何创建自己的Intent Filter 让您的接收者能够识别? this page 底部附近的记事本示例显示了一个示例:在清单中,NoteEditor 示例指定

    <action android:name="com.android.notepad.action.EDIT_NOTE" />

    这是应用定义的自定义操作。

    【讨论】:

    • 问题在于任何应用程序都可以定义具有相同操作的意图过滤器。而 setPackage 实际上会将其限制为应用程序包,我可以肯定不会有任何欺骗(在我的特定上下文中)
    【解决方案3】:

    由于广播是由系统处理的,我无法想象有任何方法可以在不触及系统代码的情况下在变通方案中进行编码(因此兼容性包无济于事)。

    如果您真的对保证广播的安全感兴趣,可以使用权限遵循 Android 文档对 pr​​e-Android 4.0 的建议:

    要在发送时强制执行权限,请向sendBroadcast(Intent, String)sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle) 提供非空权限参数。只有被授予此权限的接收者(通过在其 AndroidManifest.xml 中使用标签请求)才能接收广播。

    【讨论】:

    • 据我所知,没有办法在广播者中创建自定义权限,以了解 setPackage 所针对的应用程序。我注意到有一种请求权限的方法,但我很确定这是操作系统级别的事情,或者您是否知道我的应用程序可以响应这些请求并授予/拒绝访问我的自定义定义权限?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多