美文网首页环信
集成环信 安卓8.0 闪退的问题

集成环信 安卓8.0 闪退的问题

作者: 华人有为 | 来源:发表于2018-12-23 00:54 被阅读43次

拍照闪退的功能是因为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();
            }
        }
    }

相关文章

网友评论

    本文标题:集成环信 安卓8.0 闪退的问题

    本文链接:https://www.haomeiwen.com/subject/gvkgkqtx.html