安卓6.0動態申請許可權
阿新 • • 發佈:2018-11-04
現在安卓6.0申請許可權的開原始碼也很多,但是不想專案裡引用的東西太多,能不搬的就不搬了,自己寫了一個申請許可權的,在Gerymontion上測試,還能用,如果有需要改善的,請留言.
1 寫一個介面
public interface PermissionListener { //有許可權或者申請的時候給了,就繼續做下面的動作 void hasPermission() ; //沒有許可權 void hasNoPermission() ; //點了不再提示 void neverShowPermission(); }
2 寫一個申請的工具類
public enum PermissionUtil { INSTRANSE ; private PermissionListener permissionListener ; //請求許可權 public void responsePermission(AppCompatActivity appCompatActivity ,PermissionListener permissionListener, String... permissionName) { this.permissionListener3 假如使用者點了不再提示,提示使用者去設定(這個bug肯定是有的,自行解決,我們是特定的機型,所以不需要適配其他機型)= permissionListener; if (Build.VERSION.SDK_INT >= 23) { List<String> pList = new ArrayList<>(); for (String str : permissionName) { pList.add(str); } String[] strings = pList.toArray(new String[pList.size()]); boolean bb = checkPermissionAllGranted(appCompatActivity, strings); if(!bb) { //如果沒有,請求 ActivityCompat.requestPermissions(appCompatActivity, strings, Constants.permissionStr.permissionResponse); } else { //有許可權 permissionListener.hasPermission(); } }else{ //小於23,沒必要申請 permissionListener.hasPermission(); } } /** * 檢查APP是否擁有指定的所有許可權 */ protected boolean checkPermissionAllGranted(Context mContext, String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一個許可權沒有被授予, 則直接返回 false return false; } } return true; } public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults,AbstractActivity activity){ if (requestCode == Constants.permissionStr.permissionResponse) { if (PackageManager.PERMISSION_GRANTED == grantResults[0] ) { //給了許可權可以直接去操作 permissionListener.hasPermission(); } else { if(neverShow(permissions, activity)){ permissionListener.neverShowPermission(); }else{ permissionListener.hasNoPermission(); } } } } //在使用者已經拒絕授權的情況下,如果shouldShowRequestPermissionRationale返回false則 // 可以推斷出使用者選擇了“不在提示”選項,在這種情況下需要引導使用者至設定頁手動授權 private boolean neverShow(String permissions[], AbstractActivity activity){ boolean showagain ; if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[0])) { showagain = true ; }else{ showagain = false ; } return showagain ; } }
public enum DailogUtil { INSTRANS; public void getDailog(final AbstractActivity activity, final PermissionListener permissionListener) { new AlertDialog.Builder(activity) .setMessage("許可權都不給我,你還想使用APP嗎?去設定頁面手動授權再來吧!!!!") .setPositiveButton("去授權", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引導使用者至設定頁手動授權 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); //Constants.packageName 專案的包名,你可以寫死 Uri uri = Uri.fromParts("package", Constants.packageName, null); intent.setData(uri); activity.startActivity(intent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引導使用者手動授權,許可權請求失敗 permissionListener.hasNoPermission(); } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { //引導使用者手動授權,許可權請求失敗 permissionListener.hasNoPermission(); } }).show(); } }4 在申請的Activity裡面去申請
4.1 定義PermissionListener
PermissionListener permissionListener ;
4.2 初始化介面
permissionListener= new PermissionListener() { @Override public void hasPermission() { Log.e("MainActivity-->","申請成功"); // TODO: 2017/12/20 } @Override public void hasNoPermission() { Log.e("MainActivity-->","申請失敗"); // TODO: 2017/12/20 } @Override public void neverShowPermission() { Log.e("MainActivity-->","點選了不再提示"); DailogUtil.INSTRANS.getDailog(MainActivity.this , permissionListener ); } };
5 點選呼叫
case R.id.requestpermission: /** * Manifest.permission.WRITE_EXTERNAL_STORAGE; * Manifest.permission.WRITE_SETTINGS; * 定義成常量了 */ PermissionUtil.INSTRANSE.responsePermission(this, permissionListener, new String[]{ Constants.permissionStr.WRITE_EXTERNAL_STORAGE,Constants.permissionStr.Setting }); break;
5 重寫 onRequestPermissionsResult
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { PermissionUtil.INSTRANSE.onRequestPermissionsResult(requestCode,permissions,grantResults,this); }
6 打完收工