如何从 android 10 中的位图中获取 uri

how to get uri from bitmap in android 10

我在 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?

如有任何帮助,我们将不胜感激。

使用下一个片段将新的位图插入到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();
        }
    }
}

首先你必须更新你的 sdk 才能使用 MediaStore.MediaColumns.RELATIVE_PATH

compileSdkVersion 29
targetSdkVersion 29

将此 2 sdk 版本设置为 29,以便您可以使用 RELATIVE_PATH,然后在尝试此操作后

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);

您可以参考@PerracoLabs 的完整