Android包内资源的路径

3

我尝试向Android示例项目MediaPlayerDemo添加视频路径。

当视频存储在sdcard中时,我可以播放它,路径为 "file:///sdcard/dcim/a.m4v"。

但是,当视频存储在res/drawable中时,我无法播放它,路径为 "android.resource://" + this.getPackageName() + "/" + R.drawable.a。

我可以在调试模式下读取视频的ID,但是就是不能播放该视频。

如何解决?

更新

谢谢回复,到目前为止我已经尝试过:

  1. 将视频放入assets文件夹中,并将路径设置为"file:///android_asset/a.m4v"。
  2. 将视频放入raw文件夹中,并将路径设置为 ("android.resource://" + this.getPackageName() + "/" + R.raw.a) 或 ("android.resource://" + this.getPackageName() + "/raw/a")。

但它们都无法播放视频。我的视频大小为1.8Mb,这会有影响吗?


使用以下方式:'Uri myUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.drawable.a); videoHolder.setVideoURI(myUri);' - ρяσѕρєя K
但是将您的视频放入资产或原始文件夹的正确方法是Mayani ans。 - ρяσѕρєя K
我尝试了很多方法,但仍然得到了setDataSourceFD失败的错误:status=0x80000000。 - user1297295
好的,那你把你的代码和日志贴出来吧。 - ρяσѕρєя K
4个回答

7
res 文件夹中创建一个名为 raw 的新文件夹,如果已经创建则不用管它。将你的可播放视频文件(比如 myvideo.mp4)复制到 raw 文件夹中。在你的应用中使用以下代码。
String uriPath = "android.resource://"+getPackageName()+"/raw/myvideo";
Uri uri = Uri.parse(uriPath);
mVideoView.setVideoURI(uri);

我测试过了,对我有效。如果视频可以从sdcard播放,则它才可以从raw文件夹中播放,否则它将显示一个对话框,上面写着“无法播放视频”。
请尝试并告诉我发生了什么。

我尝试了你的方法,还是不行。使用API level10。 我甚至无法通过VideoView从sdcard播放视频。我正在使用MediaPlayer。 无论如何还是谢谢! - user1297295
1
我终于成功播放了本地视频!谢谢,但不要忘记在URI路径中删除文件扩展名,不知道为什么,直到我删除了.mp4扩展名才能正常工作。 - gomezo

2

“FYI”,drawable是用来存储应用程序的图标、图像和可绘制对象。因此,您可以将同一视频放入“assets”或“raw”文件夹中。


谢谢。但我仍然无法在这两个文件夹中播放视频。 - user1297295

0

这个问题很久远了,而且还没有得到很好的回答,所以在这里我来回答一下。

首先,不要把视频放在assets文件夹中,这是一个不好的做法。创建另一个文件夹(最好命名为raw)。

第二件事是,请不要使用m4v格式,而是使用mp4视频。

以下是插入视频的代码:

    //Here it is assumed here that the file name of video in raw folder is demo        
    VideoView video = (VideoView) findViewById(R.id.videoView);
    video.setVideoPath("android.resource//" + getPackageName() + "/" + R.raw.demo);
    video.start();

希望这能澄清你的疑惑!


0

我找到了解决方案,但它不是一种直接的方式。

首先,文件未找到问题不是路径问题,而是权限问题。

为了解决这个问题,许多人建议将文件复制到FileInputStream中。但仍然遇到了文件未找到的问题。

但是文件可以写入Inputstream。但是,Mediaplayer类的setDataSource()不接受InpuStream。因此需要通过BufferedOutputStream将Inputstream写入临时文件。

最后,使用setDataSource(tempfile_path)而没有错误。


File tempfile = File.createTempFile("mediaplayer", "temp"); String tempfilepath = tempfile.getAbsolutePath(); FileOutputStream fo = new FileOutputStream(tempfile); BufferedOutputStream bis = new BufferedOutputStream(fo); byte buf[] = new byte[128]; do { int numread = is.read(buf); if (numread <= 0) break; bis.write(buf, 0, numread); } while (true); mMediaPlayer.setDataSource(tempfilepath); - user1297295
请使用您的帖子下方的“编辑”链接按钮添加更多信息,而不是使用评论部分。这样做会使阅读变得更加困难。 - ForceMagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接