android - 文件的图像 URI

标签 android file bitmap uri

我有一个图像 URI,使用以下方法检索:

public Uri getImageUri(Context inContext, Bitmap inImage) {
  ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
  String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
  return Uri.parse(path);
}

这对于需要图像 URI 等的 Intent 来说效果非常好(所以我确定 URI 是有效的)。

但是现在我想把这个Image URI保存到SD卡上的一个文件中。这更困难,因为 URI 并不真正指向 SDCARD 或应用程序上的文件。

我是否必须先从 URI 创建一个位图,然后将位图保存在 SDCARD 上,或者是否有更快的方法(最好是不需要先转换为位图的方法)。

(我看过这个答案,但它返回找不到文件 - https://stackoverflow.com/a/13133974/1683141)

最佳答案

问题是 Images.Media.insertImage() 给你的 Uri 本身并不是图像文件。它是图库中的数据库条目。因此,您需要做的是从该 Uri 读取数据并使用此答案将其写入外部存储中的新文件 https://stackoverflow.com/a/8664605/772095

这不需要创建位图,只需将链接到 Uri 的数据复制到新文件中即可。

您可以使用如下代码使用 InputStream 获取数据:

InputStream in = getContentResolver().openInputStream(imgUri);

更新

这是完全未经测试的代码,但您应该可以这样做:

Uri imgUri = getImageUri(this, bitmap);  // I'll assume this is a Context and bitmap is a Bitmap

final int chunkSize = 1024;  // We'll read in one kB at a time
byte[] imageData = new byte[chunkSize];

try {
    InputStream in = getContentResolver().openInputStream(imgUri);
    OutputStream out = new FileOutputStream(file);  // I'm assuming you already have the File object for where you're writing to

    int bytesRead;
    while ((bytesRead = in.read(imageData)) > 0) {
        out.write(Arrays.copyOfRange(imageData, 0, Math.max(0, bytesRead)));
    }

} catch (Exception ex) {
    Log.e("Something went wrong.", ex);
} finally {
    in.close();
    out.close();
}

关于android - 文件的图像 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21960650/

相关文章:

android - PreferenceFragment 中的 ActionBar 不重新计算高度和字体大小

c++ - iostream 到 zlib 和 C++ 文件?

.net - 使用unsafe标记编译的.NET代码可以在Mono中运行吗?

Android:绘制到不同大小的屏幕时如何管理位图大小?

java - 底部片材回收器 View 支架

java - Android 谷歌放置 API REQUEST_DENIED

Android gradle 在打包 httpmime 时构建重复文件

objective-c - 确定 NSString 中的路径是指向目录还是​​文件?

python - 如何检索目录中最近创建的文件

Android:在 Canvas 内滚动位图