zoukankan      html  css  js  c++  java
  • 安卓相机调用适配

    项目中IM发送图片拍照时调用相机崩溃,也没有报错,最后排查为系统问题需要进行适配

    调用相机在6.0版本上需要进行适配

    1、AndroidManifest.xml 内操作

    <!-- FileProvider配置访问路径,适配7.0及其以上 -->
    <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.yulin.merchant.fileprovider"//注意:
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />
    </provider>
    //注意:com.yulin.merchant为你的包名、    .fileprovider这个后面有用到不能随意改

    2、创建file_paths.xml文件
    在 项目 res 下面创建 xml 文件夹,xml文件夹下创建 file_paths.xml 文件,文件内写如下:内容
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path path="Android/data/com.yulin.merchant" name="files_root" />
        <external-path path="." name="external_storage_root" />
    </paths>
    
    3、记得求权限获取
     if (rxPermissions != null) {
                                    rxPermissions.request(Manifest.permission.CAMERA/*, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE*/).subscribe(new Consumer<Boolean>() {
                                        @Override
                                        public void accept(Boolean granted) throws Exception {
                                            if (granted) {
                                                chatView.sendPhoto();
                                            }
                                        }
                                    });
                                }
    
    
    

      注意:权限动态获取

    4、正儿八经的调用开始
     
    private File tempFile;

    @Override public void sendPhoto() { Intent intent_photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (intent_photo.resolveActivity(getPackageManager()) != null) { tempFile = FileUtil.getTempFile(FileUtil.FileType.IMG); if (tempFile != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //第二个参数为 包名.fileprovider fileUri = FileProvider.getUriForFile(ChatActivity.this, "com.yulin.merchant.fileprovider", tempFile); intent_photo.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { fileUri = Uri.fromFile(tempFile); } } intent_photo.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(intent_photo, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } }
    com.yulin.merchant.fileprovider 这句话现在和清单文件必须对应
    

      

    
    
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
                if (resultCode == RESULT_OK && fileUri != null) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        showImagePreview(String.valueOf(tempFile));
                    } else {
                        showImagePreview(fileUri.getPath());
                    }
    
                }
            }

     

    private void showImagePreview(String path) {
        if (path == null) return;
        Intent intent = new Intent(this, ImagePreviewActivity.class);
        intent.putExtra("path", path);
        startActivityForResult(intent, IMAGE_PREVIEW);
    }
    

     

      

    回来接收
    String path在7.0之上为
    String.valueOf(tempFile)
    其他为
    fileUri.getPath()
    有了path剩下的你就自由发挥吧


    by leileitua
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/widgetbox/p/11101827.html
Copyright © 2011-2022 走看看