Android:对主要 Activity 设置自定义权限 - 不好的做法?

标签 android android-intent android-activity android-manifest android-permissions

我有一个运行 webview 的简单应用程序,我希望其他应用程序可以启动它,发送一些我将包含在 URL 字符串中的参数。

为了实现这一点,我在主 Activity 上创建了一个新的 Intent 过滤器来配合主/启动器 Intent 过滤器,如下所示:

        <intent-filter>
            <action android:name="com.mycompany.myapp.intents.START_APP" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

到目前为止一切顺利,但是有一个转折点。 我想保护此 Activity 不被任何人运行 - 我只希望它由具有定义自定义权限的相同签名的其他应用程序运行。为此,我为应用程序创建了一个自定义权限,如下所示:

<permission
    android:name="com.mycompany.myapp.mycustompermission"
    android:protectionLevel="signature" />

在我添加的 Activity 中:

            android:permission="com.mycompany.myapp.mycustompermission"

这导致在从 APK 安装和从安装程序启动时出现以下错误:

E/AndroidRuntime(6702): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.mycompany.myapp cmp=com.mycompany.myapp/.myActivity } from ProcessRecord{41517d20 6702:com.android.packageinstaller/u0a56} (pid=6702, uid=10056) requires com.mycompany.myapp.mycustompermission

屏幕上显示一条消息:

Unfortunately, Package installer has stopped

我的猜测是,这是因为从 intent 启动应用程序的 Activity 不能是主要 Activity,而必须是一个单独的 Activity,但我在网上找不到任何证明这一点的东西。

我的问题是 - 你知道这是真的吗 - 我应该永远不要对应用程序的主要(可启动) Activity 设置自定义签名级别权​​限吗?

最佳答案

should I never put a custom signature level permission on the main (launchable) activity of the application?

是的,除非您是主屏幕或其他启动器的作者并且可以确保它拥有自定义权限。不然你还不如把MAIN拿掉/LAUNCHER <intent-filter> ,因为它宣传的东西(“嘿,发射我!”)通常不是真的。

关于Android:对主要 Activity 设置自定义权限 - 不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126687/

相关文章:

java - OnClick 用 fragment 替换 RecyclerView 中的 View

android - 在检索联系电话时使用 getColumnIndex() 获取 -1 - Android

android - 是否有为所有用户卸载应用程序的 Intent ?

android - 以编程方式滚动到 android 中的最后一个 View

android - 一旦安装了应用程序或在安装应用程序后收到 Intent 时,让一些代码工作,如 AndroidLost

android - 如何知道 BroadcastReceiver 中的飞行模式是打开还是关闭?

android - New Intent() 使用 Android : launchMode ="singleTop" 启动新实例

android - Activity 在 Nexus 7 上失败,但在 Nexus 4 和 5 上运行良好

java - 在三个 Activity 之间发送数据

android - 导航到下一个 Activity 时更改操作栏颜色及其文本对齐方式