LiPermission

github 地址: github.com/leftcoding/…

实现方式是基于 Aspectjx,有兴趣的可以去看看。只要一个简单的注解,就可以实现 android 6.0 动态的权限请求。权限库基于 Andpermission,不过原库不满足自己的需求,基于库上进行了修改。

使用方法

1. 在项目根目录的 build.gradle 文件中,添加 classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'

dependencies {        classpath 'com.android.tools.build:gradle:3.4.0'        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'// 添加这句}

2. 在项目文件 build.gradle 文件中,添加 apply plugin: 'android-aspectjx'

apply plugin: 'com.android.application'apply plugin: 'android-aspectjx' // 添加这句android {    compileSdkVersion 28    defaultConfig {...    }}

3. 项目文件 build.gradle 文件中,添加

implementation 'android.left.permission:annotation:1.0.1'

4. 开始使用

申请系统权限,需要事先在AndroidManifest.xml 中,进行权限申请

    
public class SplashActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_splash);        findViewById(R.id.start_main).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                checkPermission();            }        });    }    @PermissionRequest(permissions = {Permissions.WRITE_EXTERNAL_STORAGE})    private void checkPermission() {        startActivity(new Intent(this, MainActivity.class));    }}

特殊定制

1. 打开 App 进行授权,否则不进行后面操作

如果想让应用一开始,就进行文件的读写权限请求,授权后再进行后面的操作。例如:

public class SplashActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_splash);        checkPermission();    }    @PermissionRequest(permissions = {Permissions.WRITE_EXTERNAL_STORAGE}, repeat = true, toFrontRequest = true)    private void checkPermission() {        startActivity(new Intent(this, MainActivity.class));    }}
  • repeat = true 表示授权失败后,可以再进行权限请求,直到永久被禁止。
  • toFrontRequest = true 表示权限永久被禁止,跳转权限设置界面,设置权限允许后,返回当前应用,进行再次请求,不过在跳转设置界面,有可能原App界面就已经被系统销毁了,所以,优先考虑,应该去权限设置界面,最好关闭当前app,否则会有其他的意外情况,根据当前手机反应,自由选择。

2. 定制权限被拒绝授权说明,权限拒绝后回调

  • 权限被拒绝后,需要合理的理由,你可以定制回调方法。在方法上,添加注解@PermissionRationale,如果,不需要知道被拒绝权限,可以不需要添加 Rationale 参数
  • 如果权限被永久拒绝,想自定义回调方法,在方法上添加注解 @PermissionCallback
public class MainActivity extends AppCompatActivity {    Button permission;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        permission = findViewById(R.id.permission);        permission.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                test();            }        });    }    @Override    protected void onStart() {        super.onStart();    }    @PermissionRequest(permissions = {Permissions.WRITE_EXTERNAL_STORAGE})    private void test() {        Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();    }    @PermissionRationale    private void rationale(final Rationale rationale) {        new AlertDialog.Builder(MainActivity.this)                .setMessage("需要以下的权限" + rationale.getPermission() + "请同意授权")                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        dialog.dismiss();                    }                })                .setPositiveButton("确定", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        dialog.dismiss();                        rationale.onRationale();                    }                })                .show();    }    @PermissionCallback    private void callback() {        Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();    }}

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。谢谢!

更多相关文章

  1. Android(安卓)ANR 探索
  2. Android(安卓)WindowManager悬浮窗:不需要申请权限实现悬浮
  3. Android及系统架构目录结构介绍
  4. android解析xml文件的方式(其一)
  5. 如何理解、使用Android(安卓)LogCat以及通过Monkey进行压力测试
  6. Android(安卓)Frame动画demo
  7. android 本地数据库
  8. android 绑定arp
  9. Android第一步

随机推荐

  1. MySQL数据库root账户的设置和管理
  2. 版本5及更高版本中MySQL数据库的最大大小
  3. Mysql PARTITION 数据表分区技术
  4. mysql批量结束线程
  5. MySQL数据库表名、列名、别名区分大小写
  6. 在Google Cloud Platform上设计PolyGlot
  7. mysql存储过程调试记实
  8. Android应用程序与外部数据库之间的安全
  9. [转]MYSQL高可用方案探究(总结)
  10. mysql 的一点点记录