视频视图可以播放内部存储中存储的视频吗?
我试图为我的用户提供使用外部或内部存储的能力。我正在显示图像和视频(具有科学性质)。当将媒体存储在 SD 卡上时,一切都很好。但是当我在内部存储媒体时,只会显示图像。无论我尝试什么,在尝试加载和显示存储在 applicationcontext.getFilesDir() 下的媒体时都会遇到各种错误。
将视频视图的内容设置为这样的文件是否有技巧?
ContentResolver 可以帮助我吗?
与此相关的是,假设存在外部存储是否被认为是不好的形式?
提前致谢,
Sid
下面是一个失败的版本,并显示“无法播放视频。抱歉,无法播放该视频”。但我还有很多其他的失败方式。我可以将内部视频复制到临时存储(外部)并播放它,所以这个复制到内部确实创建了一个有效的电影。仅当我尝试直接从内部存储播放时才会失败。
videoFile = new File(this.getFilesDir() + File.separator + "test.mp4");
InputStream data = res.openRawResource(R.raw.moviegood);
try {
OutputStream myOutputStream = new FileOutputStream(videoFile);
byte[] buffer = new byte[8192];
int length;
while ( (length = data.read(buffer)) > 0 ) {
myOutputStream.write(buffer);
}
//Close the streams
myOutputStream.flush();
myOutputStream.close();
data.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vview.setKeepScreenOn(true);
vview.setVideoPath(videoFile.getAbsolutePath());
vview.start();
I'm trying to provide my users with the ability to use either external or internal storage. I'm displaying both images and videos (of a scientific nature). When storing the media on the SD card, all is fine. But when I store the media internally, only the images will display. No matter what I try I get various errors when trying to load and display the media stored under the applicationcontext.getFilesDir().
Is there a trick to setting a videoview's content to such a file?
Can a ContentResolver help me?
On a related note, is it considered bad form to assume that external storage exists?
Thanks in advance,
Sid
Below is one version that fails with "Cannot play video. Sorry, this video cannot be played". But I have many other modes of failure. I can copy the internal video to temp storage (external) and play it, so this copy to internal does indeed create a valid movie. It only fails when I try to play it directly from the internal storage.
videoFile = new File(this.getFilesDir() + File.separator + "test.mp4");
InputStream data = res.openRawResource(R.raw.moviegood);
try {
OutputStream myOutputStream = new FileOutputStream(videoFile);
byte[] buffer = new byte[8192];
int length;
while ( (length = data.read(buffer)) > 0 ) {
myOutputStream.write(buffer);
}
//Close the streams
myOutputStream.flush();
myOutputStream.close();
data.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vview.setKeepScreenOn(true);
vview.setVideoPath(videoFile.getAbsolutePath());
vview.start();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
MediaPlayer 要求正在播放的文件具有全局可读权限。您可以在 adb shell 中使用以下命令查看文件的权限:
您可能会看到“-rw-----”,这意味着只有所有者(您的应用程序,而不是 MediaPlayer)具有读/写权限。
注意:您的手机必须已 root 才能使用 ls 命令而不指定文件(在内部存储器中)。
如果您的手机已 root,您可以使用以下命令在 adb shell 中添加世界读取权限:
如果您需要以编程方式修改这些权限(需要 root 手机!),您可以在应用程序代码中使用以下命令:
这基本上是一个Linux命令。有关 chmod 的更多信息,请参阅 https://help.ubuntu.com/community/FilePermissions。
编辑:找到另一种简单的方法此处(对于那些没有root的手机很有用)。由于应用程序拥有该文件,因此它可以创建一个文件描述符并将其传递给 mediaPlayer.setDataSource():
这种方法完全避免了权限问题。
MediaPlayer requires that the file being played has world-readable permissions. You can view the permissions of the file with the following command in adb shell:
You will probably see "-rw------", which means that only the owner (your app, not MediaPlayer) has read/write permissions.
Note: Your phone must be rooted in order to use the ls command without specifying the file (in the internal memory).
If your phone is rooted, you can add world-read permissions in adb shell with the following command:
If you need to modify these permissions programmatically (requires rooted phone!), you can use the following command in your app code:
Which is basically a linux command. See https://help.ubuntu.com/community/FilePermissions for more on chmod.
EDIT: Found another simple approach here (useful for those without rooted phones). Since the application owns the file, it can create a file descriptor and pass that to mediaPlayer.setDataSource():
This approach avoids the permission issue completely.
您可以使用:
如果文件是世界可读的
或者您可以使用内容提供程序
You can use:
if the file is world readable
Or you can use a content provider
有关详细信息查看本教程
For detail check this tutorial
我在那里发布了一个自定义 VideoView 实现。
VideoView 实现具有
setVideoFD(FileDescriptor fd)
方法并解决了此问题。I posted a custom VideoView implementation there.
The VideoView implementation has the
setVideoFD(FileDescriptor fd)
method and solves this issue.我遇到了这个线程同样的问题,我正在将视频从网络下载到内部存储,结果保存时您可以指定 RW 模式,即从
PRIVATE
更改为WORLD_READABLE
I came across this thread with the same problem, I'm downloading my videos from the web to the internal storage, turns out when saving you can specify the RW mode, i.e change from
PRIVATE
toWORLD_READABLE
你不能直接播放它。
您需要实现一个 ContentProvider,然后将定义的 Uri 传递给 setVideoUri(uri) 方法。
You can't just play it directly.
You need to implement a ContentProvider then pass the defined Uri to setVideoUri(uri) method.