拍照闪退的功能是因为8.0系统的权限安全问题:不得不说这真的是环信的一个坑 我看环信easeUI上 EaseCompat 这类创建的时间是 2018-6-6 我是2018-10-5左右开始第一次导入环信sdk的,怎么修复这个bug呢 下面直接上代码:
这是环信的代码 - 安卓6.0以后要动态获取用户权限这个要自己实现一下
cameraFile = new File(PathUtil.getInstance().getImagePath(), EMClient.getInstance().getCurrentUser() +System.currentTimeMillis() + ".jpg");
//noinspection ResultOfMethodCallIgnored
cameraFile.getParentFile().mkdirs(); startActivityForResult( new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, EaseCompat.getUriForFile(getContext(), cameraFile)), REQUEST_CODE_CAMERA);
cameraFile = new File(PathUtil.getInstance().getImagePath(), EMClient.getInstance().getCurrentUser() +System.currentTimeMillis() + ".jpg");
//noinspection ResultOfMethodCallIgnored
cameraFile.getParentFile().mkdirs(); startActivityForResult( new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, EaseCompat.getUriForFile(getContext(), cameraFile)), REQUEST_CODE_CAMERA);
EaseCompat.getUriForFile(getContext(), cameraFile) 调用环信 EaseCompat工具类 如下:
public static Uri getUriForFile(Context context, File file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//报错的地方-只有安卓N以上才有
return FileProvider.getUriForFile(context, context.getPackageName() +".fileProvider", file);;
}else {
return Uri.fromFile(file);
}
}
![image](https://img.haomeiwen.com/i15555141/143a8d764688ac44?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
解决方法①在AndroidMainifest.xml文件中添加:
<android:name="你的包名.RongFileProvider"
android:authorities="com.example.administrator.imbobo.FileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="name,resource"/>
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="" name="camera_photos" />
</paths>
</PreferenceScreen>
②创建一个空的 RongFileProvider 继承FileProvider 这里什么都不做在XML文件中配置
public class RongFileProviderextends android.support.v4.content.FileProvider {
}
//判读是否授予相机权限
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
/**
* 在Fragment中申请权限,不要使用ActivityCompat.requestPermissions,
* 直接使用Fragment的requestPermissions方法,否则会回调到Activity的
* requestCode 以后要声明为常量static final int TAKE_PHOTO_REQUEST_CODE = 1
*/
requestPermissions(new String[]{Manifest.permission.CAMERA},
1);
}else {//权限已经被授予,在这里直接写要执行的相应方法即可
// 跳转到系统的拍照界面
Intent intentToTakePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//创建路径路径转文件
cameraFile = new File(Environment.getExternalStorageDirectory() + File.separator + "photo.jpeg");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//安卓N以上操作系统
Uri imageUri = RongFileProvider.getUriForFile(getContext(), "com.example.administrator.imbobo.FileProvider",
cameraFile);
//下面这句指定调用相机拍照后的照片存储的路径
intentToTakePhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentToTakePhoto, REQUEST_CODE_CAMERA);
} else {
//安卓N以下操作系统
cameraFile.getParentFile().mkdirs();
startActivityForResult(
new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, EaseCompat.getUriForFile(getContext(), cameraFile)),
REQUEST_CODE_CAMERA);
}
}
别忘了还要处理权限申请的回掉
//用户选择允许或拒绝 权限后的处理
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode,grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
} else {
// Permission Denied
Toast.makeText(getContext(),"您没有允许相机权限",Toast.LENGTH_SHORT).show();
}
}
}
网友评论