首页 > 系统 > Android > 正文

Android 6.0权限处理问题

2019-11-09 18:33:47
字体:
来源:转载
供稿:网友

1 . 概述: Android 6.0(API 23)之后,为了保护用户的隐私,Google采取了新的权限机制,其将权限分为两类

Normal permission:该类权限不涉及用户的隐私信息或者是敏感操作

Dangerous Permission:该类权限获取用户信息及对用户进行敏感操作(读取用户信息,拨打电话等,读写SD卡文件等)

Android 6.0(API 23)之前,无论用户请求的是Normal Permissions还是Dangerous Permission,我们请求的相关权限的方式都是在清单文件AndroidManifest.xml中对其进行声明,如: <uses-permission android:name="android.permission.READ_LOGS" /> <!-- 改变屏幕方向权限 --> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <!-- 互联网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 网络状态权限 --> <uses-permission android:name="android.permission.access_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 在应用的安装过程会根据清单文件的声明的权限生成一个权限列表,只有用户同意了所有的权限,才可以完成安装,这样导致的情况就是用户必须忍受很多应用不必要的权限,而在Android 6.0(API 23)之后,sdk提供了一个检查权限的方法:ContextCompat.checkSelfPermission(),用户只需要安装app,当我们需要某一个具体的Dangerous Permission时再去向用户请求获取对应的权限,如果系统发现已经拥有了该权限,那么用户直接跳过请求权限执行相应的操作,如果系统发现该权限还未授予,则需要用户同意对相应的权限请求才可以往下执行。Normal permission:ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATEBLUETOOTHBLUETOOTH_ADMINBROADCAST_STICKYCHANGE_NETWORK_STATECHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATEDISABLE_KEYGUARDEXPAND_STATUS_BARGET_PACKAGE_SIZEINSTALL_SHORTCUTINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_ALARMSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUNINSTALL_SHORTCUTUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGSDangerous Permissiongroup:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTSgroup: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_VOICEMAILgroup:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA permission:android.permission.CAMERAgroup:android.permission-group.SENSORS permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIOgroup: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

仔细观察不难发现Dangerous Permission是成对出现的,我们只需要请求某一组里面的某一个权限,这一组其他的权限也同时通过了,比如说我请求了写入文件的权限,同时读取文件的权限也被请求了

2.权限的请求处理工具类:

public class PermissionsUtils { /** * 获取目录设备SDK版本号信息 * * @return */ public static int getTargetSdkVersion(Context context) { final PackageInfo info; try { info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return info.applicationInfo.targetSdkVersion; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return 0; } } /** * 检查是否已授权指定权限 * * @param permission * @param requestCode * @return */ @SuppressLint("NewApi") public static boolean selfPermissionGranted(Activity context,String permission, int requestCode) { // For Android < Android M, self permissions are always granted. boolean result = true; int targetSdkVersion = getTargetSdkVersion(context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (targetSdkVersion >= Build.VERSION_CODES.M) { // targetSdkVersion >= Android M, we can // use Context#checkSelfPermission result =context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; } else { // targetSdkVersion < Android M, we have to use // PermissionChecker result = PermissionChecker .checkSelfPermission(context, permission) == PermissionChecker.PERMISSION_GRANTED; } } if (!result) { requestPermissions(context,permission, requestCode); } return result; } /** * 如果对应的权限信息还未请求,请求指定的权限信息 * * @param permission * @param requestCode * @param allowMessage */ public static void requestPermissions(Activity activity,final String permission, final int requestCode) { ActivityCompat.requestPermissions(activity, new String[] { permission }, requestCode); }}

3 .权限回调的处理: 在Activity中重写onRequestPermissionsResult 并对其返回的结果进行处理:

package com.example.premissiondemo;import android.app.Activity;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean isAuth = PermissionsUtils.selfPermissionGranted(MainActivity.this, android.Manifest.permission.CALL_PHONE,101); if(isAuth){ callPhone(); Log.i("Permissions", "Request Permissions Successful"); } } }); } private void callPhone(){ Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "10086"); intent.setData(data); MainActivity.this.startActivity(intent); }} /**@param 请求权限时传入的请求码 * @param 请求所需的权限 * @param 请求返回的结果 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // TODO Auto-generated method stub super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 101){//拨打电话权限的请求回调 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ "13311111111")); MainActivity.this.startActivity(intent); } } }

注:本文参考 1. http://blog.csdn.net/lmj623565791/article/details/50709663 2. http://blog.csdn.net/QQ_33689414/article/details/52650803


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表