简介:若用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);
}
}