/** * */ package com.hdl.hdllinphonesdk.activity; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; 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可以继承这个类 * @文件名称:PermissionsChecker.java * @类型名称:PermissionsChecker * @since 2.5.0 */ public class LPCheckPermissionsActivity extends Activity { //是否需要检测后台定位权限,设置为true时,如果用户没有给予后台定位权限会弹窗提示 private boolean needCheckBackLocation = false; //如果设置了target > 28,需要增加这个权限,否则不会弹出"始终允许"这个选择框 private static String BACKGROUND_LOCATION_PERMISSION = "android.permission.ACCESS_BACKGROUND_LOCATION"; /** * 需要进行检测的权限数组 */ protected String[] needPermissions = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.WAKE_LOCK, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, }; public static final int PERMISSON_REQUESTCODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(Build.VERSION.SDK_INT > 28 && getApplicationContext().getApplicationInfo().targetSdkVersion > 28) { needPermissions = new String[] { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.WAKE_LOCK, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, }; } } /** * 判断是否需要检测,防止不停的弹框 */ public boolean isNeedCheck = true; public boolean havaPermissions = false; @Override protected void onResume() { super.onResume(); if (Build.VERSION.SDK_INT >= 23 && getApplicationInfo().targetSdkVersion >= 23) { if (isNeedCheck) { checkPermissions(needPermissions); } }else { havaPermissions = true; } } /** * * @param permissions * @since 2.5.0 * */ private void checkPermissions(String... permissions) { try { if (Build.VERSION.SDK_INT >= 23 && getApplicationInfo().targetSdkVersion >= 23) { List 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); }else { havaPermissions = true; } } } catch (Throwable e) { } } /** * 获取权限集中需要申请权限的列表 * * @param permissions * @return * @since 2.5.0 * */ private List findDeniedPermissions(String[] permissions) { List needRequestPermissonList = new ArrayList(); 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)) { if(!needCheckBackLocation && BACKGROUND_LOCATION_PERMISSION.equals(perm)) { continue; } needRequestPermissonList.add(perm); } } } catch (Throwable e) { } } return needRequestPermissonList; } /** * 检测是否所有的权限都已经授权 * @param grantResults * @return * @since 2.5.0 * */ public 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; // }else{ // //授权成功 // // } // } // } // /** // * 显示提示信息 // * // * @since 2.5.0 // * // */ // public void showMissingPermissionDialog() { // AlertDialog.Builder builder = new AlertDialog.Builder(this); // builder.setTitle(R.string.gd_notifyTitle); // builder.setMessage(R.string.gd_notifyMsg); // // // 拒绝, 退出应用 // builder.setNegativeButton(R.string.gd_cancel, // new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // finish(); // } // }); // // builder.setPositiveButton(R.string.gd_setting, // new DialogInterface.OnClickListener() { // @Override // public 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); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK){ this.finish(); return true; } return super.onKeyDown(keyCode, event); } public interface RequestPermissionsListener { /** * 授权成功 */ void onSuccess(); } private RequestPermissionsListener mRequestPermissionsListener; public void setRequestPermissionsListener(RequestPermissionsListener mRequestPermissionsListener) { mRequestPermissionsListener = mRequestPermissionsListener; } }