我有一个选择并保存个人资料图片的活动。有一个图像视图和一个按钮,该按钮启动结果等待用户选择图像的图库活动。当图库关闭时,执行以下代码:
@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时,它就出问题了。
ls -l
来查看文件是否仍然完整。到某个时候,大小会改变,然后你可以从那里缩小范围。 - fadden