Java 如何在Android Q中获取图像Uri?

Java 如何在Android Q中获取图像Uri?,java,android,kotlin,android-external-storage,android-10.0,Java,Android,Kotlin,Android External Storage,Android 10.0,我想在Android Q中获取文件位置的Uri。我正在使用下面的代码,但是Android Studio声明它已被弃用。如何以正确的方式获取文件的Uri val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES + "/meter"), "lalaland.jpg") val uri = Uri.fromFile(file) 此函数将根据给定的文件显示名返回Uri。您

我想在Android Q中获取文件位置的Uri。我正在使用下面的代码,但是Android Studio声明它已被弃用。如何以正确的方式获取文件的Uri

val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES + "/meter"), "lalaland.jpg")

val uri = Uri.fromFile(file)

此函数将根据给定的文件显示名返回Uri。您可以将其更新为类似MediaStore的图像。图像


Environment#getExternalStoragePublicDirectory(String)
方法已被弃用,以改善用户隐私。如果引用了
上下文
(例如,
ctx
),则可以执行以下操作:

val file = File(ctx.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
                "meter/lalaland.jpg")

val uri = Uri.fromFile(file)

有关
getExternalFilesDir()
如何工作的更多信息,请咨询。

对于android Q,请从共享存储访问媒体文件 为了提供更丰富的用户体验,许多应用程序允许用户贡献和访问外部存储卷上可用的媒体。该框架为媒体集合提供了一个优化的索引,称为媒体存储,允许更轻松地检索和更新这些媒体文件。范围存储android


. 让用户将文件放在您可以通过文件系统访问的地方(例如,
getExternalFilesDir()
),或者使用
MediaStore
,或者使用
ACTION\u OPEN\u DOCUMENT
。谢谢您有关于MediaStore的教程吗?找不到有关如何使用它的文档@Commonware我不知道您将如何处理
Uri
,也不知道您尝试执行的操作的范围。从显示获取给定文件名的视频的
Uri
值。通常,您可以在
ContentResolver
上使用
query()。问题中的代码假定特定目录中有特定的文件名。更好的解决方案是
ACTION\u OPEN\u DOCUMENT
,允许用户从设备上的任何位置(或从云存储提供商,如谷歌硬盘)选择图像。您将得到一个应该与uCrop一起工作的
Uri
val file = File(ctx.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
                "meter/lalaland.jpg")

val uri = Uri.fromFile(file)
public static Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[]{MediaStore.Images.Media._ID},
            MediaStore.Images.Media.DATA + "=? ",
            new String[]{filePath}, null);
    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
        cursor.close();
        return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
    } else {
        if (imageFile.exists()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ContentResolver resolver = context.getContentResolver();
                Uri picCollection = MediaStore.Images.Media
                        .getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
                ContentValues picDetail = new ContentValues();
                picDetail.put(MediaStore.Images.Media.DISPLAY_NAME, imageFile.getName());
                picDetail.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
                picDetail.put(MediaStore.Images.Media.RELATIVE_PATH,"DCIM/" + UUID.randomUUID().toString());
                picDetail.put(MediaStore.Images.Media.IS_PENDING,1);
                Uri finaluri = resolver.insert(picCollection, picDetail);
                picDetail.clear();
                picDetail.put(MediaStore.Images.Media.IS_PENDING, 0);
                resolver.update(picCollection, picDetail, null, null);
                return finaluri;
            }else {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DATA, filePath);
                return context.getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            }

        } else {
            return null;
        }
    }
}