安卓保存視頻和圖片之后相冊不刷新的問題總結


最近在做項目中遇到保存照片和視頻,本地已經保存而在相冊和項目中不能找到,這里做一個簡單的總結

在本地保存之后需要吧文件發送到本地或者廣播的方式刷新相冊

1.照片發送到相冊

//把文件插入到系統圖庫
/**
     * @param context
     * @param targetFile 要保存的照片文件
     * @param path  要保存的照片的路徑地址
     */
    public static void addMediaStore(Context context, File targetFile, String path) {
        ContentResolver resolver = context.getContentResolver();
        ContentValues newValues = new ContentValues(5);
        newValues.put(MediaStore.Images.Media.DISPLAY_NAME, targetFile.getName());
        newValues.put(MediaStore.Images.Media.DATA, targetFile.getPath());
        newValues.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000);
        newValues.put(MediaStore.Images.Media.SIZE, targetFile.length());
        newValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, newValues);
        MediaScannerConnection.scanFile(context, new String[]{path}, null, null);//刷新相冊
    }
示例代碼
   addMediaStore(chatActivity, mFile, mFile.getAbsolutePath());
(上下文,文件,和文件的路徑)
2.視頻發送到相冊
//針對非系統影音資源文件夾
public static void insertIntoMediaStore(Context context, boolean isVideo, File saveFile, long createTime) {
        ContentResolver mContentResolver = context.getContentResolver();
        if (createTime == 0)
            createTime = System.currentTimeMillis();
        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.TITLE, saveFile.getName());
        values.put(MediaStore.MediaColumns.DISPLAY_NAME, saveFile.getName());
        //值一樣,但是還是用常量區分對待
        values.put(isVideo ? MediaStore.Video.VideoColumns.DATE_TAKEN
                : MediaStore.Images.ImageColumns.DATE_TAKEN, createTime);
        values.put(MediaStore.MediaColumns.DATE_MODIFIED, System.currentTimeMillis());
        values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis());
        if (!isVideo)
            values.put(MediaStore.Images.ImageColumns.ORIENTATION, 0);
        values.put(MediaStore.MediaColumns.DATA, saveFile.getAbsolutePath());
        values.put(MediaStore.MediaColumns.SIZE, saveFile.length());
        values.put(MediaStore.MediaColumns.MIME_TYPE, isVideo ? getVideoMimeType下面的方法/*"video/3gp"*/ : "image/jpeg");
        //插入
        mContentResolver.insert(isVideo
                ? MediaStore.Video.Media.EXTERNAL_CONTENT_URI
                : MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    }

//這里是一個調用的示例代碼(上下文,是否為視頻,文件,時間)
 insertIntoMediaStore(chatActivity,true,dest,0);
這個也可作為相冊刷新圖庫

這里需要一個獲取視頻格式的相關方法
// 獲取video的mine_type,暫時只支持mp4,3gp
    private static String getVideoMimeType(String path) {
        String lowerPath = path.toLowerCase();
        if (lowerPath.endsWith("mp4") || lowerPath.endsWith("mpeg4")) {
            return "video/mp4";
        } else if (lowerPath.endsWith("3gp")) {
            return "video/3gp";
        }
        return "video/mp4";
    }

3.通用的方法(發送廣播來通知相冊刷新)

 /**
     * 針對系統文夾只需要掃描,不用插入內容提供者,不然會重復
     *
     * @param context  上下文
     * @param filePath 文件路徑
     */private static void scanFile(Context context, String filePath) {
        if (!checkFile(filePath))
            return;
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(new File(filePath)));
        context.sendBroadcast(intent);
    }
調用示例(上下文,和文件的路徑)
scanFile(chatActivity,/*FileUtil.getCacheFilePath(video_file_name)*/ dest.getAbsolutePath());

綜上,這里都是系統的方法,根據項目稍微一做修改,可以直接調用根據自己需求稍作修改

 

 

leileitua

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM