我正在尝试下载视频文件然后在应用中播放,如果我将视频文件放在res文件夹中我可以毫无问题地播放它,但是当我尝试下载视频时播放它我得到VideoView错误:1,-2147483648。
这是我用来下载视频的代码:
try
{
URL url = new URL(videoURL);
URLConnection conexion = url.openConnection();
conexion.connect();
int lengthOfFile = conexion.getContentLength();
Log.d("ANDRO_ASYNC", "Length of file: " + lengthOfFile);
InputStream input = new BufferedInputStream(url.openStream());
final File dir = new File(this.getFilesDir() + "/videos");
dir.mkdirs(); //create folders where write files
final File file = new File(dir, "my_video.mp4");
Log.d("writePath", file.getPath());
FileOutputStream output = new FileOutputStream(file);
byte data[] = new byte[1024];
long total = 0;
while((count = input.read(data)) != -1)
{
total += count;
//publishProgress("" + (int)((total*100) / lengthOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
Log.d("download", "finished");
}
catch(Exception e)
{
Log.d("Exception", e.getMessage());
}
这似乎已成功完成,但当我尝试使用以下代码播放文件时,我收到错误。
// Play Video
videoView = (VideoView)findViewById(R.id.surface_view);
//
File f = new File("/data/data/com.companyname.appname/files/videos/videoFilename.mp4");
if(f.exists())
{
long len = f.length();
String length = String.valueOf(len);
Log.d("file", "exists");
Log.d("length", (String)length);
}
else
{
Log.d("file", "does not exist");
}
//
videoView.setMediaController(new MediaController(this));
videoView.setVideoPath(f.getPath());
videoView.start();
如代码所示,在播放之前我检查文件是否存在以及它的大小(它与下载的文件大小相同)但它不会播放,我猜这个文件已损坏但是我不知道不知道为什么。
我在清单中设置了以下权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_INTERAL_STORAGE" />
答案 0 :(得分:1)
在我的情况下,错误是由于媒体播放器没有本地存储视频的文件权限。尝试将视频存储到外部存储设备中。
答案 1 :(得分:0)
它曾经发生在我身上,问题在于权限。 下载文件时必须执行的操作,必须赋予其读/写权限。 因此,在下载文件后,添加以下行并尝试:
file.setExecutable(true, false);
file.setReadable(true, false);
file.setWritable(true, false);
答案 2 :(得分:0)
只有一个问题,为什么不直接将视频的URL传递给VideoView? 通常,您在网络上看到的所有示例都会执行此操作:
VideoView video = new VideoView(mContext);
video.setMediaController(new MediaController(mContext));
video.setVideoURI(Uri.parse(this.url));
您的应用程序上下文中的“mContext”和“this.url”是您需要在VideoView中加载的URL。
答案 3 :(得分:0)
据我了解,这是一个权限问题。该文件需要具有全局可读性,但我认为您不希望强制用户使用他/她的手机来运行正确的linux命令。
这给你留下了两个选择:
由于应用程序拥有该文件,您可以使用FileDescriptor打开该文件
FileInputStream fileInputStream = new FileInputStream(“/ data / data / com.mypackage / myfile”); mediaPlayer.setDataSource(fileInputStream.getFD());
但是既然你没有使用MediaPlayer,我想这不是一个选择。
获取文件时设置权限。
String basedir =(“/ data / data / com.companyname.appname / files / videos / videoFilename.mp4”); 文件file = this.ctx.getDir(basedir,Context.MODE_WORLD_READABLE);
希望它有所帮助!欢呼声。