我需要将图像保存到camera文件夹,但是由于不赞成使用Android Q getExternalStoragePublicDirectory,因此我以另一种方式进行操作。
我所拥有的(此方法接收位图及其名称):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ContentResolver resolver = mContext.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + IMAGES_FOLDER_NAME);
        Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        OutputStream fos = resolver.openOutputStream(imageUri);
        saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    } else {
        String imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString() + File.separator + IMAGES_FOLDER_NAME;

        File file = new File(imagesDir);

        if (!file.exists()) {
            file.mkdir();
        }

        File image = new File(
                imagesDir,
                name + ".png"
        );

        final long fileHashCode = image.hashCode();
        Logger.d(TAG, "saveImage, saving image file, hashCode = " + fileHashCode);

        FileOutputStream fos = new FileOutputStream(image);
        saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    }

这对于所有所需的OS版本都是完美的,但是它看起来不准确,我想找到一种更通用的方法。
我尝试使用内容值或尝试一些与Q相似的方法,但是它不起作用。我在这里看到了很多问题,但没有一个可以帮助我。

问题是如何针对低于Q的操作系统优化保存?

最佳答案

我能写的最通用的版本是:

private Uri saveImage(Context context, Bitmap bitmap, @NonNull String folderName, @NonNull String fileName) throws IOException
{
    OutputStream fos;
    File imageFile = null;
    Uri imageUri = null;


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ContentResolver resolver = context.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + File.separator + folderName);
        imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        fos = resolver.openOutputStream(imageUri);
    } else {
        String imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString() + File.separator + folderName;
        imageFile = new File(imagesDir);
        if (!imageFile.exists()) {
            imageFile.mkdir();
        }
        imageFile = new File(imagesDir, fileName + ".png");
        fos = new FileOutputStream(imageFile);
    }

    boolean saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.flush();
    fos.close();

    if (imageFile != null)  // pre Q
    {
        MediaScannerConnection.scanFile(context, new String[]{imageFile.toString()}, null, null);
        imageUri = Uri.fromFile(imageFile);
    }

    return imageUri;
}
如果您找到了更好的方法,请在此处发布,我将其标记为答案。

关于android - 如何将图像保存到Android Q中的camera文件夹中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57357175/

10-10 01:35
查看更多