背景

为了交付更好的apk,于是我就把我能想到的功能都给测试一遍,没想到这一测还真出现了一个致命的bug,之前的文章中也有介绍过将内容如何生成长体保存到本地,这次的问题就是保存图片失败,还能提示保存成功的文字。

之前保存图片的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static String saveBitmap(Context context, Bitmap mBitmap) {
String savePath;
File filePic;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
savePath = SD_PATH;
} else {
//savePath = context.getExternalFilesDir(null).getAbsolutePath();
savePath = context.getApplicationContext().getFilesDir()
.getAbsolutePath()
+ IN_PATH;
}
try {
filePic = new File(savePath + generateFileName() + ".jpg");//保存的格式为jpg
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
filePic.createNewFile();
//filePic.mkdirs();
}
FileOutputStream fos = new FileOutputStream(filePic);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
//插入系统相册
MediaStore.Images.Media.insertImage(context.getContentResolver(), filePic.getAbsolutePath(), savePath, "团纸日记图片集");
Uri uri = Uri.fromFile(new File(savePath));
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(uri);
context.sendBroadcast(intent);
Toast.makeText(context, "保存成功", Toast.LENGTH_LONG).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(context, "保存失败", Toast.LENGTH_LONG).show();
return null;
}
return filePic.getAbsolutePath();
}

现在保存的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void saveImage2Gallery(Context context, Bitmap bmp) {
//检查有没有存储权限
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(context, "请至权限中心打开应用权限", Toast.LENGTH_LONG).show();
} else {
// 新建目录appDir,并把图片存到其下
File appDir = new File(context.getExternalFilesDir(null).getPath()+ "BarcodeBitmap");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
Toast.makeText(context, "保存成功", Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(context, "保存失败", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context, "保存失败", Toast.LENGTH_LONG).show();
}

// 把file里面的图片插入到系统相册中
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}


// 通知相册更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
}
}

对于之前保存图片的逻辑我写的就有问题,我是在执行了saveBitmap这个方法之后直接写了一个Toast,这样就会导致不管是这个方法失败,或者这个方法成功都会执行这个成功的Toast。后来我就把这个问题给修复了,在saveBitmap这个方法中执行成功的末尾添加成功保存图片的提示,跳出异常的末尾添加保存失败的提示。

还有一个问题就是我在用之前的方法来保存图片的时候是没有问题的,突然之间就不行了,我通过打印的方式发现在执行完这行代码之后 filePic = new File(savePath + generateFileName() + “.jpg”);直接跳出异常了,返回一个空对象。我再网上查了说是需要使用这个File(context.getExternalFilesDir(null).getPath()+ “BarcodeBitmap”);来创建文件,而之前的方法是通过这个context.getApplicationContext().getFilesDir() .getAbsolutePath()来创建文件夹的。最根本的原因其实我也不清楚,这也是我学的东西还都比较浅的原因,这个问题先记着,等我复盘。不过值得万幸的的是最后解决了保存失败,返回空对象的异常。