昨天在弄相机的问题,碰到了关于6.0的权限问题,相机打不开,或者是调用图库的时候 获取的图片地址 返回null
然后找了很多资料,,和修改才找到自身需要的.
第1 如果是简单的 在activity页面 做 调用权限问题 这里以相机为主
public static final int REQUEST_CODE=200; public static final int REQUEST_CODE_PICK_IMAGE=300;
private void checkPerm() {
/**1.在AndroidManifest文件中添加需要的权限。
*
* 2.检查权限
*这里涉及到一个API,ContextCompat.checkSelfPermission,
* 主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED
* 或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
* */
if(ContextCompat.checkSelfPermission(this, permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){ //权限没有被授予
/**3.申请授权
* @param
* @param activity The target activity.(Activity|Fragment、)
* @param permissions The requested permissions.(权限字符串数组)
* @param requestCode Application specific request code to match with a result(int型申请码)
* reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(
* int, String[], int[])}.
* */
ActivityCompat.requestPermissions(this,
new String[]{permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE);
}else{//权限被授予
choosePhoto();
//直接操作
}
}
/***
*
* 4.处理权限申请回调
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
//权限被授予
choosePhoto();
} else
{
// Permission Denied
Toast.makeText(TestPhoto.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
void choosePhoto(){
/**
* 打开选择图片的界面
*/
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");//相片类型
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
最后进行回调
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case REQUEST_CODE_PICK_IMAGE: if (resultCode == RESULT_OK) { try { /** * 该uri是上一个Activity返回的 */ Uri uri = data.getData(); Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); iv.setImageBitmap(bit); } catch (Exception e) { e.printStackTrace(); Log.d("tag", e.getMessage()); Toast.makeText(this,"程序崩溃", Toast.LENGTH_SHORT).show(); } } break; } }
************************************** 以上 是 再Activity 中调用********************************************************
************************************** 以下 是 在 Fragment 中调用********************************************************在Activity中 调用权限是用的ActivityCompat.requestPermissions(activity,权限名字,requestCode);
再Fragment中 用的是 Fragment自身携带的方法requestPermissions(权限名字,requestCode)
把 获取权限的地方 替换成if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //权限没有被授予 requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } else {//权限被授予 直接操作 choosePhoto(); }
****************我的需求 再Fragment 里面 有子Fragment 怎么做呢.***********************
再父fragment里类添加 这样的代码, 然后再按上面 怎么实现Fragment的权限就行了!
/*6.0 新特性 * * 回调到父fragment 然后再传到子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); } } } }
第1次 发表文章 勿喷,, 只是为了让自己有1份记录!