2012-08-02 22 views
5

Tôi đang cố gắng tải xuống tệp video và sau đó phát tệp đó trong ứng dụng, nếu tôi đặt tệp video trong thư mục res, tôi có thể phát video mà không gặp sự cố Tuy nhiên, khi tôi thử và tải xuống video thì phát lại, tôi nhận được lỗi VideoView: 1, -2147483648.Phát video đã tải xuống Lỗi: 1, -2147483648

Đây là mã tôi sử dụng để tải các video:

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

này xuất hiện để hoàn thành công, nhưng khi tôi cố gắng để chơi các tập tin với mã sau, tôi nhận được lỗi.

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

Như đã thấy trong mã, trước khi phát, tôi kiểm tra xem tệp có tồn tại không và kích thước của tệp (kích thước bằng với tệp đã tải xuống) nhưng không phát, tôi đoán tệp là bị hỏng nhưng tôi không biết tại sao.

tôi có các điều khoản sau đây đặt trong manifest

<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

Tôi gặp vấn đề tương tự. Bất cứ câu trả lời nào ? –

+1

bạn có thể đăng toàn bộ stacktrace của mình không? Ngoài ra, bạn đã kiểm tra (giống như với một kiểm tra và kích thước hoặc một cái gì đó) mà tập tin của bạn là hợp lệ (có thể có gì đó sai với phần tải về)? – njzk2

+0

Tải xuống một tệp lớn có thể cần một phương pháp mạnh mẽ hơn, như tải xuống theo khối. – mparaz

Trả lời

0

Nó xảy ra với tôi một lần, vấn đề là với các điều khoản. Bạn phải làm gì khi tải xuống tệp, bạn phải cấp quyền đọc/ghi. Vì vậy, sau khi tải file, thêm những dòng này và hãy thử:

      file.setExecutable(true, false); 
          file.setReadable(true, false); 
          file.setWritable(true, false); 
0

Chỉ cần một câu hỏi, tại sao bạn không vượt qua URL tới video trực tiếp đến VideoView? Thông thường tất cả các ví dụ bạn thấy trên web làm điều này:

VideoView video = new VideoView(mContext); 
video.setMediaController(new MediaController(mContext)); 
video.setVideoURI(Uri.parse(this.url)); 

đâu "mContext" trong bối cảnh ứng dụng của bạn và "this.url" là URL mà bạn cần phải tải trong VideoView.

0

Vì tôi hiểu đây là vấn đề về quyền. Các tập tin cần phải được thế giới có thể đọc được, nhưng tôi giả sử bạn không muốn buộc người dùng phải root điện thoại của mình để có thể chạy lệnh linux thích hợp.

Đó lá bạn với hai lựa chọn:

  1. Kể từ khi ứng dụng sở hữu các tập tin, bạn có thể sử dụng một đặc tả tập tin để mở tập tin

    FileInputStream FileInputStream = new FileInputStream ("/ data/data/com.mypackage/myfile "); mediaPlayer.setDataSource (fileInputStream.getFD());

    Nhưng vì bạn không sử dụng MediaPlayer, tôi đoán đó không phải là một tùy chọn.

  2. Đặt quyền khi nhận tệp.

    String basedir = ("/data/data/com.companyname.appname/files/videos/videoFilename.mp4"); Tệp tệp = this.ctx.getDir (dựa trên, Ngữ cảnh.MODE_WORLD_READABLE);

Hy vọng điều đó sẽ hữu ích! Chúc mừng.

1

Trong trường hợp của tôi, lỗi do trình phát đa phương tiện không có quyền đối với tệp được lưu trữ cục bộ trong video. Thử lưu trữ video vào bộ nhớ ngoài.

Các vấn đề liên quan