Android 圖片保存到相冊不顯示的解決方案(兼容Android 10及更高版本)
前言
寫了一個demo,簡單邏輯就是:在一個圖片上添加一行文字或者是水印,并且保存到系統(tǒng)相冊,也就是我們手機(jī)上的圖庫。前面編輯圖片添加水印都沒有問題,到后面保存到系統(tǒng)相冊出現(xiàn)了問題:顯示不出來圖片。
問題
在 Android 10 之前保存系統(tǒng)相冊的三步驟:
- 保存圖片到手機(jī)
- 把圖片插入到手機(jī)圖庫
- 發(fā)廣播更新
代碼如下:
public static void savePhotoAlbum(Context context, Bitmap bmp) {
// 首先保存圖片
File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系統(tǒng)圖庫
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.parse("file://" + path)));
}
出現(xiàn)的問題:圖片不顯示,也就是說沒有更新到系統(tǒng)圖庫中。
細(xì)心的小伙伴會發(fā)現(xiàn),上段代碼有兩處地方廢棄的方法:
MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
解決問題
下面是解決上面的問題,并兼容 Android10 版本:
/**
* 添加水印并保存到系統(tǒng)相冊
*/
private void imgMerge() {
new Thread(() -> {
try {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "newFile.jpg");
if (!file.exists()) {
file.createNewFile();
}
//添加水印文字位置。
Bitmap newBitmap = addTextWatermark(bitmap, "測試demo示例");
//保存到系統(tǒng)相冊
savePhotoAlbum(newBitmap, file);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
/**
* 保存到相冊
*
* @param src 源圖片
* @param file 要保存到的文件
*/
private void savePhotoAlbum(Bitmap src, File file) {
if (isEmptyBitmap(src)) {
return;
}
//先保存到文件
OutputStream outputStream;
try {
outputStream = new BufferedOutputStream(new FileOutputStream(file));
src.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
if (!src.isRecycled()) {
src.recycle();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//再更新圖庫
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, getMimeType(file));
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
ContentResolver contentResolver = getContentResolver();
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri == null) {
return;
}
try {
outputStream = contentResolver.openOutputStream(uri);
FileInputStream fileInputStream = new FileInputStream(file);
FileUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
MediaScannerConnection.scanFile(
getApplicationContext(),
new String[]{file.getAbsolutePath()},
new String[]{"image/jpeg"},
(path, uri) -> {
// Scan Completed
});
}
}
發(fā)送廣播和插入MediaProvider兩種方式添加圖片到相冊,這兩種方式已經(jīng)官方廢棄了。在 Android 10版本以及更高版本使用上面的方法,才能有效解決不顯示圖片的問題。
做個記錄!
以上就是Android 圖片保存到系統(tǒng)相冊不顯示的解決方案(兼容Android 10及更高版本)的詳細(xì)內(nèi)容,更多關(guān)于Android 圖片保存到相冊不顯示的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android 版本、權(quán)限適配相關(guān)總結(jié)
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時的問題
- 詳解如何在Android studio中更新sdk版本和build-tools版本
- Android Studio下載、安裝和配置+SDK+tools下載(無敵超級詳細(xì)版本)
- Android Studio3.6.3 當(dāng)前最新版本數(shù)據(jù)庫查找與導(dǎo)出方法(圖文詳解)
- 詳解Android studio 3+版本apk安裝失敗問題
- android studio 打包自動生成版本號與日期,apk輸入路徑詳解
- Android開發(fā)獲取手機(jī)Mac地址適配所有Android版本
- Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本
- 詳解Android版本適配:9.0 Pie
- Android ProductFlavor的使用詳解
相關(guān)文章
Android HttpURLConnection.getResponseCode()錯誤解決方法
在使用HttpURLConnection.getResponseCode()的時候直接報錯是IOException錯誤,一直想不明白,同一個程序我調(diào)用了兩次,結(jié)果有一個鏈接一直O(jiān)K,另一個卻一直報這個錯誤2013-06-06
Android實(shí)現(xiàn)滑動折疊Header全流程詳解
這篇文章主要介紹了Android實(shí)現(xiàn)滑動折疊Header,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11
Android最基本的異步網(wǎng)絡(luò)請求框架
這篇文章主要為大家詳細(xì)介紹了Android最基本的異步網(wǎng)絡(luò)請求框架,感興趣的小伙伴們可以參考一下2016-04-04
Flutter通過Container實(shí)現(xiàn)時間軸效果
時間軸是前端UI經(jīng)常用到的效果,本文講解下Flutter如何通過Container實(shí)現(xiàn),感興趣的朋友可以了解下2021-05-05
Android 版本、權(quán)限適配相關(guān)總結(jié)
針對 Android 6.0 (API 23)已以上版本,Google 增強(qiáng)全新的權(quán)限,應(yīng)用程序在使用敏感權(quán)限(如拍照、查閱聯(lián)系人或存儲)時需要先征求用戶必須贏得用戶同意。2021-05-05
Android在WebView中調(diào)用系統(tǒng)下載的方法
這篇文章主要為大家詳細(xì)介紹了Android在WebView中調(diào)用系統(tǒng)下載的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Android Listview點(diǎn)贊問題關(guān)于圖片重復(fù)問題
最近在開發(fā)android方面的項目時,遇到很多問題,下面小編以listview 與 baseadapter結(jié)合使用為例,給大家分享下關(guān)于點(diǎn)贊的的時候 圖片重復(fù)問題的解決方法,一起看看吧2016-11-11

