权限拒绝:启动意图

时间:2014-02-25 13:39:07

标签: android android-intent

我刚刚在Pro和Free版本中拆分了我的应用程序。因此,我使我的应用程序成为一个库并创建了两个新项目。 免费版本保留了namespace "com.mxp.time",专业版获得了namespace "com.sourcecastle.mytime"。 因此,免费版本与我的库具有相同的namespace。 一切正常,除非我在专业版中从偏好活动开始活动。 我得到了:

Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.mxp.time/.DataManagementActivity } from ProcessRecord{45461048 30784:com.sourcecastle.mytime/u0a10012} (pid=30784, uid=10012) not exported from uid 10013

我的Preferences.xml看起来像:

  <!-- datamanagement -->
<PreferenceCategory
    android:key="datamanagement_category"
    android:title="@string/settings_datamanagement_title" >
    <Preference
        android:summary="@string/settings_datamanagement_pref_message"
        android:title="@string/settings_datamanagement_pref_title" >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.mxp.time.DataManagementActivity"
            android:targetPackage="com.mxp.time" />
    </Preference>
</PreferenceCategory>

我的清单:

 <activity
        android:name="com.mxp.time.DataManagementActivity"
        android:exported="true"
        android:label="@string/datamanagement_title" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>
    </activity>

我已经设置了

  

“机器人:导出= “真”

在我的清单中,但我仍然有例外。

此外,我有一个普遍的问题:我现在应该在哪里定义我的活动?在图书馆或实际应用程序中? 我试图从我的库项目中删除所有权限和活动,我的应用程序继续工作。 但是因为我遇到了这个问题,我问自己这是不是一个安全问题,因为在我的应用程序中注册我的活动只能让我覆盖像“导出”这样的设置......

任何人都可以帮我理解吗?

更新:

这似乎有效:

  <!-- datamanagement -->
<PreferenceCategory
    android:key="datamanagement_category"
    android:title="@string/settings_datamanagement_title" >

    <!-- <Preference -->
    <!-- android:summary="@string/settings_datamanagement_pref_message" -->
    <!-- android:title="@string/settings_datamanagement_pref_title" > -->
    <!-- <intent -->
    <!-- android:action="android.intent.action.VIEW" -->
    <!-- android:targetClass="com.mxp.time.DataManagementActivity" -->
    <!-- android:targetPackage="com.mxp.time" /> -->
    <!-- </Preference> -->

    <PreferenceScreen
        android:summary="@string/settings_datamanagement_pref_message"
        android:title="@string/settings_datamanagement_pref_title" >
        <intent android:action="com.mxp.time.DataManagementActivity" />
    </PreferenceScreen>
</PreferenceCategory>

 <activity
        android:name="com.mxp.time.DataManagementActivity"
        android:exported="true"
        android:label="@string/datamanagement_title" >
        <intent-filter>
            <action android:name="com.mxp.time.DataManagementActivity" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

我的另一个问题是: Android Library Manifest vs. App Manifest

1 个答案:

答案 0 :(得分:1)

以这种方式宣布你的活动:

 <activity
        android:name="com.sourcecastle.commons.activity.DataManagementActivity"
        android:exported="true"
        android:label="@string/datamanagement_title" >
        <intent-filter>
            <action android:name="com.sourcecastle.commons.activity.DataManagementActivity" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

在preferences.xml中,按以下方式执行:

 <PreferenceCategory
    android:key="datamanagement_category"
    android:title="@string/settings_datamanagement_title" >
    <PreferenceScreen
        android:summary="@string/settings_datamanagement_message"
        android:title="@string/settings_datamanagement_title" >
        <intent android:action="com.sourcecastle.commons.activity.DataManagementActivity" />
    </PreferenceScreen>
</PreferenceCategory>

干杯, 斯蒂芬