android 6.0以后增加一個重要的適配察滑,動態(tài)運行權(quán)限打厘,之前我都是采用一些第三方庫:PermissionsDispatcher;沒啥大問題就是覺得膈應贺辰,閑了還是自己動手封裝一下:
總體實現(xiàn)過程:
1户盯,BaseActivity中加入權(quán)限判斷以及申請。
2饲化,需要權(quán)限的activity重寫B(tài)aseActivity中onCall()方法來獲得權(quán)限成功后要做的事情莽鸭。
下面開始具體的實現(xiàn)的過程:
比如說我們先要獲得相機這個權(quán)限:
1,清單文件中先申明吃靠。
image
2硫眨,調(diào)用BaseActivity中的setPermission(String permission),方法,
3巢块,重寫B(tài)aseActivity的onCall(String permission)的方法礁阁。
image
那么BaseActivity 中是如何封裝的呢巧号?
image
申請權(quán)限的回調(diào)
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 0 || requestCode == 1){//requestCode = 0 表示申請單個重要權(quán)限 = 1 為同時申請多個權(quán)限 一般來說不太重要
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1){
if (shouldShowRequestPermissionRationale(permissions[i])) {
/**
* 用戶拒絕后的操作,這里我們繼續(xù)提醒用戶申請權(quán)限(除非是特別特別重要的權(quán)限姥闭,否則不要這樣做5ず琛)
*/
if (requestCode == 0){
ActivityCompat.requestPermissions(this,new String[]{permissions[i]},0);
}else{
Toast.makeText(BaseActivity.this, "權(quán)限被拒絕: "+permissions[i], Toast.LENGTH_SHORT).show();
}
}else{
if (requestCode == 0){
/**
* 用戶多次拒絕權(quán)限并設置了不再提醒,那么只能提醒用戶去設置頁面打開我們的權(quán)限了(除非是特別特別重要的權(quán)限棚品,否則不要這樣做2犯摺)
*/
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("說明");
builder.setMessage("沒有權(quán)限將無法使用APP,打開設置頁面放開權(quán)限");
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/**
* 這里使用了第三方庫,用于打開應用的權(quán)限設置頁面(有各種手機廠商的適配)
* author : Senh Linsh
* github : https://github.com/SenhLinsh
*/
Utils.init(BaseActivity.this);
IntentUtils.gotoPermissionSetting();
// Intent intent = new Intent();
// intent.setAction(Settings.ACTION_SETTINGS);
// startActivity(intent);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(BaseActivity.this, "無法使用APP", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}else{
Toast.makeText(BaseActivity.this, "權(quán)限被拒絕: "+permissions[i], Toast.LENGTH_SHORT).show();
}
}
}else if(requestCode == 0){
onCall(permissions[i]);
}
}
if (requestCode == 1){
onCall("");
}
}
else{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
這樣就算是簡單的封裝完成啦~當然這里還有多權(quán)限申請的方法:
/**
* 檢查多個申請權(quán)限
* @param permissionsArray
*/
public void setPermissionGroup(String[] permissionsArray){
permissionsList = new ArrayList<String>();
if (Build.VERSION.SDK_INT>23){
for (String permission : permissionsArray) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
}
}
if (permissionsList.size() == 0){
onCall("");
}else{
ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]), 1);
}
}else{
onCall("");
}
}