Android權限申請完全解析(一):Android自帶的權限申請


1.為什么要權限申請

6.0以上就需要了,別問為什么。(不是重點,自行搜索)

2.如何進行權限申請

  1. Android自帶的權限申請
  2. EasyPermission權限申請

Ps:EasyPermission還沒開始玩,下次玩透了寫博客。

3.權限申請的具體寫法

3.1 假設有一個需要權限才能運行的方法

    /**
     * 假設這是一個需要權限才能運行的方法
     */
    private void PermissionTest() {
        Toast.makeText(this, "這是一個需要權限才能運行的方法!", Toast.LENGTH_SHORT).show();
    }

3.2 申請單個權限,比如說:打電話

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "You clicked Button1", Toast.LENGTH_SHORT).show();
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    // 不相等 請求授權
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    PermissionTest();
                }
            }
        });

權限申請的時候,需要判斷是否已經有權限了,如果有,則直接運行,沒有的話在進入權限申請。單個權限比較簡單。Activity.requestPermissions的方法需要三個參數,第一個:Context,第二個:傳入需要申請的權限(可多個),第三個:請求代碼(用於回調處理)

3.2 申請多個權限

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "You clicked Button2", Toast.LENGTH_SHORT).show();
                //一次申請兩個權限的寫法,當然判斷的時候有一個權限沒有申請的時候無法執行當前方法
                if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO)!= PackageManager.PERMISSION_GRANTED  ||
                        ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
                }
                else{
                    PermissionTest();
                }
            }
        });
        

一次申請兩個權限的寫法(多個權限類似,多加幾個恍恍惚惚),當然,判斷的時候有一個權限沒有申請的時候無法執行當前方法。

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);

傳入需要申請的權限,這里申請錄音和寫存儲卡的方法。請求代碼傳入2

3.3 回調處理

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG, "onRequestPermissionsResult: " +
                            "電話權限申請成功");
                    for (int i : grantResults) {
                        Log.d(TAG, "onRequestPermissionsResult: " + i);
                    }
                    PermissionTest();
                }
                else {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            case 2:
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
                    Log.d(TAG, "onRequestPermissionsResult: " +
                            "權限申請成功");
                    PermissionTest();
                }
                else{
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

說明:請求代碼的窗口跳出,用戶點擊之后,每個權限就能夠判斷是否申請成功了。

分支語句switch(requestCode),每一個case就是之前傳入的請求碼

case1 說明:
單個權限已經被申請,判斷方法,grantResult數組長度大於0,grantResult數組的第一項的值等於PackageManager.PERMISSION_GRANTED (其實就是0,沒有被授權的話值等於-1)。然后執行PermissionTest方法。

case2 說明:
和case1一樣,先判斷grantResult數組長度大於0,grantResult數組的第一二兩項是否等於PackageManager.PERMISSION_GRANTED(因為只有兩個選項所以我就直接寫了),權限申請之完畢之后就能夠運行PermissionTest()方法了。

case2的判斷語句可改進:定一個isAllGranted,掃一遍grantRsult,就好了

    Boolean isAllGranted = true;
    for (int permission : grantResults) {
         if (permission != PackageManager.PERMISSION_GRANTED){
            isAllGranted = false;
         }
    }

Ps:測試了一下,grantResults.length > 0 好像可以不用寫。。。汗。。

結束語

權限申請之前一直懵逼,看了書之后還是不怎么會寫,真到要用的時候心里一直怕怕的。今天剛好放假,所以花了一些時間來寫這篇博客。這應該是我第一篇真正的Android博客了吧。下次更新Easy的使用。

歡迎大家觀看,需要幫助可以留言。相遇就是緣分!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM