Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码
生活随笔
收集整理的這篇文章主要介紹了
Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
感覺這個權限申請類寫的比較好。
使用方法:activity直接繼承就可以了。
看下mainactivity.java
package com.qfy.permissiondemo;import android.os.Bundle;public class MainActivity extends CheckPermissionsActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} }?
再來看下申請權限的CheckPermissionsActivity.java
?
/****/ package com.qfy.xiayiyemap;import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.view.KeyEvent;import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List;/*** 繼承了Activity,實現Android6.0的運行時權限檢測* 需要進行運行時權限檢測的Activity可以繼承這個類** @author hongming.wang* @創建時間:2016年5月27日 下午3:01:31* @項目名稱: AMapLocationDemo* @文件名稱:PermissionsChecker.java* @類型名稱:PermissionsChecker* @since 2.5.0*/ public class CheckPermissionsActivity extends Activity {/*** 需要進行檢測的權限數組*/protected String[] needPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE};private static final int PERMISSON_REQUESTCODE = 0;/*** 判斷是否需要檢測,防止不停的彈框*/private boolean isNeedCheck = true;@Overrideprotected void onResume() {super.onResume();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {if (isNeedCheck) {checkPermissions(needPermissions);}}}/*** @param permissions* @since 2.5.0*/private void checkPermissions(String... permissions) {try {if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {List<String> needRequestPermissonList = findDeniedPermissions(permissions);if (null != needRequestPermissonList&& needRequestPermissonList.size() > 0) {String[] array = needRequestPermissonList.toArray(new String[needRequestPermissonList.size()]);Method method = getClass().getMethod("requestPermissions", new Class[]{String[].class, int.class});method.invoke(this, array, PERMISSON_REQUESTCODE);}}} catch (Throwable e) {}}/*** 獲取權限集中需要申請權限的列表** @param permissions* @return* @since 2.5.0*/private List<String> findDeniedPermissions(String[] permissions) {List<String> needRequestPermissonList = new ArrayList<String>();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {try {for (String perm : permissions) {Method checkSelfMethod = getClass().getMethod("checkSelfPermission", String.class);Method shouldShowRequestPermissionRationaleMethod = getClass().getMethod("shouldShowRequestPermissionRationale",String.class);if ((Integer) checkSelfMethod.invoke(this, perm) != PackageManager.PERMISSION_GRANTED|| (Boolean) shouldShowRequestPermissionRationaleMethod.invoke(this, perm)) {needRequestPermissonList.add(perm);}}} catch (Throwable e) {}}return needRequestPermissonList;}/*** 檢測是否所有的權限都已經授權** @param grantResults* @return* @since 2.5.0*/private boolean verifyPermissions(int[] grantResults) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}@TargetApi(23)public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] paramArrayOfInt) {if (requestCode == PERMISSON_REQUESTCODE) {if (!verifyPermissions(paramArrayOfInt)) {showMissingPermissionDialog();isNeedCheck = false;}}}/*** 顯示提示信息** @since 2.5.0*/private void showMissingPermissionDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(R.string.notifyTitle);builder.setMessage(R.string.notifyMsg);// 拒絕, 退出應用builder.setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}});builder.setPositiveButton(R.string.setting,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startAppSettings();}});builder.setCancelable(false);builder.show();}/*** 啟動應用的設置** @since 2.5.0*/private void startAppSettings() {Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent.setData(Uri.parse("package:" + getPackageName()));startActivity(intent);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {this.finish();return true;}return super.onKeyDown(keyCode, event);}}這個類還有個好處,就是不需要繼承appcompatActivity,如果寫demo用到權限申請這個類無疑是最好的選擇!因為不需要繼承appcompatActivity類可以讓apk包非常小。如下圖;
如果看不懂,我直接提供一份源碼。大佬勿噴。
點擊下載
總結
以上是生活随笔為你收集整理的Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码的全部內容,希望文章能夠幫你解決所遇到的問題。