android6.0动态权限申请工具类
2017-07-31 17:27
411 查看
一、分析
android6.0后,仅在manifest.xml清单中配置相关权限时,如果将targetSdkVersion设置为23及以上,部分敏感权限需要动态申请后才能使用;如果不想处理6.0以上的适配,请将targetSdkVersion设置为22或以下;
这些敏感权限也是危险权限Dangerous-Permisson,能够获取到用户的隐私;
共9类
CALENDAR 日历 CAMERA 相机 CONTACTS 联系人 LOCATION 定位 MICROPHONE 麦克相关,比如录音 PHONE 手机状态 SENSORS 传感器 SMS 短信 STORAGE 存储权限
详细权限
group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA permission:android.permission.CAMERA group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
二、代码
权限工具类
public class PermissionUtil { /** * 是否需要检查权限 */ private static boolean needCheckPermission() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } /** * 获取sd存储卡读写权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getExternalStoragePermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } /** * 获取拍照权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getCameraPermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } /** * 获取麦克风权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getAudioPermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } /** * 获取定位权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getLocationPermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.ACCESS_COARSE_LOCATION); } /** * 获取读取联系人权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getContactsPermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.READ_CONTACTS); } /** * 获取发送短信权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getSendSMSPermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.SEND_SMS); } /** * 获取拨打电话权限 * * @return 是否已经获取权限,没有自动申请 */ public static boolean getCallPhonePermissions(@NonNull Activity activity, int requestCode) { return requestPerssions(activity, requestCode, Manifest.permission.CALL_PHONE); } public static List<String> getDeniedPermissions(@NonNull Activity activity, @NonNull String... permissions) { if (!needCheckPermission()) { return null; } List<String> deniedPermissions = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { deniedPermissions.add(permission); } } if (!deniedPermissions.isEmpty()) { return deniedPermissions; } return null; } /** * 是否拥有权限 */ public static boolean hasPermissons(@NonNull Activity activity, @NonNull String... permissions) { if (!needCheckPermission()) { return true; } for (String permission : permissions) { if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } /** * 是否拒绝了再次申请权限的请求(点击了不再询问) */ public static boolean deniedRequestPermissonsAgain(@NonNull Activity activity, @NonNull String... permissions) { if (!needCheckPermission()) { return false; } List<String> deniedPermissions = getDeniedPermissions(activity, permissions); for (String permission : deniedPermissions) { if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_DENIED) { if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { //当用户之前已经请求过该权限并且拒绝了授权这个方法返回true return true; } } } return false; } /** * 打开app详细设置界面<br/> * <p> * 在 onActivityResult() 中没有必要对 resultCode 进行判断,因为用户只能通过返回键才能回到我们的 App 中,<br/> * 所以 resultCode 总是为 RESULT_CANCEL,所以不能根据返回码进行判断。<br/> * 在 onActivityResult() 中还需要对权限进行判断,因为用户有可能没有授权就返回了!<br/> */ public static void startApplicationDetailsSettings(@NonNull Activity activity, int requestCode) { Toast.makeText(activity, "点击权限,并打开全部权限", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", activity.getPackag d0c8 eName(), null); intent.setData(uri); activity.startActivityForResult(intent, requestCode); } /** * 申请权限<br/> * 使用onRequestPermissionsResult方法,实现回调结果或者自己普通处理 * * @return 是否已经获取权限 */ public static boolean requestPerssions(Activity activity, int requestCode, String... permissions) { if (!needCheckPermission()) { return true; } if (!hasPermissons(activity, permissions)) { if (deniedRequestPermissonsAgain(activity, permissions)) { startApplicationDetailsSettings(activity, requestCode); //返回结果onActivityResult } else { List<String> deniedPermissions = getDeniedPermissions(activity, permissions); if (deniedPermissions != null) { ActivityCompat.requestPermissions(activity, deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode); //返回结果onRequestPermissionsResult } } return false; } return true; } /** * 申请权限返回方法 */ public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults, @NonNull OnRequestPermissionsResultCallbacks callBack) { // Make a collection of granted and denied permissions from the request. List<String> granted = new ArrayList<>(); List<String> denied = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { String perm = permissions[i]; if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { granted.add(perm); } else { denied.add(perm); } } if (null != callBack) { if (!granted.isEmpty()) { callBack.onPermissionsGranted(requestCode, granted, denied.isEmpty()); } if (!denied.isEmpty()) { callBack.onPermissionsDenied(requestCode, denied, granted.isEmpty()); } } } /** * 申请权限返回 */ // public interface OnRequestPermissionsResultCallbacks extends ActivityCompat.OnRequestPermissionsResultCallback { public interface OnRequestPermissionsResultCallbacks { /** * @param isAllGranted 是否全部同意 */ void onPermissionsGranted(int requestCode, List<String> perms, boolean isAllGranted); /** * @param isAllDenied 是否全部拒绝 */ void onPermissionsDenied(int requestCode, List<String> perms, boolean isAllDenied); } }
在Activity中使用
public class MainActivity extends AppCompatActivity implements PermissionUtil.OnRequestPermissionsResultCallbacks { private final String TAG = MainActivity.class.getSimpleName(); private final int REQUEST_CODE_CAMERA = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void requestCameraPermisson(View view) { //manifest.xml清单中需配置<uses-permission android:name="android.permission.CAMERA" /> //manifest.xml清单中需配置<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> //manifest.xml清单中需配置<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> PermissionUtil.requestPerssions(this, REQUEST_CODE_CAMERA, Manifest.permission.CAMERA, Manifest.permission.READ_SMS, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE); PermissionUtil.getCameraPermissions(this, REQUEST_CODE_CAMERA); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, List<String> perms, boolean isAllGranted) { Log.e(TAG,"同意:" + perms.size() + "个权限,isAllGranted=" + isAllGranted); for (String perm : perms) { Log.e(TAG,"同意:" + perm); } } @Override public void onPermissionsDenied(int requestCode, List<String> perms, boolean isAllDenied) { Log.e(TAG,"拒绝:" + perms.size() + "个权限,isAllDenied=" + isAllDenied); for (String perm : perms) { Log.e(TAG,"拒绝:" + perm); } } public void goPermissionsSettings(View view) { PermissionUtil.startApplicationDetailsSettings(this, 123); } public void isReadSMSPermissionDenied(View view) { //manifest.xml清单中需配置<uses-permission android:name="android.permission.READ_SMS" /> boolean isForbidden = PermissionUtil.deniedRequestPermissonsAgain(this, Manifest.permission.READ_SMS); Log.e(TAG,"读取短信权限是否禁止询问=" + isForbidden); } public void readSMS(View view) { new Thread(new Runnable() { @Override public void run() { ArrayList<HashMap<String, String>> hashMaps = readAllSMS(); for (HashMap<String, String> hashMap : hashMaps) { Log.e(TAG,hashMap.get("addr") + "," + hashMap.get("person") + "," + hashMap.get("body")); } } }).run(); } private Uri SMS_INBOX = Uri.parse("content://sms/"); private ArrayList<HashMap<String, String>> readAllSMS() { Cursor cursor = managedQuery(SMS_INBOX, new String[]{"address", "person", "body"}, null, null, null); ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); if (cursor.moveToFirst()) { int addrIdx = cursor.getColumnIndex("address"); int personIdx = cursor.getColumnIndex("person"); int bodyIdx = cursor.getColumnIndex("body"); do { String addr = cursor.getString(addrIdx); String person = cursor.getString(personIdx); String body = cursor.getString(bodyIdx); HashMap<String, String> item = new HashMap<String, String>(); item.put("addr", addr); item.put("person", person); item.put("body", body); list.add(item); } while (cursor.moveToNext()); } return list; } }
相关文章推荐
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0动态权限申请
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
- android6.0权限动态申请框架permissiondispatcher的方法
- 随记7——Android6.0动态权限申请
- Android6.0动态申请权限所遇到的问题小结
- Android6.0动态权限申请
- Android6.0动态申请权限
- Android6.0 读写SD卡权限动态申请
- Android6.0动态申请SD卡读写的权限
- Android6.0动态申请权限(高德地图源码)
- Android6.0动态申请权限<二>
- Android6.0动态申请权限
- android6.0以上权限申请工具类
- Android6.0动态权限申请
- android6.0以上动态申请权限问题。
- android6.0 动态申请权限
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0动态权限申请步骤以及需要注意的一些坑