【问题标题】:Saved bitmap in android is 3 bytes long when readandroid中保存的位图读取时长3个字节
【发布时间】:2015-02-20 01:30:27
【问题描述】:

我有一个活动可以选择并保存个人资料图片。有一个图像视图和一个按钮,用于启动画廊活动以获得结果,等待用户选择图像。当画廊关闭时,执行以下代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if ((resultCode == RESULT_OK) && (requestCode == SELECT_PHOTO)) {
        Uri selectedImage = data.getData();

        try {
            Bitmap image = this.decodeAndScaleImage(selectedImage, 285);
            imgInsertPicture.setImageBitmap(image);

            this.imagePresent = true;
            this.saveMyProfilePicture(image);
            this.popImageView();
        } catch (IOException e) {
            e.printStackTrace();
            showToast(R.string.error_saving_picture);
        }
    }
}

private void saveMyProfilePicture(Bitmap picture) throws IOException {
    FileOutputStream outputStream = openFileOutput(Globals.MY_PICTURE_FILE_NAME, MODE_PRIVATE);
    picture.compress(Globals.MY_PICTURE_FORMAT, 90, outputStream);
    outputStream.close();

    ByteArrayOutputStream rawOutputStream = new ByteArrayOutputStream();
    picture.compress(Globals.MY_PICTURE_FORMAT, 90, rawOutputStream);

    byte[] rawPictureData = rawOutputStream.toByteArray();
    rawOutputStream.close();

    byte[] base64PictureData = Base64.encode(rawPictureData, Base64.DEFAULT);
    rawPictureData = null;

    FileOutputStream base64OutputStream = openFileOutput(Globals.MY_PICTURE_B64_FILE_NAME, MODE_PRIVATE);
    base64OutputStream.write(base64PictureData);
    base64OutputStream.close();
}

我调试了这段代码并验证了: - 不抛出异常; - 写入的文件包含确切的数据量(jpg 图像为 17kB,base64 版本为 24kB); - 生成的位图是我所期望的并且在图像视图中正确显示。

popImageView 仅用于在选择图像之前将图像视图放在前面的其他视图之上;而decodeAndScale方法只对内存中的位图数据有效,不保存任何东西。

但是,当我尝试在活动启动时重新加载当前图片时,显示的图像是空白的,并且 jpeg 文件只包含 3 个字节:

@Override
public void onStart() {
    super.onStart();

    if (!imagePresent && pictureExists()) {
        File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME);
        imgInsertPicture.setImageURI(Uri.fromFile(pictureFile));
        popImageView();
        imagePresent = true;
    }
}

这里 pictureExists 检查文件名是否包含在 listFiles() 返回的集合中。 pictureFile.exists() 返回 true,但正如我所说,它只包含 3 个字节。我也试过用BitmapFactory.decodeX,但是因为文件坏了,就没用了。

我不明白为什么。我检查了该文件是否已完全写入,然后它消失了... 当我在 Nexus S 上进行调试时,代码运行良好,但后来我切换到 Nexus 5,它就坏了。

【问题讨论】:

  • 如果文件被正确读取,但后来发现被截断,那么有些东西正在覆盖您的文件。调试此问题的一种方法是在程序的各个点添加“现在有多大”检查,或者在从 adb shell 频繁执行ls -l 时使用调试器来查看文件是否仍然完好无损。在某个时候,大小会发生变化,您可以从那里缩小范围。
  • 我已经做到了:只有在第一次调用onStart方法时读取大小不同。
  • 所以onStart()中的大小是错误的,但是从adb shell查看大小还是正确的?还是您的读取功能误读了文件的长度?或者你是说启动活动的行为是截断文件?如果在 onStart() 方法入口处设置断点,那么文件是否已经被截断?活动是如何启动的——启动它的任何东西都知道这个文件吗?文件存储在哪里?还有什么可以访问它的?
  • 嗯...现在可以了,但是我根本没有碰过代码...现在图像大小是正确的。我很困惑,我一直在做这个项目,留下这个活动等待答案:S
  • 我建议你看看这个教程:androidhive.info/2014/12/…

标签: java android bitmap


【解决方案1】:

您是否尝试过使用 BitmapFactory 将文件解码为位图?

http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String)

以下代码没有测试过,可以试试吗:

File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME);

Bitmap bitmapImage = BitmapFactory.decodeFile(Uri.fromFile(pictureFile));
imgInsertPicture.setImageBitmap(bitmapImage);
popImageView();
imagePresent = true;

【讨论】:

    【解决方案2】:

    在你的 onActivityResult 中试试这个

     Uri selectedImage = data.getData();
     String[] filePathColumn = {MediaStore.Images.Media.DATA};
    
     Cursor cursor = getActivity().getContentResolver().query(
                               selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();
    
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();
    
    
            selectedImagePath =filePath;
    

    然后使用 selectedImagePath 作为文件路径。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多