今天在Fragment申请运行时相机权限时一直没有回调、不知道怎么回事、而且每测试一次都要重新安装一下、非常麻烦
Fragment中运行时权限的特殊处理、在Fragment中申请权限、不要使用ActivityCompat.requestPermissions、直接使用Fragment的requestPermissions方法、否则会回调到Activity的 onRequestPermissionsResult
private void runPermission(){
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
//ActivityCompat.requestPermissions(getActivity(),
// new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
//以下是直接使用Fragment的requestPermissions方法
requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}else {
startCamera();//此处改为你的逻辑函数
}
}
然后在Fragment中继承onRequestPermissionsResult方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
startCamera();//此处改为你的逻辑函数
} else {
// Permission Denied
Toast.makeText(getActivity(), "访问被拒绝!", Toast.LENGTH_SHORT).show();
}
}
}
如果在Fragment中嵌套Fragment、在子Fragment中使用requestPermissions方法、onRequestPermissionsResult不会回调回来、建议使用 getParentFragment().requestPermissions方法、这个方法会回调到父Fragment中的onRequestPermissionsResult、加入以下代码可以把回调透传到子Fragment
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null) {
fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
}
}
}