标签: mediastore

移动 JPG 文件后如何更新 Android MediaStore

我的应用程序将 .jpg 文件移动到其他文件夹,并在我已 sendBroadcast ACTION_MEDIA_MOUNTED 的图库中查看

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + 
            Environment.getExternalStorageDirectory() ))); 
Run Code Online (Sandbox Code Playgroud)

但这需要很多时间..我明白(也许)我必须直接使用 mediaStore 中的光标/contentResolver 手动更新才能更快。谁可以帮我这个事?谢谢..我的代码实际上是:

 Uri uri = (Uri) list.get(cont); 
 Cursor cursor = managedQuery(uri, proj, null, null, null);
 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
 cursor.moveToFirst();
 String app = cursor.getString(column_index);
 File orig =  new File( app.toString());
 File dest = new File( destination_path +"/"+ orig.getName().toString());
 orig.renameTo(dest);
Run Code Online (Sandbox Code Playgroud)

这样我将一个文件从一个路径移动到另一个路径。

之后,要在图库中获取图像,我必须发送Broadcast ACTION_MEDIA_MOUNTED

android image move mediastore

5
推荐指数
1
解决办法
4401
查看次数

将视频插入 Android 图库

我需要知道如何将视频插入到 android 图库或在图库中创建自己的文件夹来显示我的应用程序照片和视频,例如,如果我有这样的照片路径

     File file = new File(storagePath, FileName);
     String MyPath= ""+Uri.fromFile(file);
Run Code Online (Sandbox Code Playgroud)

你下一步怎么做 ?

android file gallery save mediastore

5
推荐指数
0
解决办法
8065
查看次数

Android 9 (Pie) ContentResolver 查询 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 在 api 28 上返回 null

我正在获取设备中所有图像、视频和音频文件的列表。下面的代码在 android O (api 27) 之前的所有设备上都可以正常工作。但它不适用于 android Pie 设备(api 28)。Cursor 返回 nullquery

对于图像

String[] proj = {MediaStore.Images.Media._ID,
                    MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media.TITLE,
                    MediaStore.Images.Media.SIZE
            };
ContentResolver cr = context.getContentResolver();

Cursor imagescursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size DESC");
Run Code Online (Sandbox Code Playgroud)

对于视频文件

String[] proj = {MediaStore.Video.Media._ID,
                    MediaStore.Video.Media.DATA,
                    MediaStore.Video.Media.TITLE,
                    MediaStore.Video.Media.SIZE,
                    MediaStore.Video.Media.DURATION
            };
ContentResolver cr = context.getContentResolver();

Cursor videocursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size DESC");
Run Code Online (Sandbox Code Playgroud)

对于音频文件

String[] proj = {MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.DISPLAY_NAME,
                    MediaStore.Audio.Media.SIZE,
                    MediaStore.Audio.Media.DURATION};
ContentResolver cr = context.getContentResolver();

Cursor audiocursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size …
Run Code Online (Sandbox Code Playgroud)

android mediastore android-contentresolver media-queries android-9.0-pie

5
推荐指数
1
解决办法
2479
查看次数

如何在Andrdoid 10上拍照并将结果保存到图片中?

Google 在 Android 10 上引入了 Scoped Storage,根据文档,我们可以使用 MediaStore API 无需请求权限即可写入公共目录。

在Android 10之前,当我们需要拍照并将其保存到图片中时,代码如下:


private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            ...
        }
        // Continue only if the File was successfully created
        if (photoFile …
Run Code Online (Sandbox Code Playgroud)

android mediastore android-10.0 scoped-storage

5
推荐指数
0
解决办法
872
查看次数

MediaStore 无法在 Kotlin 中列出手机内的所有视频。为什么?

我创建了一个获取视频的函数

private val projectionVideo = arrayOf(
MediaStore.Video.Media._ID, //ID
MediaStore.Video.Media.DISPLAY_NAME, //NAME
MediaStore.Video.Media.DATA, //PATH TO CONTENT
MediaStore.Video.Media.DATE_TAKEN, //DATE
MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE
)

private fun queryVideos(cr: ContentResolver): Cursor? =
        cr.query(
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            projectionVideo, null, null,
            MediaStore.Video.Media.DATE_TAKEN + " $SORT_ORDER"
        )
Run Code Online (Sandbox Code Playgroud)

爪哇语

public static Uri getContentUri(String volumeName) {
                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
                        "/video/media");
            }
            /**
             * The content:// style URI for the internal storage.
             */
            public static final Uri INTERNAL_CONTENT_URI =
                    getContentUri("internal");
            /**
             * The content:// style URI for the "primary" external storage
             * volume. …
Run Code Online (Sandbox Code Playgroud)

android mediastore kotlin

5
推荐指数
1
解决办法
1481
查看次数

MediaStore.Audio.Media.DURATION 列现在仅在 API 29 上可用?

由于某种原因 MediaStore 列MediaStore.Audio.Media.DURATION现在仅在 API29 上可用,并且 Android Studio 现在显示一条警告,表明它需要 Android Q。

我不知道为什么,因为我已经使用这个专栏很长时间了。

即使在文档中也写着“Added in API29”

https://developer.android.com/reference/android/provider/MediaStore.MediaColumns#DURATION

android mediastore

5
推荐指数
0
解决办法
1304
查看次数

VOLUME_EXTERNAL 需要 API 级别 29

Android 文档中他们说

在 API <= 28 上,使用 VOLUME_EXTERNAL

但这也需要 API 级别 29,并且它不会将媒体文件保存到 MediaStore 中。

 MediaStore.Audio.Media.IS_PENDING
 MediaStore.Video.Media.RELATIVE_PATH
 MediaStore.Video.Media.DATE_TAKEN
Run Code Online (Sandbox Code Playgroud)

还需要 API 29,所以我觉得文档不清楚,或者有什么我错过的吗?以及如何在 Android 10 以下保存媒体文件。

android mediastore

5
推荐指数
1
解决办法
2714
查看次数

如何以相对路径从 MediaStore 读取文件?

在 Android 10 或更高版本中,我使用 MediaStore 将文件保存在“下载”、共享存储中。我用来保存文件的代码如下:

        GlobalScope.launch {
        val values = ContentValues().apply {
            put(MediaStore.Downloads.DISPLAY_NAME, "file.txt")
            put(MediaStore.Downloads.MIME_TYPE, "text/plain")
            put(MediaStore.Downloads.IS_PENDING, 1)
            put(MediaStore.Downloads.RELATIVE_PATH,Environment.DIRECTORY_DOWNLOADS+ File.separator+"MyApp/SubDir")
        }

        val collection = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
        val item = contentResolver.insert(collection, values)!!

        contentResolver.openFileDescriptor(item, "w", null).use {
            FileOutputStream(it!!.fileDescriptor).use { outputStream ->
                outputStream.write("test file".toByteArray())
                outputStream.close()
            }
        }

        values.clear()
        values.put(MediaStore.Images.Media.IS_PENDING, 0)
        contentResolver.update(item, values, null, null)
Run Code Online (Sandbox Code Playgroud)

现在我的文件保存在 Downloads/myApp/subDir/file.txt 中

如果是这样,如果我不知道该文件的 Uri 但知道用于保存它的 RELATIVE_PATH,我该如何读取该文件?

android uri mediastore

5
推荐指数
1
解决办法
3470
查看次数

Android 11 媒体存储 - 无法在相对路径上录制新视频。它适用于 Environment.DIRECTORY_MOVIES 路径,但不适用于子文件夹

我的代码在任何低于 Android 11 的 Android 系统上都能完美运行。在 Android 11 上(特别是在 Pixel2 和 Pixel3 模拟器和真实设备上),文件描述符在将其插入媒体存储后无法找到该文件。

如果我将第二行的相对路径更改为仅 Environment.DIRECTORY_MOVIES 路径 - 它可以工作

String relativeLocation = Environment.DIRECTORY_MOVIES;
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

String mimeType = "video/mp4";
String relativeLocation = Environment.DIRECTORY_MOVIES + File.separator + SUB_DIRECTORY_NAME ;
shortFileName = getDateStamp() + selectedExtension;
videoContentValues = new ContentValues();
videoContentValues.put(MediaStore.Video.Media.TITLE, shortFileName);
videoContentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, shortFileName);
videoContentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
videoContentValues.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
videoContentValues.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());

videoContentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
videoContentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
videResolver = mContext.getContentResolver();

Uri contentUri = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
videoUri = videResolver.insert(contentUri, videoContentValues);
if (videoUri == null) {
    throw new IOException("Failed …
Run Code Online (Sandbox Code Playgroud)

android mediastore android-11

5
推荐指数
1
解决办法
5050
查看次数

MediaStore.MediaColumns#DATE_TAKEN 是否仅适用于 API 级别 29?

我正在尝试使用MediaStore.Images.Media.DATE_TAKEN并从 Android Studio IDE 收到警告,它需要 API 29 (Android Q)。此处的官方 Google 文档说这是在 API 级别 29 中添加的。这是真的吗?

我一直在检查过去版本中的 Google Sources,直到 API 19 (KitKat) 并且我看到 MediaStore.MediaColumns#DATE_TAKEN 字段从那时起可用。为什么官方文档说的不一样?

Android 4.4 (KitKat)媒体商店

Android 5.0(棒棒糖)媒体商店

Android 6.0 (Marshmallow) MediaStore

Android 7.0(牛轧糖)媒体商店

Android 8.0 (奥利奥)媒体商店

Android 9.0 (Pie) MediaStore

有没有人可以澄清一下真相?我可以可靠地使用API 19+ 中的MediaStore.Images.Media.DATE_TAKEN吗?谢谢!

android mediastore android-4.4-kitkat android-10.0

5
推荐指数
1
解决办法
621
查看次数