Android:如何将相机结果保存到私人文件

Nat*_*lor 7 android android-camera-intent

我试图从相机中获取图像并将其直接保存到我的应用程序的私人文件目录中.出于安全考虑,图像不应随时公开访问.

通常,您授予对私有文件的临时访问权限的方式是使用ContentProvider并在Intent中设置GRANT_WRITE_URI_PERMISSION标志.按照FileProvider中的文档,我完成了以下操作:

AndroidManfiest.xml

<manifest> 
    ...
    <application>
        ...
        <provider
            android:authorities="com.my.domain"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
Run Code Online (Sandbox Code Playgroud)

RES/XML/file_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
</paths>
Run Code Online (Sandbox Code Playgroud)

启动相机活动时,我从活动中执行以下操作:

File imageFile = getInternalImageFile();
Uri captureUri = FileProvider.getUriForFile(this, "com.my.domain", imageFile);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// grant temporary access to the file
intent.setData(captureUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

// tell the camera where to save the file
intent.putExtra(MediaStore.EXTRA_OUTPUT, captureUri);

startActivityForResult(intent, IMAGE_CAPTURE_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

然而,这导致相机应用程序立即返回而不做任何事情.我怀疑因为它不期望在intent上有任何数据集(Intent.setData()).

上述策略运作得不是很好.那么,如何将从相机捕获的图像直接安全地保存到我应用程序的私人文件目录中?

小智 9

我有同样的问题,但我使用clipData解决了它.

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setClipData(ClipData.newRawUri(null, contentUri));
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
Run Code Online (Sandbox Code Playgroud)

http://developer.android.com/reference/android/content/Intent.html#setClipData(android.content.ClipData)

意图中的ClipData不用于Intent匹配或其他此类操作.从语义上讲,它就像额外的一样,用于通过Intent传输额外的数据.使用此功能的主要功能是数据的附加功能是FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION将对剪辑数据中包含的任何URI项进行操作.特别是,如果要传输包含多个内容的Intent,这将非常有用:收件人可能没有访问内容提供者的全局权限的URI.

我希望这能帮助你.

Pd:对不起我的英文.:)

  • 嗨,我在设置*contentURI*时有困难,是否与问题中的*captureUri*类似?关于定义*contectURI*的一些代码真的会有很大的帮助. (4认同)

Com*_*are 1

那么,如何安全地将相机捕获的图像直接保存到应用程序的私有文件目录中?

使用 自己拍摄照片android.hardware.Camera。无法保证用户将拥有一个知道如何将数据保存到content:// Uri路径的相机应用程序。他们应该支持他们,但并非所有人都支持。例如,Google 相机应用在 2016 年 6 月之前不支持content:// Uria ACTION_VIDEO_CAPTURE