在android Q中选择视频时崩溃

问题描述 投票:1回答:1

我的下面的代码在安卓其他版本中工作正常,但在安卓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()
                }
            }

getVideoPath方法

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)
android android-contentprovider
1个回答
0
投票

有同样的问题,设法通过改变ACTION_PICK的意图,并添加额外的标志,如工作。

        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来播放视频。希望这对你有一点帮助。

© www.soinside.com 2019 - 2024. All rights reserved.