美文网首页Android技术简化开发相册
Android 图片视频保存至系统相册

Android 图片视频保存至系统相册

作者: 差点长成一枚帅哥 | 来源:发表于2021-10-11 15:23 被阅读0次

    保存图片到系统相册

        /**
         * 获取 图片 ContentValue
         * @param paramFile
         * @param paramLong
         * @return
         */
        public static ContentValues getImageContentValues(File paramFile, long paramLong) {
            ContentValues localContentValues = new ContentValues();
            localContentValues.put("title", paramFile.getName());
            localContentValues.put("_display_name", paramFile.getName());
            localContentValues.put("mime_type", "image/jpeg");
            localContentValues.put("datetaken", Long.valueOf(paramLong));
            localContentValues.put("date_modified", Long.valueOf(paramLong));
            localContentValues.put("date_added", Long.valueOf(paramLong));
            localContentValues.put("orientation", Integer.valueOf(0));
            localContentValues.put("_data", paramFile.getAbsolutePath());
            localContentValues.put("_size", Long.valueOf(paramFile.length()));
            return localContentValues;
        }
    
        /**
         * 将图片保存到系统图库
         *
         * @param imageFile
         * @param context
         */
        public static boolean saveImgToSystemAlbum(String imageFile, Context context) {
    
            try {
                ContentResolver localContentResolver = context.getContentResolver();
                ContentValues localContentValues = getImageContentValues(new File(imageFile), System.currentTimeMillis());
                localContentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, localContentValues);
    
                Intent localIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
                final Uri localUri = Uri.fromFile(new File(imageFile));
                localIntent.setData(localUri);
                context.sendBroadcast(localIntent);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
    

    保存视频到系统相册

        /**
         * 获取视频 contentValue
         * @param paramFile
         * @param paramLong
         * @return
         */
        public static ContentValues getVideoContentValues(File paramFile, long paramLong) {
            ContentValues localContentValues = new ContentValues();
            localContentValues.put("title", paramFile.getName());
            localContentValues.put("_display_name", paramFile.getName());
            localContentValues.put("mime_type", "video/mp4");
            localContentValues.put("datetaken", Long.valueOf(paramLong));
            localContentValues.put("date_modified", Long.valueOf(paramLong));
            localContentValues.put("date_added", Long.valueOf(paramLong));
            localContentValues.put("_data", paramFile.getAbsolutePath());
            localContentValues.put("_size", Long.valueOf(paramFile.length()));
            return localContentValues;
        }
    
    
       /**
         * 将视频保存到系统图库
         *
         * @param videoFile
         * @param context
         */
        public static boolean saveVideoToSystemAlbum(String videoFile, Context context) {
    
            try {
                ContentResolver localContentResolver = context.getContentResolver();
                ContentValues localContentValues = getVideoContentValues(new File(videoFile), System.currentTimeMillis());
    
                Uri localUri = localContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, localContentValues);
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q) {
                    // 拷贝到指定uri,如果没有这步操作,android11不会在相册显示
                    try {
                        OutputStream out = context.getContentResolver().openOutputStream(localUri);
                        copyFile(videoFile, out);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri));
                //将该文件扫描到相册
                //MediaScannerConnection.scanFile(context, new String[] { videoFile }, null, null);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        /**
         * 拷贝文件
         * @param oldPath
         * @param out
         * @return
         */
        public static boolean copyFile(String oldPath, OutputStream out) {
            LogWrite.d(TAG, "oldPath = " + oldPath);
            try {
                int bytesum = 0;
                int byteread = 0;
                File oldfile = new File(oldPath);
                if (oldfile.exists()) {
                    // 读入原文件
                    InputStream inStream = new FileInputStream(oldPath);
                    byte[] buffer = new byte[1444];
                    while ((byteread = inStream.read(buffer)) != -1) {
                        bytesum += byteread; //字节数 文件大小
                        System.out.println(bytesum);
                        out.write(buffer, 0, byteread);
                    }
                    inStream.close();
                    out.close();
                    return true;
                }
                else {
                    Log.w(TAG, String.format("文件(%s)不存在。", oldPath));
                }
            }
            catch (Exception e) {
                Log.e(TAG, "复制单个文件操作出错");
                e.printStackTrace();
            }
    
            return false;
        }
    

    以上代码均为FileHelper类方法
    接下来看IPreviewActivity中如何调用

        /**
         * 保存到相册
         */
        private void saveToLocalSystem(){
            final String dataUrl = adapter.getItem(viewPager.getCurrentItem());
            File file = new File(dataUrl);
            if(file.exists()){
    
                //先拷贝到相册目录
                String tempFile = null;
                if(StringUtils.isVideo(dataUrl)) {
                    tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".mp4");
                    FileHelper.copyFile(file.getAbsolutePath(), tempFile);
                    FileHelper.saveVideoToSystemAlbum(tempFile, mContext);
    
                }else{
                    tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".png");
                    FileHelper.copyFile(file.getAbsolutePath(), tempFile);
                    FileHelper.saveImgToSystemAlbum(tempFile, mContext);
                }
    
                showToast("已保存到系统图库");
            }else{
    
                //下载文件
                final LoadingDialog dialog = LoadingDialog.show(mContext);
                new Thread(){
                    @Override
                    public void run() {
    
                        final File file = ImageLoad.downloadImage(mContext, dataUrl);
    
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                dialog.dismiss();
    
                                //文件拷贝到本地
                                String tempFile = null;
                                if(StringUtils.isVideo(dataUrl)) {
                                    tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".mp4");
                                    FileHelper.copyFile(file.getAbsolutePath(), tempFile);
                                    FileHelper.saveVideoToSystemAlbum(tempFile, mContext);
                                }else{
                                    tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".png");
                                    FileHelper.copyFile(file.getAbsolutePath(), tempFile);
                                    FileHelper.saveImgToSystemAlbum(tempFile, mContext);
                                }
    
                                showToast("已保存到系统图库");
                            }
                        });
                    }
                }.start();
            }
        }
    

    到这里就基本完成了,但缺下面两行代码的源码
    tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile
    FileHelper.copyFile(file.getAbsolutePath(), tempFile);

        public String getSDcardDCIMFile(String suffix){
            return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "DCIM" + File.separator + getTimeName() +suffix;
        }
    
    
        /**
         * 拷贝文件
         *
         * @param sourcePath 原始文件路径
         * @param targetPath 目标存放文件路径
         */
        public static boolean copyFile(String sourcePath, String targetPath) {
    
            //文件非空判断
            if (TextUtils.isEmpty(sourcePath) || TextUtils.isEmpty(targetPath)) {
                return false;
            }
    
            File source = new File(sourcePath);
            File target = new File(targetPath);
    
            //源文件,和目标文件是同一个文件,并且目标文件存在,直接返回
            if (sourcePath.equals(targetPath) && target.exists()) {
                return false;
            }
    
            if (!target.exists()) {
                String path = targetPath.substring(0, targetPath.lastIndexOf("/"));
                File s = new File(path);
                s.mkdirs();
            }
    
    
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new BufferedInputStream(new FileInputStream(source));
                out = new BufferedOutputStream(new FileOutputStream(target));
                byte[] buf = new byte[8192];
                int i;
                while ((i = in.read(buf)) != -1) {
                    out.write(buf, 0, i);
                }
            } catch (Exception e) {
                e.printStackTrace();
                LogWrite.writeMsg(e);
            } finally {
                try {
                    if (out != null)
                        out.close();
                    if (in != null)
                        in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            return true;
    
        }
    

    为什么就保存至系统相册代码量如此多,也是为了兼容Android Q R 以上版本问题。
    主要操作步骤就是
    1.将文件从app的沙盒目录中将文件拷贝到Sdcard中
    2.发送广播去扫描文件

    相关文章

      网友评论

        本文标题:Android 图片视频保存至系统相册

        本文链接:https://www.haomeiwen.com/subject/fhiloltx.html