android中保存的位图读取时长度为3个字节

时间:2014-12-21 22:23:04

标签: java android bitmap

我有一项活动可以选择并保存个人资料照片。有一个图像视图和一个按钮,用于启动图库活动以获得用户选择图像的结果。关闭图库后,将执行以下代码:

@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并且它崩溃了。

2 个答案:

答案 0 :(得分:0)

您是否尝试使用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;

答案 1 :(得分:0)

在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作为文件路径。

希望它有所帮助。