繁体   English   中英

错误:java.lang.SecurityException:权限拒绝:以另一种方式启动Intent

[英]Error: java.lang.SecurityException: Permission Denial: starting Intent with another flavor

我正在开发具有2种口味的应用程序,免费和专业。 免费似乎工作正常,但是当我尝试从首选项活动设置转到活动名称时,出现此错误:

-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通过以下方式访问活动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活动的唯一方法。

最后,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在他的回答中告诉他的事情后,它确实起作用了。 仅当我安装了免费版本时,活动NameList才起作用。

如果我尝试仅使用专业版访问活动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)

它说即使我在清单(清单在主目录中)中也找不到活动NameList:

        <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
        android:action="android.intent.action.VIEW"
        android:targetPackage="com.albertoha94.apps.DuelHelperReloaded"
        android:targetClass="com.albertoha94.apps.DuelHelperReloaded.NameList"/>

该意图将尝试从免费应用程序打开活动(两个应用程序中的类名和操作相同,但targetPackage限制意图仅打开免费版本)
->因此,从专业版应用程序打开时,如果不安装免费应用程序,则将出现权限错误(由于不同的过程)或activitynotfound

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM