Android Permissions Request

在 Android 6 (API 23, M) 之後,
除了在AndroidManifest中宣告權限之外,
還必須在程式中動態請求權限。

Permissions Request

相關API如下:

//檢查是否已取得權限
ActivityCompat.checkSelfPermission
//確認是否已在請求權限中
ActivityCompat.shouldShowRequestPermissionRationale
//請求權限
ActivityCompat.requestPermissions

首先在AndroidManifest.xml中宣告權限。

AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nickthomas55.camera.facedetect">

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

<application>
...
</application>
</manifest>

在onCreate時,檢查是否已取得權限。

MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

int rc = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (rc == PackageManager.PERMISSION_GRANTED) {
//do something
} else {
//請求權限
requestPermissions();
}
}

可將所有需要的權限,命名一個String Array,之後做一次性的請求。

MainActivity.java
1
2
3
4
5
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};

先利用ActivityCompat.shouldShowRequestPermissionRationale檢查現在是否已經在請求中。
若應用程式沒有在請求時,我們再向系統請求權限。

MainActivity.java
1
2
3
4
5
6
private void requestPermissions() {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, RC_HANDLE_CAMERA_PERM);
return;
}
}

執行結果

取得權限後,我們可由 Settings -> Apps -> 您的應用程式名稱 -> Permissions 中,查看並管理權限。

作者

Nick Lin

發表於

2018-07-12

更新於

2023-01-18

許可協議


評論