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 { //已获取权限,进行相关操作 }}}