1.為什么要權限申請
6.0以上就需要了,別問為什么。(不是重點,自行搜索)
2.如何進行權限申請
- Android自帶的權限申請
- 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的使用。
歡迎大家觀看,需要幫助可以留言。相遇就是緣分!