介绍
EasyPermissions是一个包装器库,用于在针对Android M或更高版本时简化基本的系统权限逻辑。
官方地址:https://github.com/googlesamples/easypermissions
配置
EasyPermissions通过在你的build.gradle文件中配置如下依赖即可使用。
dependencies {
implementation 'pub.devrel:easypermissions:1.2.0'
}
需要注意的是EasyPermissions依赖安卓支持库27.1.0,因此你需要使用compileSdkVersion 27或者更高。这个更改应该是安全的,因为compileSdkVersion并不会改变app的行为。
使用
基本使用:
开始使用EasyPermissions时,让你的Activity或者Fragment重写onRequestPermissionsResult方法:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 将结果传递到EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }
请求权限:
下面的示例展示了如何请求同时需要CAMERA和ACCESS_FINE_LOCATION的方法权限。有几点需要注意:
1.如果这个app已经有了必要的权限,那么使用EasyPermissions.hasPermissions(...)方法检查。这个方法可以将任意多权限数量作为该方法最终的参数。
2.使用EasyPermissions.requestPermissions(...)方法请求权限,该方法将会请求系统权限以及如果是必要的话,则显示提供的解释说明。这个提供的requestCode对于这个请求应该是唯一的,以及这个方法将任意多的权限数量作为它的最终参数。
3.AfterPermissionGranted注解的使用。这个是可选的,但是它提供了便利。如果在给出的所有权限已授权,那么所有注解的方法与注解参数的请求码将会被执行(确保requestCode的唯一性)。这个带注解的方法是无参数的(相反,你可以使用onSaveInstanceState方法来记住抑制参数状态)。这是在所有权限授权之后,简化了需要运行权限方法的常见流程。通过在Activity或者Fragment中实现EasyPermissions.PermissionCallbacks接口的回调方法即:onPermissionsGranted(...)或onPermissionsDenied(...)添加相关逻辑即可完成。
@AfterPermissionGranted(RC_CAMERA_AND_LOCATION) //传入唯一性的请求码requestCode private void methodRequiresTwoPermission() { String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION}; 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_location_rationale), RC_CAMERA_AND_LOCATION, perms); } }或者为了更好地控制“权限阐述”对话框,请使用PermissionRequest:
EasyPermissions.requestPermissions( new PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, perms) .setRationale(R.string.camera_and_location_rationale)//阐述说明内容信息 .setPositiveButtonText(R.string.rationale_ask_ok) .setNegativeButtonText(R.string.rationale_ask_cancel) .setTheme(R.style.my_fancy_style) .build());
为了出色的控制,你可以随意让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> list) { // Some permissions have been granted 一些权限已授权 // ... } @Override public void onPermissionsDenied(int requestCode, List<String> list) { // Some permissions have been denied 一些权限已拒绝 // ... } }
需要的权限
在某些情况下,如果没有特定的权限,你的应用程序将无法正常运行。如果用户拒绝授权并且选中了不在提示的选框操作,那么您将无法向用户请求这些权限,并且必须在应用程序设置中更改这些权限。您可以使用EasyPermissions.somePermissionPermanentPermanentlyDenied(…)方法,在这种情况下向用户显示一个对话框,并将其指向应用程序的系统设置屏幕:
注意:由于Android框架权限API所提供的信息的限制,somePermissionPermanentPermanentlyDenied方法只有在权限被拒绝、您的应用程序收到onPermissionsDenied回调后才能工作。否则,该库无法将永久的否认与“尚未否认”的情况区分开来。
@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.
//授权结果将会在onActivityResult方法中回调
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) { // 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.RationaleCallbacks接口回调。
@Override public void onRationaleAccepted(int requestCode) { // Rationale accpets to request some permissions 阐述原因 接受请求的一些权限 // ... } @Override public void onRationaleDenied(int requestCode) { // Rationale denied to request some permissions 阐述原因 拒绝请求的一些权限 // ... }阐述回调不一定意味着权限更改。要查看这些,请参阅EasyPermissions.PermissionCallbacks。