Android開發——本地存儲、用戶權限獲取

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中對按鈕進行監聽,處理事務

  1. 找到按鈕 permissionBtn
  2. 對該按鈕進行監聽
  3. 監聽內部點擊事件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();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章