我的应用程序将 .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 图库或在图库中创建自己的文件夹来显示我的应用程序照片和视频,例如,如果我有这样的照片路径
File file = new File(storagePath, FileName);
String MyPath= ""+Uri.fromFile(file);
Run Code Online (Sandbox Code Playgroud)
你下一步怎么做 ?
我正在获取设备中所有图像、视频和音频文件的列表。下面的代码在 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
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) 我创建了一个获取视频的函数
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) 由于某种原因 MediaStore 列MediaStore.Audio.Media.DURATION现在仅在 API29 上可用,并且 Android Studio 现在显示一条警告,表明它需要 Android Q。
我不知道为什么,因为我已经使用这个专栏很长时间了。
即使在文档中也写着“Added in API29”。
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns#DURATION
在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 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 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) 我正在尝试使用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 ×10
mediastore ×10
android-10.0 ×2
android-11 ×1
file ×1
gallery ×1
image ×1
kotlin ×1
move ×1
save ×1
uri ×1