- 棉花糖, Marshmallow, Version-6.0, Api-23
运行时权限
用户在新版本中可以随时更改应用权限,因此应用内使用危险操作时提前校验是否存在权限。下面介绍个获取存储权限的例子
首先查看有没有此权限
/**
* 外部存储读写权限
*
* @param context 上下文
*/
public boolean getStorage(Context context) {
if (context instanceof BaseActivity) {
if ((ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)
&&
(ContextCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)
) {
Log.i(TAG, "没有外部存储读写权限");
return false;
} else {
Log.i(TAG, "已经有外部存储读写权限了");
return true;
}
} else {
Log.w(TAG, "参数错误", new IllegalArgumentException("u must set a activity extends of BaseActivity"));
return false;
}
}
如果有权限下一步文件操作可以继续进行,如果没有我们还需再次请求下权限
public static final int STORAGE = 209;
/**
* 获取权限
*
* @param context 上下文
*/
public void requestStorage(Context context) {
if (context instanceof BaseActivity) {
ActivityCompat.requestPermissions((BaseActivity) context,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE
);
}
}
然后需要在activity内重写onRequestPermissionsResult()
/**
* 权限请求回调
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PermissionsUtils.STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 获取到了权限
// 在这里做文件相关操作
} else {
// 用户拒绝了请求
// 在这里可以提示用户权限请求失败等
}
break;
}
}
activity中调用
if (PermissionsUtils.getInstance().isMarshmallowUp() && !PermissionsUtils.getInstance().getStorage(this)) {
// 6.0以上系统请求文件读写权限
PermissionsUtils.getInstance().requestStorage(this);
}
- 牛轧糖, Nougat, Version-7.0, Api-24
View获取Activity限制
使用View.getContext()方法获取Context或者Activity在之前的系统内是可行的,但是7.0系统限制了这个方式。
因此7.0需要使用反射获取方式
public Activity getActivityByView(View view){
Activity activity = null;
// 7.0以上版本使用反射方式暴力获取activity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (view.getContext().getClass().getName().contains("com.android.internal.policy.DecorContext")) {
try {
Field field = view.getContext().getClass().getDeclaredField("mPhoneWindow");
field.setAccessible(true);
Object obj = field.get(view.getContext());
java.lang.reflect.Method m1 = obj.getClass().getMethod("getContext");
activity = (Activity) (m1.invoke(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
Log.i(TAG, "getActivityContent: 系统版本7.0以上");
} else {
activity = (Activity) view.getContext();
Log.i(TAG, "getActivityContent: 系统版本7.0以下");
}
return activity;
}