【EasyPermissions】Simplify Android M System Permissions

Github:https://github.com/googlesamples/easypermissions

AndroidM发布后有一个很重要的更新,就是Android里面权限模式的更新!用户需要手动去获取权限而不是开始安装的时候就获取权限!所以,Android M在面向旧版本的应用的时候,可能会因为权限的问题而导致crash。

在Android M版本发布之前,Android系统中的权限模式一直采取较为简单粗暴的处理方式——即在安装之时由用户作出全部允许或者全不允许的二元选择。这意味着如果用户希望使用某款应用程序,则首先需要接受其中包含的全部权限要求或者干脆放弃安装。这就导致很多开发人员的编程成果在安装之时就被用户所弃用,根本无法真正实现用户与开发者间的信任关系乃至其它隐私保障手段。

【EasyPermissions】Simplify Android M System Permissions_第1张图片
AndroidM获取权限流程

尽管针对Android M开发而成的应用程序必须采用新型权限对话框与相关实现方法,但面向早期Android版本构建的应用仍然会在安装时直接向用户显示权限列表并要求一次性接受或拒绝。不过在Android M当中,用户完全可以在作出选择之后随时对相关权限进行调用。

Android M的权限大部分分为三种,Dangerous,Normal,specials,下面是危险权限的权限表!

【EasyPermissions】Simplify Android M System Permissions_第2张图片
1.png

由于负责处理权限调用任务的底层结构并不适用于面向早期Android版本的应用程序,所以当相关权限未被接受时,任何要求配合相关权限的功能都会返回null、0或者空值。这有可能导致应用程序出现意料之外的行为,因此建议各位开发人员对自己的原有应用程序进行升级,以确保其尽早支持Android M中的全新权限模式。

如何获取简单获取Android M的权限,Google在Github上面给我们提供了EasyPremissions这个库!EasyPermisssions 是一个可以在Android M和更高版本上进行获取权限操作的第三方库,而且不用开发者来判断当前版本,适配了低版本的sdk!

开始

  1. 重写onRequestPermissionsResult方法

    public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

     // Forward results to EasyPermissions
     EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    

    }
    }

  2. 请求权限
    2.1 使用EasyPermissions.hasPermissions来判断app是否已经获得了该权限。这个方法可以获得多个权限。
    2.2 通过EasyPermissisons.requestPermissions来请求系统权限,用户通过rationale提示文字信息来判断是否给与用户该权限
    2.3 使用AfterPermissionGranted注释,这是可选的,但是提供出来是为了方便。如果所有的请求的权限都被授予了,被注解的方法将会被执行,这样做是为了简化通常的请求权限成功之后再调用方法的流程。同时也可以在 onPermissionsGranted的回调中添加逻辑操作~~~他们的区别在于:一个是所有的权限都允许的时候,一个是通过一项允许就运行,就是这个差别!后面有一些源码的分析。。。

@AfterPermissionGranted(RC_CAMERA_AND_WIFI)
private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.CHANGE_WIFI_STATE};
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
EasyPermissions.requestPermissions(this, getString(R.string.camera_and_wifi_rationale),
RC_CAMERA_AND_WIFI, perms);
}
}

2.4 实现PermissionCallbacks接口
 @Override
public void onPermissionsGranted(int requestCode, List list) {
// Some permissions have been granted
// ...
}

@Override
public void onPermissionsDenied(int requestCode, List list) {
    // Some permissions have been denied
    // ...
}

3.如果被用户选择了不再提示。。。我们需要去设置里面给我们的应用相应的权限

@Override
public void onPermissionsDenied(int requestCode, List perms) {
Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this, getString(R.string.rationale_ask_again))
.setTitle(getString(R.string.title_settings_dialog))
.setPositiveButton(getString(R.string.setting))
.setNegativeButton(getString(R.string.cancel), null /* click listener */)
.setRequestCode(RC_SETTINGS_SCREEN)
.build()
.show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SETTINGS_SCREEN) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast.makeText(this, R.string.returned_from_app_settings_to_activity, Toast.LENGTH_SHORT)
.show();
}
}

最后附上EasyPermissions的源码


public class EasyPermissions {
/**
* Handle the result of a permission request, should be called from the calling Activity's
* {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}
* method.
*


* If any permissions were granted or denied, the Activity will receive the appropriate
* callbacks through {@link PermissionCallbacks} and methods annotated with
* {@link AfterPermissionGranted} will be run if appropriate.
*
* @param requestCode requestCode argument to permission result callback.
* @param permissions permissions argument to permission result callback.
* @param grantResults grantResults argument to permission result callback.
* @param object the calling Activity or Fragment.
* @throws IllegalArgumentException if the calling Activity does not implement
* {@link PermissionCallbacks}.
*/
public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults, Object object) {
//判断传入参数是否合适
checkCallingObjectSuitability(object);
//合适的话直接强转,不合适抛异常
PermissionCallbacks callbacks = (PermissionCallbacks) object;

    // Make a collection of granted and denied permissions from the request.
    ArrayList granted = new ArrayList<>();
    ArrayList denied = new ArrayList<>();
  //判断返回的权限数据,如果权限被授予,添加到granted的List中,没有被授予则添加到denied的List中
    for (int i = 0; i < permissions.length; i++) {
        String perm = permissions[i];
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
            granted.add(perm);
        } else {
            denied.add(perm);
        }
    }

    // Report granted permissions, if any.
  //进行回调
    if (!granted.isEmpty()) {
        // Notify callbacks
        callbacks.onPermissionsGranted(requestCode, granted);
    }

    // Report denied permissions, if any.
  //进行回调
    if (!denied.isEmpty()) {
        callbacks.onPermissionsDenied(requestCode, denied);
    }

    // If 100% successful, call annotated methods
  //如果所有请求的权限都被授予,则调用被注解的方法
    if (!granted.isEmpty() && denied.isEmpty()) {
        runAnnotatedMethods(object, requestCode);
    }
}

}

个人建议,早用早好!!!填坑之路,还远着呢!

你可能感兴趣的:(【EasyPermissions】Simplify Android M System Permissions)