网上对于动态权限的处理已经有了很多资料,我也总结总结。
- 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);
}