使用 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();
        }
      }
    }