github: https://github.com/hotchemi/PermissionsDispatcher
package com.example.administrator.myapplication;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// MainActivityPermissionsDispatcher这个类由 类名+PermissionsDispatcher 组成
// 在编译过程中动态生成, 生成的目录在 app/build/generated/source/apt/debug/包名
// 在运行时, 会调用 @NeedsPermission注解下面的方法, demo里既是take()
MainActivityPermissionsDispatcher.takeWithCheck(this);
}
@NeedsPermission(Manifest.permission.CAMERA)
void take() {
Log.d(TAG, "NeedsPermission");
startCamera();
}
// 第一次出现授权提示出现后, 选择拒绝, 下次再进入才会出现
@OnShowRationale(Manifest.permission.CAMERA)
void show(final PermissionRequest request) {
Log.d(TAG, "OnShowRationale");
new AlertDialog.Builder(this)
.setMessage("再次请求授权吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// 再次请求授权(带有不再提示选项)
request.proceed();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// 执行 OnPermissionDenied注解下面的方法
request.cancel();
}
})
.show();
}
// 每次拒绝都会调用一次, 【请求授权】或者request.cancel();
@OnPermissionDenied(Manifest.permission.CAMERA)
void denied() {
Log.d(TAG, "OnPermissionDenied");
}
// 当勾选这个以后, 每次进入页面都会调用一次
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera(){
Log.d(TAG, "OnNeverAskAgain");
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "requestCode = " + requestCode);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
// 启动相机
private void startCamera() {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(intent);
}
// 问题
// 1.第一次进入选择运行, 没有启动照相机, 既是不调用 @NeedsPermission注解下面的方法
// 2.不知道如何执行neverAskAgain()
// 解决
// 补上onRequestPermissionsResult可以解决
}
更新时间 2017年10月27日17:37:42
最新包版本为3.0.1;
经测试,在第一次进入申请权限时黑屏,应用直接被杀掉;
更新2017年10月30日09:24:06
经反复测试,黑屏的原因是因为申请权限的Activty在注册时声明为
android:noHistory=”true”,去掉这个属性即可