【问题标题】:Android: Alternative to the deprecated Context.MODE_WORLD_READABLE?Android:替代已弃用的 Context.MODE_WORLD_READABLE?
【发布时间】:2012-12-01 03:51:09
【问题描述】:

From here我知道一种写入文件并可供其他应用程序和其他意图访问的方法,但现在 Context.MODE_WORLD_READABLE 已弃用,我该如何安全地完成此操作?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE);

好的更多信息:

我正在使用这个:

intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");

而 uri 将是我将写入 sdcard 位置的那个。并且视频将来自应用程序,所以问题是,如果现在不允许这样做,我该如何编写文件并查看它。

【问题讨论】:

    标签: android video video-processing


    【解决方案1】:

    文档似乎对此很清楚。

    此常量在 API 级别 17 中已弃用。

    创建世界可读的文件是非常危险的,并且可能导致 应用程序中的安全漏洞。强烈建议不要这样做;反而, 应用程序应该使用更正式的交互机制,例如 内容提供者、广播接收者和服务。没有 保证此访问模式将保留在文件上,例如当 它经过备份和恢复。文件创建模式:全部允许 其他应用程序对创建的文件具有读取权限。

    【讨论】:

      【解决方案2】:

      而 uri 将是我将写入 sdcard 位置的那个。

      默认情况下已经是MODE_WORLD_WRITABLE。另请注意,您列出的代码 (openFileOutput()) 确实 写入外部存储(您错误地称为“sdcard”)。 openFileOutput() 用于内部存储。

      视频将来自应用程序,所以问题是,如果现在不允许这样做,我该如何编写文件并查看它。

      如果您真的要将文件写入外部存储,只需使用指向该文件的Uri

      如果您要将文件写入内部存储,请创建一个ContentProvider 来提供该文件,并使用一个Uri 指向该ContentProviderHere is a sample applicationContentProvider 在首次运行时从 assets/ 提取 PDF 文件,然后通过 openFile() 提供该文件,以便 PDF 查看器查看。

      【讨论】:

      • 谢谢。这很到位。 :D
      • 如果视频文件已作为文件保存到内部存储(使用getCacheDir 给出的位置),您是说 ContentProvider 可以以某种方式为 VideoView 提供 URI,然后可播放?因为内部保存视频的直接 URI 不起作用(我猜是因为视频文件需要是世界可读的才能被视频视图播放,但如果在应用程序的私有内部缓存中则不是世界可读的)。跨度>
      • @DanielSmith:“你是说 ContentProvider 可以以某种方式为 VideoView 提供一个 URI,然后可以播放?” - 视频很棘手,因为通常播放器需要一个可搜索的流(可以向前移动和向后),并且由ContentProvider 发布的流不可搜索。我不知道有任何视频格式可以使用只进流播放,尽管我还没有研究过这一点。
      • @CommonsWare:那么...是不是不能播放存储在内部缓存中的视频?关于这个主题有很多 SO 问题,但似乎没有一个有效的解决方案。我当前的工作解决方案将视频临时存储在外部缓存中,但仍然可以使用adb pull ... 提取它们,如果这些视频受到内部私有缓存的保护,我更愿意。想法?
      • @DanielSmith:“那么......是否无法播放存储在内部缓存中的视频?” -- 如果你使文件可读(通过openFileOutput(),或API 级别9+ 上的setReadable(true)),它应该是可播放的。我听说有人设置 HTTP 守护程序来播放来自内部存储的视频,尽管这看起来很痛苦。而且由于任何人都可以通过生根进入内部存储,因此内部存储并不是一座坚不可摧的堡垒。
      【解决方案3】:

      使用以下方法将视频保存在内存中:

      openFileOutput("test.mp4", "MODE_PRIVATE");
      

      然后这样做:

      String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory.
      File f = new File(path);
      f.setReadable(true, false);
      Intent playIntent ....
      playIntent.setType("video/*");
      playIntent.setData(Uri.fromFile(f));
      

      祝你好运。

      【讨论】:

      • 谢谢你,这对我有帮助,不想将 sdcard 用于临时文件,请注意这是 Api 9 或更高版本,因此最终将 mode_world_readable 用于 Api 8,而 this 用于 9 及更高版本。
      • 当然最好的选择是ContentProvider,在某些情况下这行不通。例如,即使我们为srt文件设置Readable,播放器也无法访问保存在视频文件相同位置并使用相同名称的srt文件。
      • @hasan83 如果我使用 FileOutputStream 将文件写入 data/data/com.****.***/myfolder,它不允许我以任何理由读取文件吗?跨度>
      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2020-03-03
      • 2019-07-05
      • 2013-04-28
      • 2012-12-03
      • 2020-03-22
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多