将libray子產品複制到項目中,或者直接在build.gradle中依賴:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.AnJiaoDe:Permission:V1.0.0'
}
注意:如果sync報錯,是因為和com.android.tools.build:gradle 3.0有關,
可以改将compile改為implementation 或者api
Android 6.0以上,危險權限必須經過動态請求,危險權限分組圖
1.全部允許
2.拒絕
3.拒絕
4.使用者拒絕并且選中了不再詢問,彈窗讓使用者去授權
5.使用者同意了授權,閑的難受去關閉了授權
使用方法:
public class MainActivity extends PermissionActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkPermissionCAMERA(new OnPermissionRequestListener() {
@Override
public void onPermissionHave() {
showToast("使用者同意了相機權限");
checkPermissionWRITE_EXTERNAL_STORAGE(new OnPermissionRequestListener() {
@Override
public void onPermissionHave() {
showToast("使用者同意了存儲權限,可以執行拍照操作了");
}
@Override
public void onPermissionRefuse() {
showToast("使用者拒絕了存儲權限");
}
@Override
public void onPermissionRefuseNoAsk() {
showToast("使用者拒絕了存儲權限并且選中了不再詢問");
}
});
}
@Override
public void onPermissionRefuse() {
showToast("使用者拒絕了相機權限");
}
@Override
public void onPermissionRefuseNoAsk() {
showToast("使用者拒絕了相機權限并且選中了不再詢問");
}
});
}
});
//或者
// checkPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
// "存儲權限已被禁用","拍照功能必須打開存儲權限,否則無法使用", new OnPermissionRequestListener() {
//
// @Override
// public void onPermissionHave() {
//
// showToast("使用者同意了存儲權限");
//
//
// }
//
// @Override
// public void onPermissionRefuse() {
// showToast("使用者拒絕了存儲權限");
//
// }
//
// @Override
// public void onPermissionRefuseNoAsk() {
// showToast("使用者拒絕了存儲權限并且選中了不再詢問");
//
// }
// });
}
@Override
public void onClick(View v) {
}
}
源碼:
public abstract class PermissionActivity extends AppCompatActivity implements View.OnClickListener {
private String toast_perm_refuse,dialog_perm_refuse_noask;
private OnPermissionRequestListener onPermissionHaveListener;
public <T extends View> T getViewByID(@IdRes int id) {
return (T) findViewById(id);
}
//??????????????????????????????????????????????????????????????????????
public String nullToString(Object object) {
return object == null ? "" : object.toString();
}
//??????????????????????????????????????????????????????????????????????
public void showToast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
public void showToast(int string_id) {
Toast.makeText(this, getResources().getString(string_id), Toast.LENGTH_SHORT).show();
}
public void startAppcompatActivity(Class<?> cls) {
startActivity(new Intent(this, cls));
}
/*
6.0權限檢查存儲權限
*/
public void checkPermissionWRITE_EXTERNAL_STORAGE( OnPermissionRequestListener onPermissionHaveListener) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
this.toast_perm_refuse = "存儲權限已被禁用";
this.dialog_perm_refuse_noask="存儲權限被禁用,您将無法使用相機、相冊、圖檔下載下傳等功能";
this.onPermissionHaveListener = onPermissionHaveListener;
}
/*
6.0權限檢查相機權限
*/
public void checkPermissionCAMERA( OnPermissionRequestListener onPermissionHaveListener) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
this.toast_perm_refuse = "相機權限已被禁用";
this.dialog_perm_refuse_noask="相機權限被禁用,您将無法使用相機進行拍照";
this.onPermissionHaveListener = onPermissionHaveListener;
}
/*
6.0權限檢查
*/
public void checkPermission(String[] permission, String toast_perm_refuse,String dialog_perm_refuse_noask, OnPermissionRequestListener onPermissionHaveListener) {
ActivityCompat.requestPermissions(this, permission, 1);
this.toast_perm_refuse = toast_perm_refuse;
this.dialog_perm_refuse_noask=dialog_perm_refuse_noask;
this.onPermissionHaveListener = onPermissionHaveListener;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
if (onPermissionHaveListener != null) {
onPermissionHaveListener.onPermissionHave();
}
continue;
}
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
//在使用者已經拒絕授權的情況下,如果shouldShowRequestPermissionRationale傳回false則
// 可以推斷出使用者選擇了“不在提示”選項,在這種情況下需要引導使用者至設定頁手動授權
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
if (onPermissionHaveListener != null) {
onPermissionHaveListener.onPermissionRefuseNoAsk();
}
//解釋原因,并且引導使用者至設定頁手動授權
new AlertDialog.Builder(this)
.setMessage(dialog_perm_refuse_noask)
.setPositiveButton("去授權", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引導使用者至設定頁手動授權
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引導使用者手動授權,權限請求失敗
}
}).show();
} else {
//權限請求失敗,但未選中“不再提示”選項
showToast(toast_perm_refuse);
if (onPermissionHaveListener != null) {
onPermissionHaveListener.onPermissionRefuse();
}
}
break;
}
}
}
public interface OnPermissionRequestListener {
public void onPermissionHave();
public void onPermissionRefuse();
public void onPermissionRefuseNoAsk();
}
}
關注專題
Android開發常用開源庫 簡書