Android6.0(棉花糖)以上动态获取权限方法
2017-03-24 10:51
417 查看
简介:若用AndroidStudio编译的apk的 targetSdkVersion 为23及以上的话,在apk运行在6.0或6.0以上系统时。manifest文件中申请的部分权限(dangerous 权限)将不起作用,导致在6.0一下能正常运行的程序在6.0以上系统中无法正常运行。
SDKUtil用于判断系统版本
public class SDKUtil {
/**
* Magic version number for a current development build, which has
* not yet turned into an official release.
*/
public static final int CUR_DEVELOPMENT = 10000;
/**
* October 2008: The original, first, version of Android. Yay!
*/
public static final int BASE = 1;
/**
* February 2009: First Android update, officially called 1.1.
*/
public static final int BASE_1_1 = 2;
/**
* May 2009: Android 1.5.
*/
public static final int CUPCAKE = 3;
/**
* September 2009: Android 1.6.
*/
public static final int DONUT = 4;
/**
* November 2009: Android 2.0
*/
public static final int ECLAIR = 5;
/**
* December 2009: Android 2.0.1
*/
public static final int ECLAIR_0_1 = 6;
/**
* January 2010: Android 2.1
*/
public static final int ECLAIR_MR1 = 7;
/**
* June 2010: Android 2.2
*/
public static final int FROYO = 8;
/**
* November 2010: Android 2.3
*/
public static final int GINGERBREAD = 9;
/**
* February 2011: Android 2.3.3.
*/
public static final int GINGERBREAD_MR1 = 10;
/**
* February 2011: Android 3.0.
*/
public static final int HONEYCOMB = 11;
/**
* May 2011: Android 3.1.
*/
public static final int HONEYCOMB_MR1 = 12;
/**
* June 2011: Android 3.2.
*/
public static final int HONEYCOMB_MR2 = 13;
/**
* October 2011: Android 4.0.
*/
public static final int ICE_CREAM_SANDWICH = 14;
/**
* December 2011: Android 4.0.3.
*/
public static final int ICE_CREAM_SANDWICH_MR1 = 15;
/**
* June 2012: Android 4.1.
*/
public static final int JELLY_BEAN = 16;
/**
* Android 4.2: Moar jelly beans!
*/
public static final int JELLY_BEAN_MR1 = 17;
/**
* Android 4.3: Jelly Bean MR2, the revenge of the beans.
*/
public static final int JELLY_BEAN_MR2 = 18;
/**
* Android 4.4: KitKat, another tasty treat.
*/
public static final int KITKAT = 19;
/**
* API等级20:Android 4.4W
* */
public static final int W4_4 = 20;
/**
*Android 5.0 Lollipop
* */
public static final int LOLLIPOP = 21;
/**
*API等级22:Android 5.1 Lollipop
* */
public static final int LOLLIPOP5_1 = 22;
/**
*API等级23:Android 6.0 Marshmallow
* */
public static final int MARSHMALLOW = 23;
/**
*API等级24:Android 7.0 Nougat
* */
public static final int NOUGAT = 24;
public static int getSDKVersionNumber() {
int sdkVersion;
try {
sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT);
} catch (NumberFormatException e) {
sdkVersion = 0;
}
return sdkVersion;
}
}动态申请权限方法
/**
* 动态获取相应权限
* */
public static void getNeedPermission(Activity activity,String permission,int requestCode){
if (SDKUtil.getSDKVersionNumber() >= SDKUtil.MARSHMALLOW) {
int checkPermission = ContextCompat.checkSelfPermission(activity, permission);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
LogUtil.d("android 6.0 以上系统动态申请权限 ---------- : " + permission);
} else {
}
}
}
在进入Activity的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CAMERA_PERMISSION_REQUEST_CODE: //动态申请定位权限请求
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
ToastUtil.show(getBaseContext(),"您现可以在应用中使用照相机了");
} else {
ToastUtil.show(getBaseContext(),"动态权限申请失败");
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
以上是自己写的一个简单动态申请权限的方法,推荐一个Github上开源的动态获取权限库permissionGen
PermissionGen
解决方式有两种
1.降低 targetSdkVersion 为22或以下(不推荐)
2.程序判断系统版本,需要动态申请的权限去动态申请
思路很简单:1.判断系统版本 2.动态申请 3.判断用户是否赋予相应权限SDKUtil用于判断系统版本
public class SDKUtil {
/**
* Magic version number for a current development build, which has
* not yet turned into an official release.
*/
public static final int CUR_DEVELOPMENT = 10000;
/**
* October 2008: The original, first, version of Android. Yay!
*/
public static final int BASE = 1;
/**
* February 2009: First Android update, officially called 1.1.
*/
public static final int BASE_1_1 = 2;
/**
* May 2009: Android 1.5.
*/
public static final int CUPCAKE = 3;
/**
* September 2009: Android 1.6.
*/
public static final int DONUT = 4;
/**
* November 2009: Android 2.0
*/
public static final int ECLAIR = 5;
/**
* December 2009: Android 2.0.1
*/
public static final int ECLAIR_0_1 = 6;
/**
* January 2010: Android 2.1
*/
public static final int ECLAIR_MR1 = 7;
/**
* June 2010: Android 2.2
*/
public static final int FROYO = 8;
/**
* November 2010: Android 2.3
*/
public static final int GINGERBREAD = 9;
/**
* February 2011: Android 2.3.3.
*/
public static final int GINGERBREAD_MR1 = 10;
/**
* February 2011: Android 3.0.
*/
public static final int HONEYCOMB = 11;
/**
* May 2011: Android 3.1.
*/
public static final int HONEYCOMB_MR1 = 12;
/**
* June 2011: Android 3.2.
*/
public static final int HONEYCOMB_MR2 = 13;
/**
* October 2011: Android 4.0.
*/
public static final int ICE_CREAM_SANDWICH = 14;
/**
* December 2011: Android 4.0.3.
*/
public static final int ICE_CREAM_SANDWICH_MR1 = 15;
/**
* June 2012: Android 4.1.
*/
public static final int JELLY_BEAN = 16;
/**
* Android 4.2: Moar jelly beans!
*/
public static final int JELLY_BEAN_MR1 = 17;
/**
* Android 4.3: Jelly Bean MR2, the revenge of the beans.
*/
public static final int JELLY_BEAN_MR2 = 18;
/**
* Android 4.4: KitKat, another tasty treat.
*/
public static final int KITKAT = 19;
/**
* API等级20:Android 4.4W
* */
public static final int W4_4 = 20;
/**
*Android 5.0 Lollipop
* */
public static final int LOLLIPOP = 21;
/**
*API等级22:Android 5.1 Lollipop
* */
public static final int LOLLIPOP5_1 = 22;
/**
*API等级23:Android 6.0 Marshmallow
* */
public static final int MARSHMALLOW = 23;
/**
*API等级24:Android 7.0 Nougat
* */
public static final int NOUGAT = 24;
public static int getSDKVersionNumber() {
int sdkVersion;
try {
sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT);
} catch (NumberFormatException e) {
sdkVersion = 0;
}
return sdkVersion;
}
}动态申请权限方法
/**
* 动态获取相应权限
* */
public static void getNeedPermission(Activity activity,String permission,int requestCode){
if (SDKUtil.getSDKVersionNumber() >= SDKUtil.MARSHMALLOW) {
int checkPermission = ContextCompat.checkSelfPermission(activity, permission);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
LogUtil.d("android 6.0 以上系统动态申请权限 ---------- : " + permission);
} else {
}
}
}
在进入Activity的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CAMERA_PERMISSION_REQUEST_CODE: //动态申请定位权限请求
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
ToastUtil.show(getBaseContext(),"您现可以在应用中使用照相机了");
} else {
ToastUtil.show(getBaseContext(),"动态权限申请失败");
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
以上是自己写的一个简单动态申请权限的方法,推荐一个Github上开源的动态获取权限库permissionGen
PermissionGen
相关文章推荐
- android6.0以上版本动态获取权限
- Android6.0以上系统权限提示获取方法
- 关于Android6.0以上动态获取运行时权限、及无法正常运行百度地图API的问题
- 动态一次获取多种android6.0以上的权限
- 菜鸟笔记3.关于百度地图Android6.0以上权限动态获取,
- android6.0(API23)以上动态申请权限
- Android6.0动态获取权限
- Android6.0以上弹框获取权限
- Android开发动态获取权限(6.0以上API>23)
- android6.0以上获取权限简单封装
- android6.0动态获取权限
- Android6.0以上,动态权限申请
- 关于android6.0动态获取权限
- Android6.0以上权限获取权限的问题
- Android6.0及以上动态申请权限详细讲解
- andorid6.0以上系统,百度定位,首次动态获取权限后不自动定位解决方案
- Android6.0动态获取摄像头权限(举一反三)
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
- Android6.0以上获取相关权限
- Android6.0动态权限获取框架:RxPermission(基于RxJava2)