您的位置:首页 > 移动开发 > Android开发

Android6.0(棉花糖)以上动态获取权限方法

2017-03-24 10:51 417 查看
简介:若用AndroidStudio编译的apk的 targetSdkVersion 为23及以上的话,在apk运行在6.0或6.0以上系统时。manifest文件中申请的部分权限(dangerous 权限)将不起作用,导致在6.0一下能正常运行的程序在6.0以上系统中无法正常运行。

解决方式有两种

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android