Android 6.0 7.0及以上 动态权限

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();
//固定写法
@Override
public 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       权限请求集合
 */
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {

}

/**
 * 权限请求失败
 *
 * @param requestCode 权限请求吗
 * @param perms       权限集合
 */
@Override
public 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 {
        //已获取权限,进行相关操作
    }
}
}



猜你喜欢

转载自blog.csdn.net/qq_35017727/article/details/78584426