宣告應用程式權限

如「使用權限的工作流程」所述,如果應用程式要求應用程式權限,您就必須在應用程式的資訊清單檔案中宣告這些權限。有了這些宣告,應用程式商店和使用者就能瞭解應用程式或許會要求的權限組合。

要求權限的程序取決於權限類型:

新增宣告至應用程式資訊清單

如要宣告應用程式可能會要求的權限,請在應用程式資訊清單檔案中加入適當的 <uses-permission> 元素。舉例來說,應用程式如需存取相機,請在 AndroidManifest.xml 中加入以下這行程式碼:

<manifest ...>
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

宣告硬體為非必要元素

若是 CAMERA 等特定權限,則應用程式可存取部分 Android 裝置特有的硬體元件。如果應用程式宣告任一這類與硬體相關的權限,請考量應用程式能否在沒有該硬體的裝置上執行。在大多數情況下,硬體為選用元素,所以最好將 <uses-feature> 宣告中的 android:required 設為 false,將硬體宣告為選用元素,如 AndroidManifest.xml 檔案中的下列程式碼片段所示:

<manifest ...>
    <application>
        ...
    </application>
    <uses-feature android:name="android.hardware.camera"
                  android:required="false" />
<manifest>
敬上

判斷硬體是否存在

如果將硬體宣告為選用元素,則應用程序可在沒有該硬體的裝置上執行。如要檢查裝置是否具有特定硬體,請使用 hasSystemFeature() 方法,如下列程式碼片段所示。如果沒有該硬體,請在應用程式中妥善停用該功能。

Kotlin

// Check whether your app is running on a device that has a front-facing camera.
if (applicationContext.packageManager.hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

Java

// Check whether your app is running on a device that has a front-facing camera.
if (getApplicationContext().getPackageManager().hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

依 API 級別宣告權限

如要只在支援執行階段權限的裝置 (即搭載 Android 6.0 (API 級別 23) 或更高版本的裝置) 上宣告權限,請納入 <uses-permission-sdk-23> 元素,而非 <uses-permission>

使用上述任一元素時,您可以設定 maxSdkVersion 屬性,表明如果裝置搭載的 Android 版本高於指定值,則不需要特定權限。如此一來,就可以免除不必要的權限,同時為舊裝置提供相容性。

舉例來說,應用程式可能會顯示使用者在應用程式中建立的相片或影片等媒體內容。在此情況下,只要應用程式指定 Android 10 以上版本,在搭載 Android 10 (API 級別 29) 以上版本的裝置上,就不必使用 READ_EXTERNAL_STORAGE 權限。不過,如要與舊版裝置相容,您可以宣告 READ_EXTERNAL_STORAGE 權限,並將 android:maxSdkVersion 設為 28。