Android 6.0 7.0及以上 动态权限

来源:互联网 发布:数据切片 编辑:程序博客网 时间:2024/06/12 02:28

android 6.0版本开始,google粑粑处于安全性考虑,敏感的权限只在manifest注册已经不可以了(例如摄像头权限,定位权限等等),需要在代码中动态注册。


以下对权限做一些介绍(转载):

以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。

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
作者:小爱_小世界链接:http://www.jianshu.com/p/a51593817825來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下是普通权限,只需要在AndroidManifest.xml中申请即可:

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_NOTIFICATION_POLICY android.permission.ACCESS_WIFI_STATE android.permission.ACCESS_WIMAX_STATE android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN android.permission.BROADCAST_STICKY android.permission.CHANGE_NETWORK_STATE android.permission.CHANGE_WIFI_MULTICAST_STATE android.permission.CHANGE_WIFI_STATE android.permission.CHANGE_WIMAX_STATE android.permission.DISABLE_KEYGUARD android.permission.EXPAND_STATUS_BAR android.permission.FLASHLIGHT android.permission.GET_ACCOUNTS android.permission.GET_PACKAGE_SIZE android.permission.INTERNET android.permission.KILL_BACKGROUND_PROCESSES android.permission.MODIFY_AUDIO_SETTINGS android.permission.NFC android.permission.READ_SYNC_SETTINGS android.permission.READ_SYNC_STATS android.permission.RECEIVE_BOOT_COMPLETED android.permission.REORDER_TASKS android.permission.REQUEST_INSTALL_PACKAGES android.permission.SET_TIME_ZONE android.permission.SET_WALLPAPER android.permission.SET_WALLPAPER_HINTS android.permission.SUBSCRIBED_FEEDS_READ android.permission.TRANSMIT_IR android.permission.USE_FINGERPRINT android.permission.VIBRATE android.permission.WAKE_LOCK android.permission.WRITE_SYNC_SETTINGS com.android.alarm.permission.SET_ALARM com.android.launcher.permission.INSTALL_SHORTCUT com.android.launcher.permission.UNINSTALL_SHORTCUT
作者:小爱_小世界链接:http://www.jianshu.com/p/a51593817825來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



此处对动态请求权限提供一个我用的方法,以动态请求相机权限和定位权限为例:

引入一个开源框架,用于权限管理,然后当前布局实现

EasyPermissions.PermissionCallbacks
/**权限管理**/compile 'pub.devrel:easypermissions:0.2.0'

/** * 请求权限 *///比如用到调用相机,调用的方法写在getPermiss()方法里边private void getPermiss() {    //检查是否已经赋予了所有权限    if (EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA)) {        //相机操作        } else {        //有权限没有被赋予去请求权限        EasyPermissions.requestPermissions(this, "需要请求camera权限", REQUEST_CAMERA_PERM, Manifest.permission.CAMERA);    }}
//定位权限private void getFineLocationPermiss() {    //检查是否已经赋予了所有权限(小米手机拒绝后检测时会误显示授予了权限)    if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);            int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Binder.getCallingUid(), getPackageName());            if (checkOp == AppOpsManager.MODE_IGNORED) {                //权限被拒绝了(显示权限弹窗,避免用户多次拒绝后点击不再提示权限请求)               new AppSettingsDialog.Builder(this, "当前App需要申请定位权限,需要打开设置页面么?")                        .setTitle("权限申请")                        .setPositiveButton("确认")                        .setNegativeButton("取消", null  /*click listener*/)                        .setRequestCode(ACCESS_FINE_LOCATION)                        .build()                        .show();            } else {                //定位操作            }        } else {            //版本较低,直接进行定位操作
        }    } else {        //有权限没有被赋予去请求权限        EasyPermissions.requestPermissions(this, "需要请求定位权限", ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION);    }}//重写onRequestPermissionsResult将值传递给EasyPermissions.onRequestPermissionsResult();//固定写法@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}/** * 权限请求成功 * * @param requestCode 权限请求码 * @param perms       权限请求集合 */@Overridepublic void onPermissionsGranted(int requestCode, List<String> perms) {}/** * 权限请求失败 * * @param requestCode 权限请求吗 * @param perms       权限集合 */@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {    for (String per :            perms) {        Log.e("权限", per);    }
 //权限被拒绝了(显示权限弹窗,避免用户多次拒绝后点击不再提示权限请求)
if (perms.get(0).equals("android.permission.ACCESS_FINE_LOCATION")) {
     if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {       
     new AppSettingsDialog.Builder(this, "当前App需要申请定位权限,需要打开设置页面么?")        
                      .setTitle("权限申请")                 
      .setPositiveButton("确认")              
            .setNegativeButton("取消", null /* click listener */)      
                      .setRequestCode(ACCESS_FINE_LOCATION)     
                 .build()               
                                           .show();   
     }  
  }   
 if (perms.get(0).equals("android.permission.CAMERA")) {   
     if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {     
       new AppSettingsDialog.Builder(this, "当前App需要申请camera权限,需要打开设置页面么?")             
                                            .setTitle("权限申请")             
                 .setPositiveButton("确认")           
            .setNegativeButton("取消", null /* click listener */)        
                                            .setRequestCode(REQUEST_CAMERA_PERM)                
                                            .build()                
                                            .show();        
}   
 }
}/*END*/
此外,提供一个简单的权限请求方式(以读写内存为例):
public class PermissionUtil {
private static String[] PERMISSIONS_STORAGE = {        Manifest.permission.READ_EXTERNAL_STORAGE,        Manifest.permission.WRITE_EXTERNAL_STORAGE};
private static final int REQUEST_EXTERNAL_STORAGE = 1;//权限请求码
public static void requestPermissions(Activity mActivity) {    int permission = ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE);//检查是否有权限(此处读写权限获取其一就可以)    if (permission != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(                mActivity,                PERMISSIONS_STORAGE,                REQUEST_EXTERNAL_STORAGE        );          } else {        //已获取权限,进行相关操作    }
}
}