Android中图片保存到本地,并及时更新到系统相册

由于各个手机厂商对原声Android系统的阉割,造成在各种手机上做测试时,通过App保存的图片不能迅速的显示在系统相册内。本实验所使用的测试机是红米2A(Ps: 雷神着实给手机阉割的很是难受啊,简直了), 可以完美的做到将图片保存到本地,并及时更新到系统相册.

国际惯例,先上代码

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
40
/**
* 保存到指定目录,但能立即更新到系统相册中(红米2)
*
* @param context 上下文环境
* @param faceBitmap 位图资源
* @return 保存图片的路径
*/
private String saveBitmapToJpg(Context context, Bitmap faceBitmap) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
Log.i(TAG, "SD *****>> SD卡不存在");
} else {
Log.i(TAG, "SD *****>> SD卡 存在");
}

// 创建图片保存目录
File faceImgDir = new File(Environment.getExternalStorageDirectory(), "ForumAlbum");
if (!faceImgDir.exists()) {
faceImgDir.mkdir();
}

// 以系统时间命名文件
String faceImgName = "forum-" + String.valueOf(System.currentTimeMillis()) + ".jpg";
File file = new File(faceImgDir, faceImgName);

try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
faceBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}

// 保存后要扫描一下文件,及时更新到系统目录(一定要加绝对路径,这样才能更新)
MediaScannerConnection.scanFile(context,
new String[]{Environment.getExternalStorageDirectory() + File.separator + "ForumAlbum" + File.separator + faceImgName}, null, null);

return (Environment.getExternalStorageDirectory() + File.separator + "ForumAlbum" + File.separator + faceImgName);
}

注释已经比较清晰,就不啰嗦了


添加权限

1
2
3
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

可能遇到的问题

< 1 > 使用广播的问题:

在Android 4.4中或之后的版本,若采用如下方式更新系统相册:

1
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

将会抛出如下异常:(这是由Android 4.4中限制了系统应用才有权限使用广播通知系统扫描SD卡, 且这种方法耗时间)

1
Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2269, uid=20016

< 2 > 解决方案:

使用MediaScannerConnection对具体文件或文件夹进行扫描。

(扫描文件夹方式在部分定制rom中无效,极力建议扫描具体文件)

1
MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/" + fileName}

END

0%