2016-12-29 19 views
0

私はビデオを持っており、サムネイルを取得する必要があります。私はこの目的のためにThumbnailUtilsクラスを使用しますが、期待される代わりにnullを返しますBitmap。私のアプリケーションをデバッグすると、createVideoThumbnailのメソッドMediaMetadataRetriever.setDataSourceが呼び出され、IllegalArgumentExceptionがスローされることがわかります。ThumbnailUtils.createVideoThumbnailは、既存のmp4ビデオのヌルを返します

public void setDataSource(String path) throws IllegalArgumentException { 
    if (path == null) { 
     throw new IllegalArgumentException(); 
    } 

    try (FileInputStream is = new FileInputStream(path)) { 
     FileDescriptor fd = is.getFD(); 
     setDataSource(fd, 0, 0x7ffffffffffffffL); 
    } catch (FileNotFoundException fileEx) { 
     throw new IllegalArgumentException(); // and I've found out that method throws IllegalArgimentException inside this catch block 
    } catch (IOException ioEx) { 
     throw new IllegalArgumentException(); 
    } 
} 

私はそれが与えられたファイルのファイルが存在しないことを意味だと思う:setDataSource内部で私はこのコードを参照してください。しかし、私はファイルシステムでそれを見て、それは正常に再生されます。たぶん別の理由があるのでしょうか?

+0

こんにちは以下のコードを使用してあなたの質問を1として、私は 'ThumbnailUtils.createVideoThumbnailを()'を見つけることができない、あなたは、このいずれかの場所を定義しましコードスニペットを改善してください。 – TejaDroid

+0

あなたに役立つ答えがありますか?もしあれば、適切なものとしてマークしてください。 – b2mob

答えて

2

質問はあなたがそのメソッドに渡しているものと、取得しているものからですか?

以下は私がこれをやっているやり方で、これは私にとってはうまくいくので、あなたにとってもうまくいくはずです。あなたはhttps://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java#L257getPath(Context context, Uri uri)メソッドを使用する必要があります

File videoFile = new File(selectedVideoPath); 

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoFile.getAbsolutePath(), MediaStore.Video.Thumbnails.FULL_SCREEN_KIND); 

selectedVideoPathを取得します。また、あなたがvideoFilevideoFile.exists()を呼び出すことによって、存在する場合はチェックを追加することができます

public static String getPath(final Context context, final Uri uri) { 

    if (DEBUG) 
     Log.d(TAG + " File -", 
       "Authority: " + uri.getAuthority() + 
         ", Fragment: " + uri.getFragment() + 
         ", Port: " + uri.getPort() + 
         ", Query: " + uri.getQuery() + 
         ", Scheme: " + uri.getScheme() + 
         ", Host: " + uri.getHost() + 
         ", Segments: " + uri.getPathSegments().toString() 
       ); 

    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
     // LocalStorageProvider 
     if (isLocalStorageDocument(uri)) { 
      // The path is the id 
      return DocumentsContract.getDocumentId(uri); 
     } 
     // ExternalStorageProvider 
     else if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" + split[1]; 
      } 

      // TODO handle non-primary volumes 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 

      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); 

      return getDataColumn(context, contentUri, null, null); 
     } 
     // MediaProvider 
     else if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 

      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[] { 
        split[1] 
      }; 

      return getDataColumn(context, contentUri, selection, selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 

     // Return the remote address 
     if (isGooglePhotosUri(uri)) 
      return uri.getLastPathSegment(); 

     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 

    return null; 
} 

:もともとは、ように見えました。さらに

あなたがマニフェストファイルにREAD_EXTERNAL_STORAGE権限が含まれているかどうかをチェックすることができ、外部記憶装置から読み取るしようとしているならば、あなたは、ファイルを保存し、それを取得しようとしている場合は、あなたもWRITE_EXTERNAL_STORAGEを必要とすべきであるサムネイル許可。

+0

@Oleg Ryabtsev、それがうまくいけば、私の答えを受け入れるでしょうか?ありがとう。 – b2mob

0

ビデオのサムネイルを作成するためのnullの背後には2つの理由があります。ビデオが破損しているか、フォーマットがThumbnailUtilsにサポートされていません。

ダブルあれば、あなたのファイル形式をチェックして、サムネイルのため

// Create VideoThumbnail from sdcard path like this. 

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND); 
関連する問題