本文結(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:
}
}
}
諸君共勉:)