2014-12-10 3 views
1

Мне нужно отобразить миниатюру каждого видео в виде списка, используя библиотеку Picasso для работы быстрее, поэтому мне нужно получить путь к миниатюре для использования.Показать изображение видео

Это мой код, чтобы получить эскиз путь (я нашел его на Google и я что-то изменить, чтобы адаптировать для моего приложения):

String getThumbnailPathForLocalFile(Uri uri) 
    { 
     Cursor thumbCursor = null; 
     try 
     { 
      thumbCursor = c.getContentResolver(). 
        query(uri 
        , null 
        , null , null, null); 

      if(thumbCursor.moveToFirst()) 
      { 
       // the path is stored in the DATA column 
       int dataIndex = thumbCursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); 
       String thumbnailPath = thumbCursor.getString(dataIndex); 
       return thumbnailPath; 
      } 
     } 
     finally 
     { 
      if(thumbCursor != null) 
      { 
       thumbCursor.close(); 
      } 
     } 

     return null; 
    } 

Моя GetView функция:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) c 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.listview_item, null); 
     } 

     /* create a new view of my layout and inflate it in the row */ 
     // convertView = (RelativeLayout) inflater.inflate(resource, null); 

     final Item item = items.get(position); 
     if (item != null) { 
      TextView t1 = (TextView) v.findViewById(R.id.txt_fileName); 
      imageCity = (ImageView) v.findViewById(R.id.img_icon); 

      switch (item.getType()) { 
      case "video": 
       String uri2 = item.getPath(); 
       Uri videoUri = MediaStore.Video.Thumbnails 
         .getContentUri(uri2); 
       String VideoThumbnailPath =getThumbnailPathForLocalFile(videoUri); 
       Picasso.with(c).load(new File(VideoThumbnailPath)) 
         .resize(64, 64).into(imageCity); 
       break; 
      case "image": 
       String uri4 = item.getPath(); 
       Picasso.with(c).load(new File(uri4)).resize(64, 64).into(imageCity); 
       break; 
      default: 
       break; 
      } 


      if (t1 != null) 
       t1.setText(item.getName()); 

     } 
     return v; 
    } 

проверить LogCat и debug, поэтому я обнаружил, что thumbCursor имеет значение null:

12-10 17:52:38.400: E/AndroidRuntime(8659): java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()' on a null object reference 
12-10 17:52:38.400: E/AndroidRuntime(8659):  at com.example.knock.FileArrayAdapter.getThumbnailPathForLocalFile(FileArrayAdapter.java:105) 
12-10 17:52:38.400: E/AndroidRuntime(8659):  at com.example.knock.FileArrayAdapter.getView(FileArrayAdapter.java:73) 

Кто-нибудь может мне помочь? Большое спасибо

+0

говорит об ошибке '' thumbCursor' является null', что приводит к HTTP: // stackoverflow.com/questions/13080540/what-causes-androids-contentresolver-query-to-return-null - может быть, ваш Ури плох. (Это должно быть 'content: // media/external/..' для работы в этом коде) – zapl

+0

Uri Я получаю как: content: //media//storage/emulated/0/DCIM/Camera/20141210_095445.mp4/ видео/миниатюры. это правильно ? – ducanhZ5Z

ответ

2

Неправильное использование вашего Uri. getContentUri(String volumeName) ожидает волшебное слово "external" вместо пути. И у вас может не быть эскиза.

Вы можете загрузить эскизы с этим куском кода

private static final String SELECTION = MediaColumns.DATA + "=?"; 
private static final String[] PROJECTION = { BaseColumns._ID }; 
public static Bitmap loadVideoThumbnail(String videoFilePath, ContentResolver cr) { 
    Bitmap result = null; 
    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
    String[] selectionArgs = { videoFilePath }; 
    Cursor cursor = cr.query(uri, PROJECTION, SELECTION, selectionArgs, null); 
    if (cursor.moveToFirst()) { 
     // it's the only & first thing in projection, so it is 0 
     long videoId = cursor.getLong(0); 
     result = MediaStore.Video.Thumbnails.getThumbnail(cr, videoId, 
       Thumbnails.MICRO_KIND, null); 
    } 
    cursor.close(); 
    return result; 
} 

Что это делает:

  1. Посмотрите видео Id файла, запрашивая Video.Media
  2. пропуск, VideoID в getThumbnail который блокирует (в вашем случае нить ui ..) до тех пор, пока миниатюра не будет сделана & декодирована.

Большой недостаток заключается в том, что вы не можете использовать путь для Пикассо здесь. (Выполнение пользовательских загрузок, https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/MediaStoreRequestHandler.java представляется реализацией, некоторое описание об этом здесь: http://blog.jpardogo.com/requesthandler-api-for-picasso-library/)

Вы можете получить дорожки эскизов, но если вы посмотрите на содержимое таблицы миниатюр, например. через этот фрагмент кода

StringBuilder sb = new StringBuilder(); 
    Cursor query = getContentResolver().query(
      Video.Thumbnails.EXTERNAL_CONTENT_URI, null, null, null, null); 
    DatabaseUtils.dumpCursor(query, sb); 
    query.close(); 
    Log.d("XXX", sb.toString()); 

Вы увидите, что не у каждого видео есть миниатюра.

Но те, которые могут быть найдены с помощью

public static String loadVideoThumbnailPath(String videoFilePath, 
     ContentResolver cr) { 
    String result = null; 
    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
    String[] selectionArgs = { videoFilePath }; 
    Cursor cursor = cr.query(uri, PROJECTION, SELECTION, selectionArgs, 
      null); 
    long videoId = -1; 
    if (cursor.moveToFirst()) { 
     videoId = cursor.getLong(0); 
    } 
    cursor.close(); 
    if (videoId > 0) { 
     Uri uri2 = MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI; 
     String[] projection2 = { MediaStore.Video.Thumbnails.DATA }; 
     String selection2 = MediaStore.Video.Thumbnails.VIDEO_ID + "=?"; 
     String[] selectionArgs2 = { String.valueOf(videoId) }; 
     Cursor cursor2 = cr.query(uri2, projection2, selection2, selectionArgs2, null); 
     if (cursor2.moveToFirst()) { 
      result = cursor2.getString(0); 
     } 
     cursor2.close(); 
    } 
    return result; 
} 

(все тот же PROJECTION & SELECTION константы сверху)

+0

все еще не работает. Я копирую ваш код и свою строку videopath = "/storage/emulated/0/DCIM/Camera/20141210_095445.mp4", но когда я отлаживаю, я обнаружил, что cursor2 имеет значение null. Может быть, у этого видео нет снимка. Я не знаю, что мне теперь нужно делать :( – ducanhZ5Z

+0

@ ducanhZ5Z Я бы посмотрел на загрузчик медиашкола picasso (который ожидает контентный uris, такой как «content: // media/external/video/media/234', т.е. MediaStore.Video. Media.EXTERNAL_CONTENT_URI + videoId) или написать свой собственный. Первая часть кода должна работать, потому что она ждет генерации миниатюр, и вы можете найти почти то же самое в этом загрузчике.Путь, который вы выберете из второго, - это «Thumbnails.MINI_KIND», поэтому запуск первой части кода с мини-микро, а не микро, должен сделать вторую работу тоже, но это не практический вариант. – zapl

 Смежные вопросы

  • Нет связанных вопросов^_^