- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的一台设备上,以下代码无法使我的视频出现在图库中:
File file = new File(path);
Uri uri = Uri.fromFile(file);
Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
activity.sendBroadcast(scanFileIntent);
所以我明确地使用scanFile
:
android.media.MediaScannerConnection.scanFile(activity, new String[]{file.getAbsolutePath()},
new String[]{"video/" + mMimeType}, null);
当我的视频是xxx.mpeg4时,mMimeType
的值为mp4,结果是视频可以出现在MediaStore中,但是后面获取不到时长(返回值总是0).在这方面需要帮助。
public static long[] getVideoDetail(Context context, Uri uri) {
long[] result = new long[] {DEFAULT_VIDEO_FRAME_WIDTH, DEFAULT_VIDEO_FRAME_HEIGHT, -1};
if(uri == null || (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()))) {
return result;
}
String[] projection = new String[] {MediaStore.Video.Media.RESOLUTION, MediaStore.Video.VideoColumns.DURATION};
Cursor cursor = null;
boolean success = false;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
if (cursor.moveToFirst()) {
String resolution = cursor.getString(0);
if(!StringUtils.isEmpty(resolution)) {
int index = resolution.indexOf('x');
result[0] = Integer.parseInt(resolution.substring(0, index));
result[1] = Integer.parseInt(resolution.substring(index + 1));
if(result[0] != 0 && result[1] != 0) {
success = true;
}
if(result[0] > result[1]) {
swap(result, 0, 1);
}
}
result[2] = cursor.getLong(1);
if(result[2] >= 0 && success) {
success = true;
} else {
success = false;
}
}
if (null != cursor) {
cursor.close();
}
}
catch (Exception e) {
// do nothing
} finally {
try {
if (null != cursor) {
cursor.close();
}
} catch (Exception e2) {
// do nothing
}
}
if (!success) {
try {
ContentResolver contentResolver = context.getContentResolver();
String selection = MediaStore.Images.Media._ID + "= ?";
String id = uri.getLastPathSegment();
String[] selectionArgs = new String[]{ id };
cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null);
if (cursor.moveToFirst()) {
String resolution = cursor.getString(0);
if(!StringUtils.isEmpty(resolution)) {
int index = resolution.indexOf('x');
result[0] = Integer.parseInt(resolution.substring(0, index));
result[1] = Integer.parseInt(resolution.substring(index + 1));
if(result[0] > result[1]) {
swap(result, 0, 1);
}
}
result[2] = cursor.getLong(1);
}
if (null != cursor) {
cursor.close();
}
} catch (Exception e) {
// do nothing
} finally {
try {
if (cursor != null) {
cursor.close();
}
} catch (Exception e) {
// do nothing
}
}
}
if(result[0] <= 0) {
result[0] = DEFAULT_VIDEO_FRAME_WIDTH;
}
if(result[1] <= 0) {
result[1] = DEFAULT_VIDEO_FRAME_HEIGHT;
}
return result;
}
最佳答案
正如我在您的代码中看到的,您要求投影持续时间
String[] projection = new String[] {MediaStore.Video.Media.RESOLUTION, MediaStore.Video.VideoColumns.DURATION};
现在您只需要从 cursor
中检索它,如下所示:
long timeInMs = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DURATION));
关于android - 为什么我无法从 MediaStore 获取视频时长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27339970/
我正在尝试获取其中包含音频文件的所有文件名包含音频文件的标题。这是我尝试过的代码,但它不正确,因为我无法设置 External_Content_uri。这是我试过的代码。 private void
我正在查询 Android 的 MediaStore 文件数据库 -MediaStore.Files.getContentUri("external") - 对于某些特定文件夹,MediaStore.
我有这个来自 developer.android 的功能,但它找不到所有歌曲,只有几首。请给我一些线索。 public void getAllSongs() { ContentResolver
大家好,我想在 android api level 29 即 Q 中获取音频文件的绝对路径,但问题是 DATA 已被 弃用 那么如何解决这个问题并使用 绝对路径(例如:storage/sdcard/m
也检索我使用的专辑 ID: String SONG_ALBUMID = MediaStore.Audio.Albums.ALBUM_ID; 但是 MediaStore.Audio.Albums.AL
如何打开存储在图库中的文件?我用这种方法把我的文件放在那里: MediaStore.Images.Media.insertImage() 根据文档,它将 String url 返回到新创建的文件。但是
Android平台有一些“ready easy use”的对话框比如ProgressDialog、DatePickerDialog 和 TimePickerDialog,这些都是开火等待框,也就是说,
我是 Android 应用程序开发新手。我想创建一个视频列表,该列表将由外部数据库 phpmyadmin 和 mysql 填充。我可以使用 mediastore 类吗? 最佳答案 MediaStore
我正在尝试让 Android 的 MediaStore 将具有特定文件名的图像写入 SD 卡。它确实写入文件,但不使用通过 传递的标题参数 MediaStore.Images.Media.insert
我使用 MediaStore 从 Android 设备获取所有图像。然后在我从文件管理器中删除一些图像之后。随后我再次使用 MediaStore 获取图像,我得到了所有已删除的文件,这是有问题的。 为
当我从我的应用程序设置铃声时,一次可以正常工作,但再次运行代码时,它会尝试在媒体存储中创建重复条目,这会产生问题。在不为每个声音文件创建单独的唯一文件名的情况下,我想解决这个问题。 我在此处的答案中找
我不明白为什么这个光标在这个特定的设备上是空的。但适用于所有其他安卓设备。sdcard上有几个音频文件,原厂播放器可以找到并播放这些歌曲。 Cursor c = managedQuery(MediaS
我想将拍摄的照片添加到 MediaStore,以便 Gallery 应用程序可以找到它们(无需重启设备)。应用程序的最小 SDK 为 9。感谢任何帮助、博客或文档。 最佳答案 在大多数设备上,您只需稍
所以我们的应用程序可以选择拍摄照片或视频。如果用户拍照,我们可以使用 MediaStore.Images.Media.insertImage 函数将新图像(通过文件路径)添加到手机的相册中,并生成一个
我想创建一个可以在线下载歌曲并将其添加到 MediaStore 的音乐播放器。我正在使用下载管理器并允许 MediaScanner 在下载完成后扫描此文件。 DownloadManager.Reque
当我在播放列表中有 2 首具有相同 audioID 的歌曲并且我想删除 其中的 1 首 2 首歌曲时,我应该对此代码进行哪些更改? static public int removeSongFromPl
我正在尝试从特定文件夹中获取 mp3 文件列表。 截至目前,我正在使用 contentResolver.query 从我的手机中获取音乐。 像这样: String selection = MediaS
每次将专辑添加到 Android MediaStore 数据库时,我都想运行一些代码。我想我需要为一个 Intent 注册我的应用程序,但不确定是哪个。有人知道吗? 最佳答案 关闭,但您注册以监听 M
我从媒体存储中检索以下值 MediaStore.Images.Media.DATE_TAKEN MediaStore.Images.Media.DATE_MODIFIED 然后从结果中读取日期,如下所
我想从设备上的一个特定路径获取所有歌曲。在一个示例中,我想从路径“/mnt/sdcard/music/”中的一个特定文件夹“music”中获取所有歌曲,我需要更改我的代码才能实现此目的吗?我有这种方法
我是一名优秀的程序员,十分优秀!