Android6.0动态权限的处理

网上对于动态权限的处理已经有了很多资料,我也总结总结。

  • 1.在Activity中申请权限
private void checkWriteExternalPermission() {
    int result = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (result == PackageManager.PERMISSION_DENIED) { //如果是权限拒绝
        //申请权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        Log.d(TAG, "checkWriteExternalPermission 申请权限");
    } else {  //有权限
        //创建文件夹
        DownLoadManager.getInstance().createDownloadDir();
    }
}
//这个方法是  requestPermissions() 的回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    //由于只请求了一个权限,所以数组中只有一个元素,判断这个权限系统是否已经授权
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        //创建文件夹
        DownLoadManager.getInstance().createDownloadDir();
    } else {
        Toast.makeText(this, "权限拒绝", Toast.LENGTH_SHORT).show();
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
  • 2.在Fragment中申请权限
public class VbangFragment extends BaseFragment {

    private static final String TAG = "VbangFragment";

    @BindView(R.id.list_view)
    ListView mListView;

    private MusicListCursorAdapter mMusicListCursorAdapter;

    @Override
    public int getLayoutResId() {
        return R.layout.fragment_vbang;
    }

    @Override
    protected void init() {
        super.init();
        mMusicListCursorAdapter = new MusicListCursorAdapter(getContext(), null, false);
        mListView.setAdapter(mMusicListCursorAdapter);
        mListView.setOnItemClickListener(mOnItemClickListener);
        //查询音乐之前先检查是否有读磁盘权限
        if (hasReadExternalStoragePermission()) {
            //有权限则去查询
            MusicDataManager.getInstance().queryMusic(getContext(), mMusicListCursorAdapter);
        } else {
            //申请权限
            requestReadExternalStorage();
        }
    }

    private void requestReadExternalStorage() {
        String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
        requestPermissions(permissions, 0);//请求权限
    }

    private boolean hasReadExternalStoragePermission() {
        return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE);
    }


    private AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent(getContext(), MusicPlayerActivity.class);
            //传入入标题 歌手 歌曲的路径
/*            Cursor cursor = (Cursor) mMusicListCursorAdapter.getItem(position);
            MusicItemBean itemBean = MusicItemBean.parseFromCursor(cursor);
            intent.putExtra("title", itemBean.getTitle());
            intent.putExtra("artist", itemBean.getArtist());
            intent.putExtra("data", itemBean.getData());*/

//            intent.putExtra("item", itemBean);//将itembean序列化整个传给MusicPlayerActivity

            //数据已经由数据模块查询出来了,传入position告诉MusicPlayerActivity,MusicPlayerActivity拿到位置后,
            //通过位置向数据模块MusicDataManager要对应的音乐数据
            intent.putExtra("position", position);
            startActivity(intent);
        }
    };


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d(TAG, "onRequestPermissionsResult: ");
        switch (requestCode) {
            case 0:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //用户同意权限
                    MusicDataManager.getInstance().queryMusic(getContext(), mMusicListCursorAdapter);
                } else {
                    Toast.makeText(getContext(), "权限被拒绝,无法获取音乐数据", Toast.LENGTH_SHORT).show();
                }
                break;

        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
  • 3.使用Permissionsdispatcher库进行权限管理
compile 'com.github.hotchemi:permissionsdispatcher:2.3.1'
annotationProcessor 'com.github.hotchemi:permissionsdispatcherprocessor:2.3.1'
  • 3.1 创建方法,该方法中执行获取权限后的操作
    @NeedsPermission(Manifest.permission.CAMERA)
    void showCamera() {

    }
  • 3.2 在Activity上添加注解
@RuntimePermissions
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  • 3.3 rebuild工程
  • 3.4 在需要权限的时候调用以下代码
MainActivityPermissionsDispatcher.showCameraWithCheck(this);
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // NOTE: delegate the permission handling to generated method
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值