Android的邏輯存儲結構有三種
- 內部存儲結構 Internal Private Storage
- 外部私有存儲結構 External Private Storage
- 外部公有存儲結構 External Public Storage
權限內容區別如下
每次安裝APP,最初開始的時候都有一系列的獲取用戶權限的按鈕,包括地理位置,picture,movie等目錄。
Android要求獲取公共權限時,必須先要經過用戶的批准,下面是user-premission的過程
1、在AndroidManifest.xml中添加user-permission
外部存儲的寫的權限(可寫意味着可讀可寫,如果想要只讀,在這裏更改)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、彈出獲取權限的請求
定義一個按鈕,當用戶點擊這個按鈕的時候,彈出來系統獲取用戶權限允許的請求。
自行定義這個,很普通的一個按鈕控件
<Button
android:id="@+id/btn_request_permission"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:text="@string/request_storage_permission"
android:textAllCaps="false" />
3、在activity中對按鈕進行監聽,處理事務
- 找到按鈕 permissionBtn
- 對該按鈕進行監聽
- 監聽內部點擊事件OnClick
首先,我們需要檢測是否已經獲取了用戶權限
checkSelfPermission()源代碼如下,其實我們只需要知道兩個參數是什麼就行了。參數一:上下文環境,一般傳入的參數爲currActivity.this;參數二:被驗證的權限,之前在AndroidManifest中聲明的權限相對應
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
} else {
return context.checkPermission(permission, Process.myPid(), Process.myUid());
}
}
如果上述驗證成功,那麼沒有必要再進行用戶權限獲取,否則進行如下操作,requestPermissions(),三個參數。
第一個參數上下文關係;
第二個參數String數組的permission,意味着可以傳入多個permission請求
第三個參數請求碼,可以自行定義一個數字,將在之後用到
ActivityCompat.requestPermissions(activity, String[], int requestcode)
我的代碼中的部分
ActivityCompat.requestPermissions(DebugActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_STORAGE_PERMISSION);
到這裏,我們點擊了這個按鈕permissionBtn,那麼系統就會彈出一個權限框,這個框中的一系列內容就是我們申請的permission內容,自行聯想一下我們剛進入app的時候彈出來很多層權限申請,這裏我們只演示一個。
我們可以點擊允許或者拒絕,在英文中就是GRANT、DENY
用戶點擊的信息需要進行交互。
重寫onRequestPermissionsResult,這就是對用戶交互信息的處理的函數。
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
參數一:之前requestPermissions中傳入的第三個參數對應,起到定位的作用
參數二:申請的permission
參數三:用戶交互返回的結果
我的代碼
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissions.length == 0 || grantResults.length == 0) {
return;
}
if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) {
// for(int i=0;i<permissions.length;i++){
// String permisson = permissions[i];
// int grantResult = grantResults[i];
// Log.d("RequestPermission", permisson + ": " + grantResult);
// }
int state = grantResults[0];
if (state == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(DebugActivity.this, "permission granted",
Toast.LENGTH_SHORT).show();
} else if (state == PackageManager.PERMISSION_DENIED) {
Toast.makeText(DebugActivity.this, "permission denied",
Toast.LENGTH_SHORT).show();
}
}
}