我有一些这样的代码
原本:
String path = "android.resource://" + getPackageName() + "/" + R.raw.video;
videoView.setVideoURI(Uri.parse(path));
videoView.requestFocus();
videoView.start();
videoView完美运行。
然后我将代码更改为
String path = "android.resource://" + getPackageName() + "/" + Dbhelper.COLUMN_Path;
videoView.setVideoURI(Uri.parse(path));
videoView.requestFocus();
videoView.start();
我将“ R.raw.video”存储到数据库中的COLUMN.Path中。有用。但是为什么videoView不起作用?它告诉我“不能播放此视频”
答案 0 :(得分:0)
如果您存储R.raw.video
的整数值,那么这是一个整数,系统在编译项目时会为其分配此资源视频文件。
我相信您在运行时检索了它并将其保存到数据库。
只要您使用在编译时构建的apk,此整数值就有效。
但是,如果您进行了任何更改(尤其是对资源)并重新编译,则不能保证该值仍然有效并与该资源相对应,因为可能会为资源值重新分配新的值。
所以你的方法是错误的。
解决此问题的一种方法是在数据库中存储资源的字符串“名称”,即:"video"
(不是完全限定的R.raw.video
)。
现在,当您要从raw
文件夹中检索文件时,
在将值从db获取到videoName
之类的变量后,请执行以下操作:
int id = getResources().getIdentifier(videoName, "raw", getPackageName());
这是检索位于videoName
文件夹中的名为raw
的资源的整数ID的方法。
如果您的代码不在活动中,则需要提供有效的Context
,如下所示:
int id = context.getResources().getIdentifier(videoName, "raw", context.getPackageName());
最后:
String path = "android.resource://" + getPackageName() + "/" + id;
修改
如果您将R.raw.video
作为字符串存储在db中,那么这将无济于事,因为这个完整的字符串没有分配值,正如我之前所解释的。