在Android Q(API级别29)及更高版本中,由于隐私和安全性的提升,系统对文件访问权限进行了更严格的限制。这导致从Uri加载视频缩略图时可能会遇到问题。
在Android Q中,直接从Uri加载视频缩略图可能会遇到权限问题,因为系统不允许应用直接访问外部存储或网络位置的内容。
以下是几种解决方法:
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
public Bitmap getVideoThumbnail(Context context, Uri videoUri) {
ContentResolver contentResolver = context.getContentResolver();
String[] projection = { MediaStore.Video.Thumbnails.DATA, MediaStore.Video.Thumbnails.VIDEO_ID };
String selection = MediaStore.Video.Thumbnails.VIDEO_ID + " = ?";
String[] selectionArgs = { String.valueOf(ContentUris.parseId(videoUri)) };
Cursor cursor = contentResolver.query(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null);
Bitmap thumbnail = null;
if (cursor != null && cursor.moveToFirst()) {
int dataIndex = cursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA);
String path = cursor.getString(dataIndex);
thumbnail = BitmapFactory.decodeFile(path);
cursor.close();
}
return thumbnail;
}
import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.net.Uri;
public Bitmap getVideoThumbnail(Context context, Uri videoUri) {
String filePath = getFilePathFromUri(context, videoUri);
if (filePath != null) {
return ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MINI_KIND);
}
return null;
}
private String getFilePathFromUri(Context context, Uri uri) {
String filePath = null;
String[] projection = { MediaStore.MediaColumns.DATA };
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
filePath = cursor.getString(columnIndex);
}
cursor.close();
}
return filePath;
}
通过以上方法,您可以在Android Q及更高版本中成功加载视频缩略图。
领取专属 10元无门槛券
手把手带您无忧上云