首页 > 解决方案 > 如何从android 10中的位图获取uri

问题描述

我在 android 10 中获取 URI 时遇到问题,它在较低的设备中工作,但我不知道如何在 android 10 中执行。我正在服务器中上传视频。

 bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, false);
    String path = MediaStore.Images.Media.insertImage(mContext.getContentResolver(), bitmap, "Title", null);
    Uri.parse(path);

我也尝试ContentValues过,但我不明白该怎么做我收到一些错误,例如无法解析 Q、RELATIVE_PATH、IS_PENDING

import android.provider.MediaStore;

 ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis()+"");
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
            contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
        }

谁能帮助我如何在 android 10 中获取 URI?

任何帮助都会受到高度赞赏。

标签: androidbitmapstorageurimediastore

解决方案


在 Andorid 10 中使用下一个片段将新位图插入到 MediaStore,并获取 Uri。请注意,此代码仅适用于 Android 10。

压缩格式必须与 mime-type 参数相关。例如,对于 JPEG 压缩格式,mime 类型将是“image/jpeg”,依此类推。subFolder 参数是可选的。

@NonNull
private Uri saveBitmap(@NonNull final Context context, @NonNull final Bitmap bitmap,
                        @NonNull final Bitmap.CompressFormat format, @NonNull final String mimeType,
                        @NonNull final String displayName, @Nullable final String subFolder) throws IOException
{
    String relativeLocation = Environment.DIRECTORY_PICTURES;

    if (!TextUtils.isEmpty(subFolder))
    {
        relativeLocation += File.separator + subFolder;
    }

    final ContentValues  contentValues = new ContentValues();
    contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName);
    contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
    contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);

    final ContentResolver resolver = context.getContentResolver();

    OutputStream stream = null;
    Uri uri = null;

    try
    {
        final Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        uri = resolver.insert(contentUri, contentValues);

        if (uri == null)
        {
            throw new IOException("Failed to create new MediaStore record.");
        }

        stream = resolver.openOutputStream(uri);

        if (stream == null)
        {
            throw new IOException("Failed to get output stream.");
        }

        if (bitmap.compress(format, 95, stream) == false)
        {
            throw new IOException("Failed to save bitmap.");
        }

        return uri;
    }
    catch (IOException e)
    {
        if (uri != null)
        {
            // Don't leave an orphan entry in the MediaStore
            resolver.delete(uri, null, null);
        }

        throw e;
    }
    finally
    {
        if (stream != null)
        {
            stream.close();
        }
    }
}

推荐阅读