在读取时,Android中保存的位图只有3个字节长

9

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

@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来查看文件是否仍然完整。到某个时候,大小会改变,然后你可以从那里缩小范围。 - fadden
我已经做了这个:只有在第一次调用 onStart 方法时读取时,大小才会不同。 - Totem
在onStart()中大小是错误的,但从adb shell查看时大小仍然正确?还是您的读取函数错误地读取了文件的长度?或者您是否在说启动活动的行为正在截断文件?如果在onStart()方法入口处设置断点,那么文件是否已经被截断了?活动是如何启动的 - 启动它的任何内容是否知道此文件?文件存储在哪里?还有谁可以访问它? - fadden
嗯...现在它可以工作了,但我根本没有碰过代码...现在图像大小是正确的。我很困惑,我一直在继续项目的工作,把这个问题留在后面等待答案 :S - Totem
我建议您查看这个教程:http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/ - M D P
2个回答

0

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

希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接