java - 错误 : java. lang.SecurityException:权限拒绝:以另一种风格启动 Intent

标签 java android android-intent securityexception android-productflavors

我正在开发一个有两种风格的应用程序:免费版和专业版。免费似乎工作正常,但是当我尝试从首选项 Activity 设置转到 Activity 名称时,出现此错误:

-12 00:41:49.473  18533-18533/com.albertoha94.apps.DuelHelperReloaded.Pro E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.albertoha94.apps.DuelHelperReloaded.Pro, PID: 18533
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.albertoha94.apps.DuelHelperReloaded/.NameList } from ProcessRecord{9f48ed8 18533:com.albertoha94.apps.DuelHelperReloaded.Pro/u0a59} (pid=18533, uid=10059) not exported from uid 10060
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2611)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1502)
        at android.app.Activity.startActivityForResult(Activity.java:3825)
        at android.app.Activity.startActivityForResult(Activity.java:3785)
        at android.app.Activity.startActivity(Activity.java:4100)
        at android.app.Activity.startActivity(Activity.java:4068)
        at android.preference.Preference.performClick(Preference.java:1012)
        at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:214)
        at android.widget.AdapterView.performItemClick(AdapterView.java:309)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3071)
        at android.widget.AbsListView$3.run(AbsListView.java:3899)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5401)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615)

我的模块的结构是这样的:

src
  -debug
      -java->package->Namelist
  -main
      -java->package->SettingsDuel
                      NameListStructure(A class that extends arrayAdapter, i use it to show the list in a format i want)
  -pro
      -layout->mainscreen(used in Dhmain)
  -prodebug
      -java->...DHMain
  -prorelease
      -java->...DHMain
  -release
      -java->...NameList

没有显示免费版本结构,因为我认为没有必要,它工作正常。

NameList 在发行版和调试版中都有,它们都有细微的更改,并且我创建了该目录,因此我不需要在 free/pro 目录中拥有副本。

DHMain 会根据其免费/专业版和调试/发布版而变化。

SettingsDuel 仅在 main 中,并且永远不会改变。

我通过这种方式通过 SettingsDuel 访问 Activity NameList:

<Preference
        android:enabled="true"
        android:title="@string/Names">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.albertoha94.apps.DuelHelperReloaded"
            android:targetClass="com.albertoha94.apps.DuelHelperReloaded.NameList"/>
    </Preference>

这是在主目录的 xml 文件中,它永远不会改变。这也是访问 NameList Activity 的唯一方法。

最后,appid 根据应用程序风格而变化(我认为这可能会导致问题,因为免费版本不会更改其 id 并且工作正常):

免费:

applicationId 'com.albertoha94.apps.DuelHelperReloaded'

亲:

applicationId 'com.albertoha94.apps.DuelHelperReloaded.Pro'

我尝试过以下方法:

-在 SettingsDuel 类中添加 android:exported="true"。

-在 NameList 类中添加 android:exported="true"。

-在两个类中添加 android:exported="true"。

-将类 NameList 添加到 pro 包(prodebug 和 proRelease)

-清理项目。

-重建项目。

此时我不知道还能尝试什么。

编辑:

按照 Minhtdh 在他的回答中所说的去做之后,它有点起作用了。仅当我安装了免费版本时, Activity 名称列表才有效。

如果我尝试仅使用专业版访问 Activity NameList,它会显示此错误:

    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.albertoha94.apps.DuelHelperReloaded/com.albertoha94.apps.DuelHelperReloaded.NameList}; have you declared this activity in your AndroidManifest.xml?
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1782)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
        at android.app.Activity.startActivityForResult(Activity.java:3825)
        at android.app.Activity.startActivityForResult(Activity.java:3785)
        at android.app.Activity.startActivity(Activity.java:4100)
        at android.app.Activity.startActivity(Activity.java:4068)
        at android.preference.Preference.performClick(Preference.java:1012)
        at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:214)
        at android.widget.AdapterView.performItemClick(AdapterView.java:309)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3071)
        at android.widget.AbsListView$3.run(AbsListView.java:3899)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5401)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615)

它说它无法找到 Activity NameList,即使我在 list 中有它( list 位于主目录中):

        <activity
        android:name=".NameList"
        android:label="@string/Names"
        android:exported="true">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.albertoha94.apps.DuelHelperReloaded.SettingsDuel" />
    </activity>

最佳答案

我认为您的问题是:您的专业版正在尝试在免费版本中启动服务。
从你的描述来看,我猜你只重建了专业版,对吗?
如果确实如此,您应该尝试以下操作:

  • 在 NameList 类中添加 android:exported="true"。
  • 然后重建并安装免费版本
  • 然后使用专业版运行并测试。

希望这有效。
更新
您的免费版本应用 ID 是 com.albertoha94.apps.DuelHelperReloaded
专业版是com.albertoha94.apps.DuelHelperReloaded.Pro
由于 SettingsDuel 首选项中的 Intent :

<intent
        android:action="android.intent.action.VIEW"
        android:targetPackage="com.albertoha94.apps.DuelHelperReloaded"
        android:targetClass="com.albertoha94.apps.DuelHelperReloaded.NameList"/>

该 Intent 将尝试从免费应用程序打开 Activity (两个应用程序中的类名称和操作相同,但 targetPackage 限制仅打开免费版本的 Intent )
-> 所以当从专业应用程序打开时,如果不安装免费应用程序,您将出现权限错误(由于不同的进程)或activitynotfound

如果您想从专业版打开 Activity,只需为每个应用使用不同的 targetPackage 即可。(对于专业版,请使用 android:targetPackage="com.albertoha94.apps.DuelHelperReloaded。专业版”)

关于java - 错误 : java. lang.SecurityException:权限拒绝:以另一种风格启动 Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31971527/

相关文章:

android - 解码后的位图会产生更大的尺寸

java - IntentService 中的路由 Intent

java - Option + Return 不会导入缺失的类 "creates test"

java - 无法从 Android Leanback 应用程序中的 VideoDetailsFragment 访问 getPackageManager GetActivityInfo

java - 如何在 Java Swing 中按下按钮时关闭窗口并打开一个新窗口

android - 安卓中的蓝牙

java - Android libGDX 在启动时随机崩溃

java - Android 共享文件,通过电子邮件或其他应用程序发送

android - 启动器和发送 Activity 的 Intent 过滤器

java - 我的模型不是在该服务器上注册的实体 Bean?