Android 幾行程式碼解決6.0以上許可權適配問題
阿新 • • 發佈:2018-12-11
將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(); } }
微信公眾號
QQ群