ギャラリーからビデオを選択したい。正常に動作しています。しかし今、私はビットマップをサムネイルとして表示したいと思います。私はこのコードが機能していないのに疲れました、それは常に言います:NullPointerException
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(uri.getPath, MediaStore.Video.Thumbnails.MICRO_KIND);
これはすべてonActivityResultにあります。
ビデオUriからビットマップを取得するにはどうすればよいですか?
ご協力いただきありがとうございます
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)
最新の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();
お役に立てれば
これを試してください:
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail( uri.getPath() , MediaStore.Images.Thumbnails.MINI_KIND );
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のサムネイルを生成します。
API 27の場合、ドキュメントURIの場合(1000はマイクロ秒)
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );
createVideoThumbnail()
には、コンテンツURIではなく、ファイルパスが必要です。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()
のドキュメント