视频链接:点击打开链接
代码
第一步:先写一个activity栈管理类
public class ActivityCollector { private static List<Activity> activityList = new ArrayList<>(); public static void addActivity(Activity activity) { activityList.add(activity); } public static void removeActivity(Activity activity) { activityList.remove(activity); } public static Activity getTopActivity() { if (activityList.isEmpty()) { return null; } else { return activityList.get(activityList.size() - 1); } } }第二步:写一个权限管理接口
public interface PermissionListener { // 所有权限被允许。 void onGranted(); // 告知调用方那些权限被拒绝了。 void onDenied(List<String > deniedPersission); }第三步:写一个BaseActivity
public class BaseActivity extends AppCompatActivity { private static PermissionListener mLisenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { ActivityCollector.addActivity(this); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { ActivityCollector.removeActivity(this); super.onDestroy(); } //permissions为要申请的权限数组。 public static void requestRuntimePerimission(String[] permissions, PermissionListener lisenter) { try { Activity topActivity = ActivityCollector.getTopActivity(); if (topActivity == null) { return; } mLisenter = lisenter; List<String> permissionLists = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) { permissionLists.add(permission); } } if (!permissionLists.isEmpty()) { ActivityCompat.requestPermissions(topActivity, permissionLists.toArray(new String[permissionLists.size()]), 1); } else { mLisenter.onGranted(); } } catch (RuntimeException e) { // activity被回收的时候可能会挂掉。所以加一个try catch } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: if (grantResults.length > 0) { List<String> deniedPermission = new ArrayList<>(); for (int i = 0; i < grantResults.length; i++) { int grantResult = grantResults[i]; String permission = permissions[i]; if (grantResult != PackageManager.PERMISSION_GRANTED) { deniedPermission.add(permission); } } if (deniedPermission.isEmpty()) { mLisenter.onGranted(); } else { mLisenter.onDenied(deniedPermission); } } break; } } }
使用:
如果是在activity中,则使这个activity继承BaseActivity。然后直接调用requestRuntimePermission方法即可。
//1.封装运行时权限--设置成透明的activity盖在上面,在用户确认后哦,将activity finish掉。申请权限的方法必须在activity上展示。 //2.rxpermission 利用透明的fragment来实现 public class PermissionActivity extends BaseActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_permission); initParams(); } private void initParams() { findViewById(R.id.btn).setOnClickListener(this); } @Override public void onClick(View view) { requestRuntimePerimission(new String[]{ Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() { @Override public void onGranted() { // 直接执行要做的操作即可 Toast.makeText(getApplicationContext(),"权限全部允许了",Toast.LENGTH_SHORT).show(); } @Override public void onDenied(List<String> deniedPersission) { //⚠️如果用户点击了拒绝不再提醒,那么只会走这个回调。只能提示用户去设置里允许权限。 for (String s : deniedPersission) { Toast.makeText(getApplicationContext(),s+"权限被拒绝了",Toast.LENGTH_SHORT).show(); } } }); } }
如果不在activity中
public class Test { public static void test(final Context context) { BaseActivity.requestRuntimePerimission (new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() { @Override public void onGranted() { // 直接执行要做的操作即可 Toast.makeText(context, "权限全部允许了", Toast.LENGTH_SHORT).show(); } @Override public void onDenied(List<String> deniedPersission) { for (String s : deniedPersission) { Toast.makeText(context, s + "权限被拒绝了", Toast.LENGTH_SHORT).show(); } } }); } }