1. 程式人生 > >Android 幾行程式碼解決6.0以上許可權適配問題

Android 幾行程式碼解決6.0以上許可權適配問題

APK

將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.使用者同意了授權,閒的難受去關閉了授權

5.gif

使用方法:

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群 這裡寫圖片描述