android - 在android Q中选择视频时崩溃
问题描述
我的以下代码在其他 android 版本中运行良好,但在我尝试选择视频时在 android Q 中崩溃
添加了写入和读取权限 我的 SDK 版本是 28.0.2 上述代码的视频录制工作正常
使用下面的代码来启动意图
val videoIntent = Intent(Intent.ACTION_PICK)
videoIntent.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*")
videoIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
videoIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)
videoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) startActivityForResult(videoIntent,
GALLERY_VIDEO)
在 OnActivityResult
if (data?.data != null) {
if (data.clipData != null) {
val mClipData = data.clipData
for (i in 0 until mClipData!!.itemCount) {
val item = mClipData.getItemAt(i)
val uri = item.uri
val videoPath = fileUtil.getVideoPath(this, uri)
if (videoPath != null) {
videoList.add(VideoType(videoPath, videoPath))
}
videoPath?.let { MediaType(it, videoPath, VIDEO) }?.let { mediaUrls.add(it) }
videoListAdapter.notifyDataSetChanged()
}
} else {
val contentURI = data.data
val videoPath = fileUtil.getVideoPath(this, contentURI)
val type = videoPath?.let { MediaType(it, contentURI.toString(), VIDEO) }
if (videoPath != null) {
videoList.add(VideoType(videoPath, videoPath))
}
videoPath?.let { MediaType(it, videoPath, VIDEO) }?.let { mediaUrls.add(it) }
videoListAdapter.notifyDataSetChanged()
}
}
获取视频路径方法
fun getVideoPath(context: Context, uri: Uri?): String? {
val projection = arrayOf(MediaStore.Video.Media.DATA)
var contentUri = ""
val cursor =
context.contentResolver.query(uri!!, projection,
null, null, null)
if (cursor != null) {
val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)
cursor.moveToFirst()
contentUri = cursor.getString(columnIndex)
cursor.close()
}
return contentUri
}
日志消息
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=101, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/-1/2/content://media/external/video/media/26/ORIGINAL/NONE/529191973 flg=0x1 clip={text/uri-list U:content://com.google.android.apps.photos.contentprovider/-1/2/content%3A%2F%2Fmedia%2Fexternal%2Fvideo%2Fmedia%2F26/ORIGINAL/NONE/529191973} }} to activity {com.rizek.android.users/com.rizek.android.users.ui.mediaupload.MediaUploadActivity}: java.lang.IllegalArgumentException: Invalid column latitude
at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.IllegalArgumentException: Invalid column latitude
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
at android.content.ContentResolver.query(ContentResolver.java:944)
at android.content.ContentResolver.query(ContentResolver.java:880)
at android.content.ContentResolver.query(ContentResolver.java:836)
at com.rizek.android.users.utils.file.FileUtil.getVideoPath(FileUtil.kt:41)
at com.rizek.android.users.ui.mediaupload.MediaUploadActivity.onActivityResult(MediaUploadActivity.kt:244)
解决方案
有同样的问题,设法通过从 ACTION_PICK 更改 Intent 并添加额外的标志来使其工作,例如:
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");
((AppCompatActivity) context).startActivityForResult(i, Utils.VIDEO_GALLERY_REQUEST_CODE);
然后在 onActivityResult() 中获得持久权限。
if (requestCode == Utils.VIDEO_GALLERY_REQUEST_CODE && resultCode == AppCompatActivity.RESULT_OK) {
final Uri videoUri = data.getData();
getContentResolver().takePersistableUriPermission(
videoUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
((PhotosViewModel) mModel).videoChosen(videoUri);
}
最后,在这些更改之后,我设法获得了缩略图:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
try {
Bitmap thumbnail =
getApplication().getContentResolver().loadThumbnail(
uri, new Size(300, 300), null);
} catch (IOException e) {}
而且我能够使用访问视频
getContentResolver().openInputStream(Uri.parse(videoURI))
以及使用 videoView 中的 URI 来播放视频。希望这个对你有帮助。
推荐阅读
- c#-4.0 - 仅更改一个 Console.WriteLine 的颜色
- javascript - 通过单击按钮在 html 页面上显示名称。该按钮是使用数据库中的数据生成的
- shopify - 如何为我的 Shopify 产品动态设置 SEO 标题和描述
- javascript - 在每个间隔后都有一个循环来改变卡片的样式
- unit-testing - 尝试使用 Jest 模拟 fs.readFileSync 时出错
- azure-devops - Azure DevOps Board - 我可以添加新列,根据某些标准(例如“标签”值)汇总特定故事(故事点)的列表
- java - java中的休眠ManyToOne ORM在一侧持久化对象时获取重复行
- c# - EF Core 自定义扩展查询,无法翻译 LINQ 表达式
- algorithm - Fortran 中的 Gauss-Legendre 和 Gauss-Chebyshev 求积
- python - openpyxl 数据验证可以处理包括逗号的字符串吗?