【问题标题】:Shared Video Uri leads to "No content provider" after App restart应用重启后共享视频 Uri 导致“无内容提供者”
【发布时间】:2021-06-29 13:28:04
【问题描述】:

我的活动获取共享视频的 Uri 并将其保存到数据库中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type.startsWith("video")){
        Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
        Log.i("MyActivity", uri.toString());
        // save uri.toString() to database
        // ...
    }
}

如果视频与 Android 的文件资源管理器共享,则 Log.i 打印

content://media/external/video/media/8719

如果视频与 MxPlayer 共享,则 Log.i 打印

content://com.mxtech.videoplayer.pro.fileprovider/external_storage_root/Movies/20201026_192614.mp4

重启应用后,只能使用第一个 Uri 播放视频。使用后一个 Uri 会导致

Caused by: java.io.FileNotFoundException: No content provider: content://com.mxtech.videoplayer.pro.fileprovider/external_storage_root/Movies/20201026_192614.mp4

如何处理来自第三方应用的 Uris?是否可以将共享的 Uri 转换为“通用”格式?是权限问题吗?

【问题讨论】:

  • 但是你可以在收到 uri 时播放它吗?
  • 是的,视频已播放

标签: android android-intent uri android-fileprovider


【解决方案1】:

当您收到Uri 时,您使用它的时间非常有限。对于您从ACTION_SEND 获得的Uri,您应该假设:

  • 您响应ACTION_SEND Intent 的活动可以使用Uri
  • 您不能保留 Uri 并在将来使用它

如何处理来自第三方应用的 Uris?

对于ACTION_SEND,请立即使用。不要尝试将其保存到数据库中。对于您通过ACTION_OPEN_DOCUMENTyou have more options 获得的Uri

是否可以将共享的 Uri 转换为“通用”格式?

不,抱歉。

【讨论】:

  • 感谢您对 ACTION_SEND 意图的生命周期的澄清。我仍然很好奇为什么第一个 Uri 在从存储中读取后仍然有效。是因为 Uri 的格式更正式吗?
  • @paddel10:不,部分原因是没有“正式格式”的概念。第一个恰好是来自MediaStoreUri。除了通过ACTION_SEND 流程授予您的权利之外,您可能有权访问该内容。将第一个Uri 想象成一个公开可见网页的URL。将第二个Uri 想象成一个受密码保护的网页的 URL,其中当时用户恰好已登录并有一个活动会话。最终该会话超时。虽然会话很好,但您可以使用 URL,但之后就不行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多