最近适配Android 8,发现其实项目代码连6都没有做适配......
Android6.0以上的系统中,引入了运行时权限检查,运行时权限分为正常权限和危险权限,当我们的App调用了需要危险权限的api时,需要向系统申请权限,系统会弹出一个对话框让用户感知,只有当用户授权以后,App才能正常调用api。
6以上的系统中,我们在AndroidManifest.xml中声明的某些权限,系统默认不再授权了,即使安装时用户没有异议。我们需要在运行时动态的判断是否拥有权限,以及动态的申请权限。
好吧,Android越来越向iOS靠近了。
其实我们可以在应用启动的时候集中申请我们需要的所有相关权限,然后应用中使用到相应权限时判断一下,如果有权限则进行操作,否则进行其他操作。
这里写了一个权限管理工具类。注意,既然是适配,我们就需要判断版本Build.VERSION_CODES.M,系统版本低于6时不用动态申请权限,默认拥有权限。
package com.xiaoxiaoqiquan.client.util;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import com.xiaoxiaoqiquan.base.BaseActivity;
import com.xiaoxiaoqiquan.client.IApplication;
import java.util.ArrayList;
import java.util.List;
public class PermissionUtil {
@TargetApi(23)
public static void getPersimmions(BaseActivity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
List<String> permissions = new ArrayList<>();
addPermission(activity, permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE);
addPermission(activity, permissions, Manifest.permission.READ_PHONE_STATE);
if (permissions.size() > 0) {
activity.requestPermissions(permissions.toArray(new String[permissions.size()]), 1);
}
}
}
@TargetApi(23)
private static boolean addPermission(BaseActivity activity, List<String> permissionsList, String permission) {
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
if (activity.shouldShowRequestPermissionRationale(permission)){
return true;
}else{
permissionsList.add(permission);
return false;
}
}else{
return true;
}
}
public static boolean checkPermission(String permission) {
Context context = IApplication.getContext();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|| context.getPackageManager().checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
return true;
}
return false;
}
}
然后在应用靠前的Activity中进行权限申请,在我这里是用户登录页面
PermissionUtil.getPersimmions(this);
然后在需要权限进行操作的地方先进行权限判断,有相关权限再进行相关操作。这里是判断有没有sd卡并且有sd卡的写权限,如果有则记录日志到sd卡,否则记录日志到内部存储卡
if (TextUtils.equals(Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED)
&& PermissionUtil.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {// 优先保存到SD卡中
PATH_LOGCAT = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + APP_TAG + File.separator + (BuildConfig.DEBUG?"debug-":"") + "log";
} else {// 如果SD卡不存在或者没有权限,就保存到本应用的目录下
PATH_LOGCAT = context.getFilesDir().getAbsolutePath() + File.separator + APP_TAG + File.separator + (BuildConfig.DEBUG?"debug-":"") +
"log";
}
网友评论