web-dev-qa-db-ja.com

Uriからビデオサムネイルを取得する

ギャラリーからビデオを選択したい。正常に動作しています。しかし今、私はビットマップをサムネイルとして表示したいと思います。私はこのコードが機能していないのに疲れました、それは常に言います:NullPointerException

Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(uri.getPath, MediaStore.Video.Thumbnails.MICRO_KIND);

これはすべてonActivityResultにあります。

ビデオUriからビットマップを取得するにはどうすればよいですか?

ご協力いただきありがとうございます

5
Zocker Bros

onActivityResult

String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(picturePath, MediaStore.Video.Thumbnails.MICRO_KIND);

編集

Kotlinバージョン

val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor = context.contentResolver.query(uri, filePathColumn, null, null, null)
cursor.moveToFirst()

val columnIndex = cursor.getColumnIndex(filePathColumn[0])
val picturePath = cursor.getString(columnIndex)
cursor.close()

val bitmap = ThumbnailUtils.createVideoThumbnail(picturePath, MediaStore.Video.Thumbnails.MICRO_KIND)
10
shinilms

最新のAPI24では、受け入れられた回答のアプローチに固執すると、いくつかの問題に直面する可能性があります。

たとえば、この行ではint column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);時々W/System.err: Java.lang.IllegalArgumentException: column '_data' does not exist エラーメッセージ。

また、最新のAPIでは、ウィジェットまたは共有コンテンツを処理する場合にSecurityExceptionが発生する可能性があります。心に留めておきます。

Uriのビデオサムネイルについては、MediaMetadataRetrieverを利用するアプローチを使用しているため、StringfilePathを取得する必要はありません。

            MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
            mMMR.setDataSource(context, videoUri);
            bmp = mMMR.getFrameAtTime();

お役に立てれば

8
Kirill Karmazin

これを試してください:

Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail( uri.getPath() , MediaStore.Images.Thumbnails.MINI_KIND );
5
Junaid Fahad
Cursor c = MediaStore.Video.query(cr,uri, new String[]{
    MediaStore.Video.VideoColumns._ID,
    MediaStore.Video.VideoColumns.DATA});
if (c!=null){
    c.moveToFirst();
    int id = Integer.valueOf( c.getString(0) );
    c.close();
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inSampleSize = 1;
    try {
        return MediaStore.Video.Thumbnails.getThumbnail(cr, id, MediaStore.Video.Thumbnails.MINI_KIND, options);
    }catch (Java.lang.SecurityException ex){
        ex.printStackTrace();
        //TODO: add create ThumbnailUtils.createVideoThumbnail
        return null;
    }
}

これは私のために働きます:

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND);

ThumbnailUtilsを使用すると、2種類のサムネイルを作成できます。

MediaStore.Images.Thumbnails.MICRO_KIND --typeは、サイズ96 x96のサムネイルを生成します。MediaStore.Images.Thumbnails.MINI_KIND --typeは、サイズ512 x384のサムネイルを生成します。

0
kishan verma

API 27の場合、ドキュメントURIの場合(1000はマイクロ秒)

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );
0
Style-7
  1. createVideoThumbnail()には、コンテンツURIではなく、ファイルパスが必要です。
  2. ファイルパスには、外部の読み取り権限が必要です。

Null応答が返される場合は、コンテンツuriを使用している可能性があります(ただし、_ThumbnailsUtils.Java_の想定は破損したビデオファイルです)。それを修正すると、権限エラーが発生していました。

次のようにビデオのIDを使用して、コンテンツURIからファイルパスを取得できました。

_val selection = MediaStore.Video.Media._ID + " = $id"
val cursor = 
this.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, 
selection, null, null)      
_

そして、SOの他の回答と同様に、カーソルを続けます。

contentResolver.query() のドキュメント

0
tnJed