java - 如何在Android应用程序中获取设备存储中的所有视频

标签 java android

我想在我的应用程序的 ListView 中显示手机存储(内部或 SD 卡)中存在的所有视频,而我的旧代码在新的 7.0 设备上给出异常(exception)。我的 targetSDK API 级别是 23。我还在 IDE 中收到一条警告,指出“managementQuery”方法已弃用。我的项目中的方法是:

private boolean getVideoList() {
    Cursor var1 = this.managedQuery(Media.EXTERNAL_CONTENT_URI, new String[]{"_data", "_id", "_display_name", "duration"}, (String)null, (String[])null, " _id DESC");
    int var2 = var1.getCount();
    if(var2 <= 0) {
        return false;
    } else {
        var1.moveToFirst();

        for(int var4 = 0; var4 < var2; ++var4) {
            Uri var5 = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, ContentUtill.getLong(var1));
            String var6 = var1.getString(var1.getColumnIndexOrThrow("_display_name"));
            String var7 = var1.getString(var1.getColumnIndex("_data"));
            String var8 = ContentUtill.getTime(var1, "duration");
            VideoData var9 = new VideoData(var6, var5, var7, var8);
            this.videoList.add(var9);
            var1.moveToNext();
        }

        return true;
    }
}

异常(exception)情况是:

Caused by: java.lang.SecurityException: 
  at android.os.Parcel.readException (Parcel.java:1693)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
  at android.content.ContentProviderProxy.query (ContentProviderNative.java:421)
  at android.content.ContentResolver.query (ContentResolver.java:536)
  at android.content.ContentResolver.query (ContentResolver.java:478)
  at android.app.Activity.managedQuery (Activity.java:2368)
  at video.format.converter.view.SelectVideoActivity.getVideoList (SelectVideoActivity.java:61)
  at video.format.converter.view.SelectVideoActivity.access$0 (SelectVideoActivity.java:60)
  at video.format.converter.view.SelectVideoActivity$loadVideo.doInBackground (SelectVideoActivity.java:170)
  at video.format.converter.view.SelectVideoActivity$loadVideo.doInBackground (SelectVideoActivity.java:1)
  at android.os.AsyncTask$2.call (AsyncTask.java:304)
  at java.util.concurrent.FutureTask.run (FutureTask.java:237)

我确实在我的项目中实现了新的权限模型,并且我确实要求 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限,但仍然是异常(exception)。获取视频列表并使用属性填充我的 POJO 类的任何好方法:

   public String Duration;
   public Uri VideoUri;
   public long videoId;
   public String videoName;
   public String videoPath;

最佳答案

我认为您正在使用 Android Marshmallow 或更高版本。您需要获得 READ_EXTERNAL_STORAGE 的运行时权限。仅将其放入 list 中不适用于 Android 6+。这是添加运行时权限的链接。 Link

托管查询也已弃用,查询如下:

 Cursor var1 = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[]{"_data", "_id", "_display_name", "duration"}, (String)null, (String[])null, " _id DESC");

关于java - 如何在Android应用程序中获取设备存储中的所有视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437636/

相关文章:

android - 在 Android 中裁剪图像(Crop Intent)

java - 在两个线程和主程序之间共享一个对象

java - 可以从 vxml 或 ccxml (Voximal) 播放音频流(PCM 流 8000)

Java将int转换为十六进制并再次转换回来

java - 如何将 "compact"Python 移植到 "compact"Java?

android - 错误 : package android. support.annotation 不存在 - Android 工作室 - Gradle

android - 从通知可分割对象中读取内容以进行后续通知

android - 如何在 android 中启用网络提供程序?

android - 使用 NavDeepLinkBuilder 构建 fragment 回栈

java - 通过ajax将数据传递给spring mvc Controller