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 屬性(值為 true 或 false),否則編譯會(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_MAIN 和 CATEGORY_LAUNCHER 的 intent-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_LAUNCHER 的 Activity 是應(yīng)用入口,需要被系統(tǒng) launcher 啟動(dòng),因此必須設(shè)為 android:exported="true"。
其他組件(Service/Receiver)同理:如果 Service 或 Receiver 聲明了<intent-filter> 且 targetSdkVersion ≥ 31,也需要添加 android:exported(例如推送服務(wù)的 Receiver)。
- 總結(jié)
修復(fù)核心就是:給所有帶<intent-filter> 的<activity>顯式添加 android:exported 屬性,根據(jù)是否需要被外部訪問(wèn)設(shè)置 true 或 false。修改后重新編譯即可解決錯(cuò)誤。