安卓運行時權(quán)限的申請流程

本文結(jié)合代碼和圖示來展示安卓運行時權(quán)限的申請流程:

title

安卓中,運行時權(quán)限的核心就是需要在程序運行的過程當中,去判斷用戶是否對我們授權(quán)以允許相關(guān)操作。
開始之前,先貼上動圖看看效果:

動圖演示

其實,在代碼層面,安卓已經(jīng)為我們封裝好了實現(xiàn)的方法。
我們只需要調(diào)用這些方法就可以了。
所以最重要的是這一流程的邏輯。

既然是要得到授權(quán)。

第一步,就是要判斷用戶是否已經(jīng)給過授權(quán)了。

這一步可以借助于Contextcompat.checkSelfPermission()方法。
此方法接收兩個參數(shù):

1. context對象
2. 具體想要獲得授權(quán)的權(quán)限名稱,如打電話的權(quán)限就是Manifest.permission.CALL_PHONE

然后使用該方法的返回值和PackageManager.PERMISSION_GRANTED作比較。
如果相等,則說明用戶已經(jīng)授權(quán);若不等,就表示用戶沒有授權(quán)。

第二步,如果用戶沒有授權(quán),就需要申請用戶授權(quán):

調(diào)用ActivityCompat.requestPermissions()方法來向用戶申請授權(quán)。
其中,ActivityCompat.requestPermissions()方法接收三個參數(shù):

1. Activity的實例
2. String類型的數(shù)組,我們把要申請的權(quán)限的權(quán)限名放入其中即可
3. 請求碼:只要是唯一值即可:比如傳入1
第三步,在調(diào)用完ActivityCompat.requestPermissions()方法之后,系統(tǒng)會彈出對話框來提示用戶是否對該權(quán)限授權(quán)。用戶既可以選擇同意,也可以選擇拒絕。

但是無論用戶怎么選擇,
最終的結(jié)果都會回調(diào)到onRequestPermissionResult()方法中。
而授權(quán)的結(jié)果則會封裝在grantResults參數(shù)中。

第四步,判斷最后的授權(quán)結(jié)果,如果用戶同意則執(zhí)行邏輯。

如果用戶不同意,則只能放棄操作,并彈出授權(quán)失敗的提示。

當然,文字表述不利于清楚地表現(xiàn)其中的邏輯。

這里貼出對應的流程圖,作為補充:
運行時權(quán)限的相關(guān)操作
下面再貼出在具體代碼中的應用:
public class MainActivity extends AppCompatActivity {
//定義按鈕
    Button makeCall;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        makeCall = (Button) findViewById(R.id.bn_make_call);
//為按鈕設置事件監(jiān)聽器
        makeCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//先檢查用戶有沒有同意權(quán)限申請
//用戶未曾授權(quán),則請求授權(quán)
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, 
new String[]{Manifest.permission.CALL_PHONE}, 
1);
                } else {//已經(jīng)授權(quán) 則執(zhí)行相應邏輯
                    call(); //call()方法中封裝了打電話的邏輯
                }
            }
        });
    }
//打電話方法的邏輯
    public void call() {
        try {
//發(fā)送一個隱式的Intent
            Intent intent = new Intent(Intent.ACTION_CALL);
//設置協(xié)議為 tel 
            intent.setData(Uri.parse("tel:1234567890"));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
           @NonNull String[] permissions, 
           @NonNull int[] grantResults) 
    {
        super.onRequestPermissionsResult(requestCode, 
permissions, grantResults);
//這里的requestCode與我們之前
//在requestPermission()方法中傳入的請求碼對應
        switch (requestCode){
            case 1:
//授權(quán)結(jié)果被封裝在grantResults中,注意其為int類型的數(shù)組
//用戶授權(quán),則執(zhí)行相應操作
                if (grantResults.length >0 && 
grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    call();
                }else{
//用戶拒絕授權(quán),則只能放棄,并彈出提示
                    Toast.makeText(this,
"You denied the permission",
Toast.LENGTH_SHORT).show();
                }
                break;
                default:
        }

    }
}

諸君共勉:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容