场景
最近做一个保存应用的图片并插入到系统图库同时通知相册刷新的功能,做完后发现在部分华为和三星的手机上出现虽然图片保存成功了,但是相册却找不到图片的问题,很困惑,查找文件夹图片也已经存在,可就是在相册里刷新不出来。最后百般尝试找到了解决办法:
- 保存的方法添加写入的动态权限
- 创建文件路径可选择Environment.getExternalStorageDirectory(),也就是(/storage/emulated/0/com.xx.xxx.xxx/),之前有问题的版本使用的是context.getExternalFilesDir(null)也就是(/storage/sdcard/Android/data/com.xxx.xxx/),部分手机相册无法找到此路径或者没有权限,具体我也没细研究
- 使用MediaStore插入到系统相册
- 使用广播Intent.ACTION_MEDIA_SCANNER_SCAN_FILE通知相册刷新
下面是具体实现:
@NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE})
public void saveImageToGallery(Bitmap bitmap) {
// 首先保存图片
File file = null;
String fileName = System.currentTimeMillis() + ".jpg";
File root = new File(Environment.getExternalStorageDirectory(), getPackageName());
File dir = new File(root, "images");
if (dir.mkdirs() || dir.isDirectory()) {
file = new File(dir, fileName);
}
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(this.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 通知图库更新
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
MediaScannerConnection.scanFile(this, new String[]{file.getAbsolutePath()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(uri);
sendBroadcast(mediaScanIntent);
}
});
} else {
String relationDir = file.getParent();
File file1 = new File(relationDir);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(file1.getAbsoluteFile())));
}
}
申请动态权限自己添加,实现了这些问题就解决了,目前手上的机型相册都可以正常拿到保存的图片了。