本文結(jié)合代碼和圖示來(lái)展示安卓運(yùn)行時(shí)權(quán)限的申請(qǐng)流程:
安卓中集惋,運(yùn)行時(shí)權(quán)限的核心就是需要在程序運(yùn)行的過(guò)程當(dāng)中,去判斷用戶是否對(duì)我們授權(quán)以允許相關(guān)操作。
開(kāi)始之前鱼填,先貼上動(dòng)圖看看效果:
其實(shí),在代碼層面毅戈,安卓已經(jīng)為我們封裝好了實(shí)現(xiàn)的方法苹丸。
我們只需要調(diào)用這些方法就可以了。
所以最重要的是這一流程的邏輯苇经。
既然是要得到授權(quán)谈跛。
第一步,就是要判斷用戶是否已經(jīng)給過(guò)授權(quán)了塑陵。
這一步可以借助于Contextcompat.checkSelfPermission()方法感憾。
此方法接收兩個(gè)參數(shù):
1. context對(duì)象
2. 具體想要獲得授權(quán)的權(quán)限名稱(chēng),如打電話的權(quán)限就是Manifest.permission.CALL_PHONE
然后使用該方法的返回值和PackageManager.PERMISSION_GRANTED作比較令花。
如果相等阻桅,則說(shuō)明用戶已經(jīng)授權(quán);若不等兼都,就表示用戶沒(méi)有授權(quán)嫂沉。
第二步,如果用戶沒(méi)有授權(quán)扮碧,就需要申請(qǐng)用戶授權(quán):
調(diào)用ActivityCompat.requestPermissions()方法來(lái)向用戶申請(qǐng)授權(quán)趟章。
其中,ActivityCompat.requestPermissions()方法接收三個(gè)參數(shù):
1. Activity的實(shí)例
2. String類(lèi)型的數(shù)組慎王,我們把要申請(qǐng)的權(quán)限的權(quán)限名放入其中即可
3. 請(qǐng)求碼:只要是唯一值即可:比如傳入1
第三步蚓土,在調(diào)用完ActivityCompat.requestPermissions()方法之后,系統(tǒng)會(huì)彈出對(duì)話框來(lái)提示用戶是否對(duì)該權(quán)限授權(quán)赖淤。用戶既可以選擇同意蜀漆,也可以選擇拒絕。
但是無(wú)論用戶怎么選擇咱旱,
最終的結(jié)果都會(huì)回調(diào)到onRequestPermissionResult()方法中确丢。
而授權(quán)的結(jié)果則會(huì)封裝在grantResults參數(shù)中绷耍。
第四步,判斷最后的授權(quán)結(jié)果鲜侥,如果用戶同意則執(zhí)行邏輯褂始。
如果用戶不同意,則只能放棄操作描函,并彈出授權(quán)失敗的提示病袄。
當(dāng)然,文字表述不利于清楚地表現(xiàn)其中的邏輯赘阀。
這里貼出對(duì)應(yīng)的流程圖益缠,作為補(bǔ)充:
下面再貼出在具體代碼中的應(yīng)用:
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);
//為按鈕設(shè)置事件監(jiān)聽(tīng)器
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//先檢查用戶有沒(méi)有同意權(quán)限申請(qǐng)
//用戶未曾授權(quán),則請(qǐng)求授權(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í)行相應(yīng)邏輯
call(); //call()方法中封裝了打電話的邏輯
}
}
});
}
//打電話方法的邏輯
public void call() {
try {
//發(fā)送一個(gè)隱式的Intent
Intent intent = new Intent(Intent.ACTION_CALL);
//設(shè)置協(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()方法中傳入的請(qǐng)求碼對(duì)應(yīng)
switch (requestCode){
case 1:
//授權(quán)結(jié)果被封裝在grantResults中基公,注意其為int類(lèi)型的數(shù)組
//用戶授權(quán)幅慌,則執(zhí)行相應(yīng)操作
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:
}
}
}
諸君共勉:)