最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 圖片保存到相冊不顯示的解決方案(兼容Android 10及更高版本)

 更新時間:2021年04月22日 08:56:00   作者:東慕雨  
這篇文章主要介紹了Android 圖片保存到系統(tǒng)相冊不顯示的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下

前言

寫了一個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)文章!

相關(guān)文章

  • Android HttpURLConnection.getResponseCode()錯誤解決方法

    Android HttpURLConnection.getResponseCode()錯誤解決方法

    在使用HttpURLConnection.getResponseCode()的時候直接報錯是IOException錯誤,一直想不明白,同一個程序我調(diào)用了兩次,結(jié)果有一個鏈接一直O(jiān)K,另一個卻一直報這個錯誤
    2013-06-06
  • android自定義ImageView仿圖片上傳示例

    android自定義ImageView仿圖片上傳示例

    本篇文章主要介紹了android自定義ImageView仿圖片上傳,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Android實現(xiàn)滑動折疊Header全流程詳解

    Android實現(xiàn)滑動折疊Header全流程詳解

    這篇文章主要介紹了Android實現(xiàn)滑動折疊Header,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Android最基本的異步網(wǎng)絡(luò)請求框架

    Android最基本的異步網(wǎng)絡(luò)請求框架

    這篇文章主要為大家詳細(xì)介紹了Android最基本的異步網(wǎng)絡(luò)請求框架,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Flutter通過Container實現(xiàn)時間軸效果

    Flutter通過Container實現(xiàn)時間軸效果

    時間軸是前端UI經(jīng)常用到的效果,本文講解下Flutter如何通過Container實現(xiàn),感興趣的朋友可以了解下
    2021-05-05
  • Android 版本、權(quán)限適配相關(guān)總結(jié)

    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可自定義神奇動效的卡片切換視圖實例

    Android可自定義神奇動效的卡片切換視圖實例

    今天小編就為大家分享一篇關(guān)于Android可自定義神奇動效的卡片切換視圖實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Android在WebView中調(diào)用系統(tǒng)下載的方法

    Android在WebView中調(diào)用系統(tǒng)下載的方法

    這篇文章主要為大家詳細(xì)介紹了Android在WebView中調(diào)用系統(tǒng)下載的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android中切換到主線程執(zhí)行的方法

    Android中切換到主線程執(zhí)行的方法

    這篇文章主要介紹了Android中切換到主線程執(zhí)行的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android Listview點贊問題關(guān)于圖片重復(fù)問題

    Android Listview點贊問題關(guān)于圖片重復(fù)問題

    最近在開發(fā)android方面的項目時,遇到很多問題,下面小編以listview 與 baseadapter結(jié)合使用為例,給大家分享下關(guān)于點贊的的時候 圖片重復(fù)問題的解決方法,一起看看吧
    2016-11-11

最新評論

射洪县| 凤冈县| 徐汇区| 突泉县| 广安市| 米脂县| 景德镇市| 镇远县| 遂宁市| 临城县| 莱阳市| 邮箱| 丹棱县| 大厂| 鄱阳县| 翼城县| 景泰县| 湘阴县| 铜川市| 五峰| 郴州市| 遂川县| 西峡县| 建昌县| 邵阳县| 吉林省| 宜阳县| 登封市| 申扎县| 金山区| 乐平市| 北川| 辛集市| 阳高县| 天镇县| 涞水县| 雅安市| 永登县| 新闻| 浮梁县| 扶余县|