重新打开应用程序后无法从 uri 播放视频

Can't play video from uri after reopen app

我让用户 select 来自图库的视频,然后我保存视频的 uri 以备将来使用。但是我关闭应用程序并重新打开后,视频无法播放了 这是我用于 select 来自画廊

的视频的意图
private void pickVideoFromGallery() {
        Intent opengalleryIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        opengalleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
        opengalleryIntent.setType("video/*");
        opengalleryIntent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                | Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(opengalleryIntent, RESULT_LOAD_VIDEO);
    } 

我将视频 uri 保存为字符串

    String videoPath = data.getData().toString();

使用:

    String videoPath= getIntent().getStringExtra("videoPath"); //From PendingIntent in ForegroundService
            viFriendCall.setVideoURI(Uri.parse(videoPath));
            viFriendCall.setOnPreparedListener(mp -> mp.setLooping(true));
            viFriendCall.start();

这是我收到的错误消息

E/MediaPlayerNative: Unable to create media player
W/VideoView: Unable to open content: content://com.android.providers.media.documents/document/video%3A9922
    java.io.IOException: setDataSource failed.: status=0x80000000
        at android.media.MediaPlayer.nativeSetDataSource(Native Method)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1209)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1196)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1107)

您必须在 Android 中使用缓存来保存您的数据以备将来使用

  1. 房间数据(可用于对象等复杂数据,类):https://developer.android.com/training/data-storage/room

  2. 数据存储(可用于存储原始数据类型) https://developer.android.com/topic/libraries/architecture/datastore?gclsrc=aw.ds&gclid=Cj0KCQjwmPSSBhCNARIsAH3cYgaKcy6vvBjj2320H6OSog7Wdk8eBVtFrpwsBO3fuNJYm6uc2GKFYGEaAmUrEALw_wcB

你的代码的问题是当用户关闭应用程序时,你初始化的所有变量将从内存中清除,当用户返回应用程序时所有变量将从新鲜

此错误出现在 android 11 及更高版本的设备上。最初承认关闭应用程序后你的uri不再访问file.This是android 11版本的新更新,你可以阅读here

有一种简单的解决方法。如果您想访问该文件供以后在您的应用程序中使用,请将其从原始位置复制到您的应用程序的缓存或文件目录中。

您会在上面找到大量文档。第一次获取文件的 URI 时,只需将文件保存到文件目录中即可。