Android6.0运行时权限笔记。

视频链接:点击打开链接


代码

第一步:先写一个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();
                        }
                    }
                });
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值