使用 KitKat 上的视频文件填充列表视图
Populate listview with video files on KitKat
我希望有人能帮助我。
我通过一个列表视图在我的应用程序上显示位于 sd 卡上的所有录制的视频文件。但这不适用于 Api 19 (kitkat)。我的代码是这样的:
String selection = MediaStore.Video.Media.DATA + " like?";
String[] selectionArgs = new String[]{"%"+ VideoRoute + "%"};
videocursor = activity.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,proj, selection, selectionArgs, MediaStore.Video.Media.DATE_TAKEN + "DESC");
count = videocursor.getCount();
while (videocursor.moveToNext()){
...
Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(video.getUrlMedia(), Thumbnails.MICRO_KIND);
...
}
有谁知道如何使用 Android KitKat 实现此目的?
提前致谢。
在 KitKat 之前,public APIs 只支持一个主要的外部存储设备,在某些设备上可以由内部存储模拟和支持。自 API 级别 1 以来,主要外部存储设备继续以它们一直使用的方式工作;如果您请求 WRITE_EXTERNAL_STORAGE,您将拥有整个设备的完整 read/write 访问权限。
对于 KitKat 中的辅助外部存储设备,对属于 运行 应用程序的目录的写入访问权限有限。
优势-
1:应用程序可以利用额外的存储空间 space。
2:用户可以更好地了解和控制应用程序如何使用其存储 space。 (这些特定于包的目录通过 Context.getExternalFilesDirs() 等呈现给应用程序)
所以您的代码可能会给出零个找到的视频。
我会 post 我自己的答案,以防有人像我一样需要帮助解决这个问题,对我有用的是:
//with videoList fill de listView
videoList = getFilesKitkat();
public List<Video> getFilesKitkat(){
int i = 0;
list.clear();//list is global
//App package directory in the sd card to get all the files,
// in my case, there is only mp4 files.
// /storage/extSdCard/Android/data/<package_name>/files...
File targetDirector = new File (videosPath);
File[] files = targetDirector.listFiles();
int totalFiles = files.length;
String[] filesToScan = new String[totalFiles];
//this is to get all the paths in order to pass them to MediaScannerConnection
for (File file : files){
filesToScan[i] = file.getAbsolutePath();
i++;
}
callMediaScanner_kitkat(filesToScan);
return list;
}
public void callMediaScanner_kitkat(final String[] files) {
MediaScannerConnection.scanFile(context, files, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
Log.i("Test", "Scanned " + path);
getVideosList_kitkat(context, uri);
}
});
}
public void getVideosList_kitkat(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.DATE_MODIFIED};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
while (cursor.moveToNext()){
Video video = new Video();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Video.Media._ID));
String nombre = (cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE))).toLowerCase();
video.setName(nombre + XSalesApplication.getActivityContext().getResources().getString(R.string.video_extension));
video.setId(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)));
video.setSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)));
video.setUrlMedia(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))); video.setlastModified(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED)));
Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(video.getUrlMedia(), Thumbnails.MICRO_KIND);
video.setPhotoBitmap(bmThumbnail);
list.add(video);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
我希望有人能帮助我。
我通过一个列表视图在我的应用程序上显示位于 sd 卡上的所有录制的视频文件。但这不适用于 Api 19 (kitkat)。我的代码是这样的:
String selection = MediaStore.Video.Media.DATA + " like?";
String[] selectionArgs = new String[]{"%"+ VideoRoute + "%"};
videocursor = activity.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,proj, selection, selectionArgs, MediaStore.Video.Media.DATE_TAKEN + "DESC");
count = videocursor.getCount();
while (videocursor.moveToNext()){
...
Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(video.getUrlMedia(), Thumbnails.MICRO_KIND);
...
}
有谁知道如何使用 Android KitKat 实现此目的?
提前致谢。
在 KitKat 之前,public APIs 只支持一个主要的外部存储设备,在某些设备上可以由内部存储模拟和支持。自 API 级别 1 以来,主要外部存储设备继续以它们一直使用的方式工作;如果您请求 WRITE_EXTERNAL_STORAGE,您将拥有整个设备的完整 read/write 访问权限。
对于 KitKat 中的辅助外部存储设备,对属于 运行 应用程序的目录的写入访问权限有限。
优势-
1:应用程序可以利用额外的存储空间 space。
2:用户可以更好地了解和控制应用程序如何使用其存储 space。 (这些特定于包的目录通过 Context.getExternalFilesDirs() 等呈现给应用程序)
所以您的代码可能会给出零个找到的视频。
我会 post 我自己的答案,以防有人像我一样需要帮助解决这个问题,对我有用的是:
//with videoList fill de listView
videoList = getFilesKitkat();
public List<Video> getFilesKitkat(){
int i = 0;
list.clear();//list is global
//App package directory in the sd card to get all the files,
// in my case, there is only mp4 files.
// /storage/extSdCard/Android/data/<package_name>/files...
File targetDirector = new File (videosPath);
File[] files = targetDirector.listFiles();
int totalFiles = files.length;
String[] filesToScan = new String[totalFiles];
//this is to get all the paths in order to pass them to MediaScannerConnection
for (File file : files){
filesToScan[i] = file.getAbsolutePath();
i++;
}
callMediaScanner_kitkat(filesToScan);
return list;
}
public void callMediaScanner_kitkat(final String[] files) {
MediaScannerConnection.scanFile(context, files, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
Log.i("Test", "Scanned " + path);
getVideosList_kitkat(context, uri);
}
});
}
public void getVideosList_kitkat(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.DATE_MODIFIED};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
while (cursor.moveToNext()){
Video video = new Video();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Video.Media._ID));
String nombre = (cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE))).toLowerCase();
video.setName(nombre + XSalesApplication.getActivityContext().getResources().getString(R.string.video_extension));
video.setId(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)));
video.setSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)));
video.setUrlMedia(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))); video.setlastModified(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED)));
Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(video.getUrlMedia(), Thumbnails.MICRO_KIND);
video.setPhotoBitmap(bmThumbnail);
list.add(video);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}