【问题标题】:In Nougat Capture Image from Camera and get file from Uri在 Nougat 从相机捕获图像并从 Uri 获取文件
【发布时间】:2017-12-12 21:08:23
【问题描述】:

在 Android Nougat 及以上版本中,从相机意图捕获图像的方法已更改,以下代码对我来说工作正常。

Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                                   // File file = new File(AppGlobal.URI_CAPTURED_IMAGE.getPath());

                                    AppGlobal.URI_CAPTURED_IMAGE = FileProvider.getUriForFile(parent, context.getPackageName() + ".provider", AppGlobal.getOutputMediaFile());
                                }
                                else
                                {
                                    AppGlobal.URI_CAPTURED_IMAGE = Uri.fromFile(AppGlobal.getOutputMediaFile());
                                }
                                camera.putExtra(MediaStore.EXTRA_OUTPUT, AppGlobal.URI_CAPTURED_IMAGE);
                                camera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                                startActivityForResult(camera, WritePostFragment.REQUEST_CODE_PHOTO_CAPTURE);

在 onActivityResult 方法中,我也可以在 ImageViews 中显示捕获的图像。

Glide.with(parent).load(AppGlobal.URI_CAPTURED_IMAGE).centerCrop().into(profilePic_iv);

但是当我使用相同的 uri 来获取文件时,它会说在给定的路径中不存在文件。可能是什么问题?我如何解析 Uri 以获取文件。好像是版本相关的东西。

示例uri如下:

content://com.example.demo.provider/external_files/Camera/IMG_20171213_015646.jpg

【问题讨论】:

    标签: android android-7.0-nougat


    【解决方案1】:

    如何解析 Uri 以获取文件

    你没有。此外,您不需要这样做。您的文件是 AppGlobal.getOutputMediaFile() 返回的任何内容。您需要保留该值(包括将其置于已保存的实例状态Bundle,以防您的进程在相机应用程序处于前台时终止)。请参阅this sample app 了解如何将ACTION_IMAGE_CAPTUREFileProvider 一起使用。

    【讨论】:

    • 实际上我将 uri 作为字符串传递给我的服务,该服务负责将文件上传到服务器。在该服务中,我需要从该 Uri 路径获取文件,因为我无法将文件作为附加项传递
    • @UsmanRana:首先,您可以额外传递一个File,因为FileSerializable。其次,给定File,您可以通过getAbsolutePath() 获取String 的路径。
    • 现在,我知道了。文件的原始 Uri 是 AppGlobal.getOutputMediaFile() 文件给我的那个。 FileProvider 为 Nougats 提供的 Uri 只是为了保持原始路径不暴露。因此,其他应用无法访问它。
    • @UsmanRana:“文件的原始 Uri 是 AppGlobal.getOutputMediaFile() 文件给我的那个”——根据您的使用返回 File,而不是 Uri那个方法。但是,是的,这就是我所指的。 FileProvider Uri 供其他应用程序通过ContentResolver 使用。你不需要那个——File 就足够了。但是,你需要保持这个价值。
    猜你喜欢
    • 2011-10-12
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2015-03-19
    相关资源
    最近更新 更多