Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:不推荐的Context.MODE\u WORLD\u可读的替代方案?_Android_Video_Video Processing - Fatal编程技术网

Android:不推荐的Context.MODE\u WORLD\u可读的替代方案?

Android:不推荐的Context.MODE\u WORLD\u可读的替代方案?,android,video,video-processing,Android,Video,Video Processing,我知道一种编写文件并可供其他应用程序和其他意图访问的方法,但现在Context.MODE\u WORLD\u READABLE已被弃用,我如何才能安全地实现这一点 FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE); 好的,更多信息: 我用这个: intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(ur

我知道一种编写文件并可供其他应用程序和其他意图访问的方法,但现在Context.MODE\u WORLD\u READABLE已被弃用,我如何才能安全地实现这一点

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE);
好的,更多信息:

我用这个:

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

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

看起来文档对此很清楚

此常量在API级别17中被弃用

创建世界可读文件是非常危险的,并且可能导致 应用程序中的安全漏洞。强烈劝阻;相反 应用程序应该使用更正式的交互机制,例如 ContentProvider、BroadcastReceiver和服务。没有 保证此访问模式将保留在文件上,例如 它需要进行备份和恢复。文件创建模式:允许所有 对创建的文件具有读取权限的其他应用程序

uri将是我将写入SD卡位置的uri

默认情况下,该模式已经是可写的。还要注意,您列出的代码(
openFileOutput()
)没有写入外部存储器(您错误地称之为“SD卡”)<代码>openFileOutput()用于内部存储

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

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


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

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

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));

祝你好运。

谢谢。这很恰当DIf如果视频文件已作为文件保存到内部存储器中(使用
getCacheDir
给定的位置),您是说ContentProvider可以以某种方式为视频视图提供URI,然后视频视图可以播放?因为内部保存的视频的直接URI不起作用(我猜是因为视频文件需要是全世界可读的,才能由视频视图播放,但如果在应用程序的私有内部缓存中,则不是全世界可读的)。@DanielSmith:“你是说ContentProvider可以以某种方式为视频视图提供URI,然后视频视图就可以播放了吗?“--视频很棘手,因为通常播放器需要可查找的流(可以向前或向后移动),而由
内容提供商发布的流是不可查找的。我不知道任何视频格式可以用仅向前的流播放,尽管我没有研究过这一点。@commonware:那么…是否不可能播放存储在内部缓存中的视频?关于这个主题,有这么多问题,但似乎没有一个是不可能的o有工作解决方案。我当前的工作解决方案将视频临时存储在外部缓存中,但仍然可以使用
adb pull…
提取视频,我更希望这些视频由内部私有缓存保护。想法?@DanielSmith:“那么。。。是否无法播放存储在内部缓存中的视频?”--如果您使文件世界可读(通过API级别9+上的
openFileOutput()
,或
setReadable(true)
),它应该是可播放的。我听说有人设置HTTP守护进程从内部存储播放视频,尽管这似乎很痛苦。而且,由于任何想要通过根访问内部存储的人都可以访问内部存储,这不像内部存储是一座牢不可破的堡垒。谢谢你的帮助,我不想将SD卡用于临时文件,请注意is是Api 9或更高版本,因此最终使用模式“世界可读”用于Api 8,而这用于9或更高版本。当然,最好的选择是ContentProvider,在某些情况下,这将不起作用。例如,播放器无法访问保存在视频文件相同位置的srt文件,并且使用相同的名称,即使我们为srt文件设置了“可读”。@hasan83如果我写的话使用FileOutputStream将一个文件发送到data/data/com.*****/myfolder,它不允许我像上面那样读取文件,原因是什么?