1.定义一个BaseActvity,我们会在这里对权限进行封装,如想使用直接让你的Activity 继承BaseActvity即可:
public class BaseActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 1;
private static IPermission mListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
ActivityCollector.removeActivity(this);
super.onDestroy();
}
//申请权限的方法
public static void requestRunTimePermission(String[] permissions, IPermission listener) {
//这里使用ActivityCollector类,时为了 在非Activity类中获取Activity实列,因为权限申请必须要用Activity对象
Activity topActivity = ActivityCollector.getTopActivity();
mListener = listener;
if (topActivity == null) {
return;
}
List<String> permissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
if (!permissionList.isEmpty()) {
ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), REQUEST_CODE);
} else {
//doSomething
mListener.onGranted();
}
}
//当用户拒绝或者同意权限时的回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE:
if (grantResults.length > 0) {
List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String permission = permissions[i];
if (grantResult != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permission);
}
}
if (deniedPermissions.isEmpty()) {
mListener.onGranted();
} else {
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
}
2.这里我们定义了一个接口类IPermission通过接口的方式,想调用者提供权限被允许时的回调和被拒绝时的回调:
public interface IPermission {
//权限被允许时的回调
void onGranted();
//权限被拒绝时的回调, 参数:被拒绝权限的集合
void onDenied(List<String> deniedPermissions);
}
3.使用方法,传入你需要的权限,就可以了:
//这里我传入了两个权限:CALL_PHONE 和WRITE_EXTERNAL_STORAGE
BaseActivity.requestRunTimePermission(new String[]{Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new IPermission() { //用户同意时的回调
@Override
public void onGranted() {
doSomeThing();
}
//用户拒绝时的回调,并打印出具体拒绝了什么权限
@Override
public void onDenied(List<String> deniedPermissions) {
for (String deniedPermission : deniedPermissions) {
Toast.makeText(MainActivity.this, "被拒绝的权限是"+deniedPermission, Toast.LENGTH_SHORT).show();
}
}
});
}
最后附上ActivityCollector类的代码:
public class ActivityCollector {
private static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void fillActivity() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
activities.clear();
}
public static Activity getTopActivity() {
return activities.get(activities.size()-1);
}
}