Android各版本开发差异

  • 棉花糖, 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;
}

此文章会陆续将工作中遇到的版本差异踩到的坑记录下来

你可能感兴趣的:(Android各版本开发差异)