0
点赞
收藏
分享

微信扫一扫

Android 内部存储的图片和视频保存到相机相册或者指定的文件夹

微言记 2022-02-25 阅读 108
//file:///storage/emulated/0/Android/data/包名/files/screenshots_videos//100000406127/pp_20220225201215.jpg
public static void saveFile2Gallery(Context context, boolean isVideo, Uri uri, String fileName) {
    String folderName = "";
    if (isVideo) {
        folderName = Environment.DIRECTORY_DCIM + "/" + context.getString(R.string.android_app_name);
    } else {
        folderName = Environment.DIRECTORY_PICTURES + "/" + context.getString(R.string.android_app_name);
    }
    Uri uriSavedFile;
    File createdFile = null;
    ContentResolver resolver = context.getContentResolver();
    ContentValues valuesFile;
    valuesFile = new ContentValues();

    if (Build.VERSION.SDK_INT >= 29) {
        valuesFile.put(MediaStore.Video.Media.RELATIVE_PATH, folderName);
        valuesFile.put(MediaStore.Video.Media.TITLE, fileName);
        valuesFile.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
        valuesFile.put(MediaStore.Video.Media.MIME_TYPE, isVideo? "video/mp4" : "image/jpeg");
        valuesFile.put(
                MediaStore.Video.Media.DATE_ADDED,
                System.currentTimeMillis() / 1000);

        Uri collection = isVideo? MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) :
                MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
        uriSavedFile = resolver.insert(collection, valuesFile);
    } else {
        File directory = Environment.getExternalStoragePublicDirectory(isVideo? Environment.DIRECTORY_DCIM : Environment.DIRECTORY_PICTURES);
        File parent = new File(directory.getAbsolutePath() + "/" + context.getString(R.string.android_app_name));
        if (!parent.exists()) {
            parent.mkdir();
        }
        createdFile = new File(parent, fileName + (isVideo? ".mp4" : ".jpg"));

        valuesFile.put(MediaStore.Video.Media.TITLE, fileName);
        valuesFile.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
        valuesFile.put(MediaStore.Video.Media.MIME_TYPE, isVideo ? "video/mp4" : "image/jpeg");
        valuesFile.put(
                MediaStore.Video.Media.DATE_ADDED,
                System.currentTimeMillis() / 1000);
        valuesFile.put(MediaStore.Video.Media.DATA, createdFile.getAbsolutePath());

        if (isVideo) {
            uriSavedFile = context.getContentResolver().insert(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                    valuesFile);
        } else {
            uriSavedFile = context.getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    valuesFile);
        }
    }

    if (Build.VERSION.SDK_INT >= 29) {
        valuesFile.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
        valuesFile.put(MediaStore.Video.Media.IS_PENDING, 1);
    }

    try {
        if (isVideo) {
            ParcelFileDescriptor pfd;
            pfd = context.getContentResolver().openFileDescriptor(uriSavedFile, "w");

            FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());
            // get the already saved video as fileinputstream
            // The Directory where your file is saved

// File storageDir = new File(uri.getPath());
//Directory and the name of your video file to copy
File videoFile = new File(uri.getPath());
FileInputStream in = new FileInputStream(videoFile);

            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }

            out.close();
            in.close();
            pfd.close();
        } else {
            OutputStream out = context.getContentResolver().openOutputStream(uriSavedFile);
            BitmapFactory.Options options = new BitmapFactory.Options();
            Bitmap bmp = BitmapFactory.decodeFile(uri.getPath(), options);
            bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
            bmp.recycle();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (Build.VERSION.SDK_INT >= 29) {
        valuesFile.clear();
        valuesFile.put(MediaStore.Video.Media.IS_PENDING, 0);
        context.getContentResolver().update(uriSavedFile, valuesFile, null, null);
    } else {
        Intent localIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        final Uri localUri = Uri.fromFile(createdFile);
        localIntent.setData(localUri);
        context.sendBroadcast(localIntent);
    }
}
举报

相关推荐

0 条评论