Git Product home page Git Product logo

easypermissions's Introduction

EasyPermissions

EasyPermissions 是基于 Android M 以上系统的一个简化的权限处理库。

安装

EasyPermissions 可以在 build.gradle 中被引用

dependencies {
    compile 'pub.devrel:easypermissions:0.2.1'
}

用法

基础

开始使用 EasyPermissions 前, 让你的 Activity (or Fragment) 重写 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);
    }
}

请求权限

下面的例子展示了一个同时请求 CAMERACHANGE_WIFI_STATE 2个权限, 以下是一些注意点:

  • 使用 EasyPermissions#hasPermissions(...) 检查app使用已经有权限。 这个方法可以同时检查 多个权限。
  • 使用 EasyPermissions#requestPermissions 请求权限。 这个方法将请求系统权限并且如果需要显示 权限申请的理由(在第一次拒绝权限后, 第二次再次申请时会弹出理由) Request Code 在权限请求中要保持唯一。 可以同时请求多个权限。
  • 使用 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);
    }
}

让你的 Activity / Fragment 继承 PermissionCallbacks 接口

public class MainActivity extends AppCompatActivity
    implements EasyPermissions.PermissionCallbacks {

    @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);
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> allPerms) {
        // All permissions have been granted
        // ...
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> deniedPerms, List<String> grantedPerms) {
        // Some permissions have been denied
        // ...
    }
}

获取权限结果

某些情况下,如果用户拒绝了权限并且勾选了 "不再询问", 你将在之后的每次请求权限都返回拒绝,并且不会弹出任何提示框,只有当用户去 "设置" 中改变权限。 这很不友好。你可以使用 EasyPermissions.somePermissionPermanentlyDenied(...) 判断是否有权限已经被永久拒绝, 如果有可以弹出提示框提示用户去设置里开启权限。

@Override
public void onPermissionsDenied(int requestCode, List<String> 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();
    }
}

更简单的权限处理(二次封装一行代码处理权限)

你可以把大部分权限处理代码放到 BaseActivity/BaseFragment 中, 然后调用 performCodeWithPermission 方法即可实现一行代码申请权限:

String[] perms = {Manifest.permission.CAMERA};
performCodeWithPermission(getString(R.string.rationale_camera), RC_CAMERA_PERM, perms, new PermissionCallback() {
    @Override
    public void hasPermission(List<String> allPerms) {
        Toast.makeText(SimplePermActivity.this, "TODO: Camera things", Toast.LENGTH_LONG).show();
    }

    @Override
    public void noPermission(List<String> deniedPerms, List<String> grantedPerms, Boolean hasPermanentlyDenied) {
        if (hasPermanentlyDenied) {
            alertAppSetPermission(getString(R.string.rationale_ask_again), RC_SETTINGS_SCREEN);
        }
    }
});

更详细的代码可以参见 BaseActivitySimplPermActivity

easypermissions's People

Contributors

alirezaafkar avatar danke77 avatar elsennov avatar fly2013 avatar friederbluemle avatar jaibatrik avatar jmarkovic avatar leedenison avatar markmals avatar prempalsingh avatar samtstern avatar supercilex avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.