exported needs to be explicitly specified for <activity>

Error:android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

這個(gè)錯(cuò)誤是由于 Android 12(API 31)及以上版本 的新規(guī)范導(dǎo)致的:當(dāng) Activity、Service、Receiver 等組件聲明了 <intent-filter> 時(shí),必須顯式指定 android:exported 屬性(值為 truefalse),否則編譯會(huì)失敗。
修復(fù)方法:為帶 <intent-filter> 的組件添加 android:exported

  • 步驟 1:定位問(wèn)題組件

AndroidManifest.xml 中找到所有聲明了 <intent-filter><activity> 標(biāo)簽(錯(cuò)誤提示已明確是 <activity>)。

  • 步驟 2:添加 android:exported 屬性

根據(jù)組件是否需要被 其他應(yīng)用啟動(dòng) 來(lái)設(shè)置值:

android:exported="true"允許被其他應(yīng)用啟動(dòng)(如 launcher 主頁(yè)面 Activity,通常帶有 ACTION_MAINCATEGORY_LAUNCHERintent-filter)。
android:exported="false"僅允許應(yīng)用內(nèi)部啟動(dòng),不允許被其他應(yīng)用訪問(wèn)(如普通頁(yè)面 Activity,即使有 intent-filter 也建議設(shè)為 false,除非明確需要外部調(diào)用)。

  • 示例(修復(fù)前后對(duì)比)
  • 錯(cuò)誤寫法(缺少 android:exported):
<activity
    android:name=".MainActivity">
    <!-- 有 intent-filter 但未指定 exported -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".ShareActivity">
    <!-- 有 intent-filter 但未指定 exported -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>
  • 正確寫法(添加 android:exported):
<!-- 主頁(yè)面 Activity(允許被系統(tǒng) launcher 啟動(dòng),設(shè)為 true) -->
<activity
    android:name=".MainActivity"
    android:exported="true"> <!-- 顯式指定 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<!-- 分享頁(yè)面 Activity(僅內(nèi)部使用,設(shè)為 false) -->
<activity
    android:name=".ShareActivity"
    android:exported="false"> <!-- 顯式指定 -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>
  • 關(guān)鍵說(shuō)明

僅對(duì)有 <intent-filter> 的組件生效:如果組件沒(méi)有聲明 <intent-filter>,android:exported 可以省略(默認(rèn)值為 false)。
Launcher Activity 必須設(shè)為 true:帶有 ACTION_MAIN + CATEGORY_LAUNCHERActivity 是應(yīng)用入口,需要被系統(tǒng) launcher 啟動(dòng),因此必須設(shè)為 android:exported="true"。
其他組件(Service/Receiver)同理:如果 ServiceReceiver 聲明了<intent-filter>targetSdkVersion ≥ 31,也需要添加 android:exported(例如推送服務(wù)的 Receiver)。

  • 總結(jié)

修復(fù)核心就是:給所有帶<intent-filter><activity>顯式添加 android:exported 屬性,根據(jù)是否需要被外部訪問(wèn)設(shè)置 truefalse。修改后重新編譯即可解決錯(cuò)誤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容