我想在我的应用程序的 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/