2012-06-28 43 views
0

我的目標:Android:無法播放視頻解壓後或在webview中複製

下載包含視頻和JS文件的zip文件。創建一個運行JS文件的webview(其中包含一個視頻標籤來播放該視頻文件)。

問題:當我嘗試播放視頻我得到一個錯誤說「抱歉,該視頻無法播放」。在logcat的獲取:錯誤(1,-2147483648)

這裏是解壓文件的代碼:

String path = context.getFilesDir().getPath()+"/"; 
InputStream is; 
ZipInputStream zis; 
try { 
    is = new FileInputStream(zip file); 
    zis = new ZipInputStream(new BufferedInputStream(is));   
    ZipEntry ze = null; 
    while ((ze = zis.getNextEntry()) != null) { 
     String filename = ze.getName(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024]; 
     int count; 

     FileOutputStream fout = 
     _context.openFileOutput(path + filename, Context.MODE_WORLD_READABLE); 

    while ((count = zis.read(buffer)) != -1) { 
      baos.write(buffer, 0, count); 
      baos.toByteArray(); 
      fout.write(baos.toByteArray());    
      baos.reset(); 
     } 
     fout.close();    
     zis.closeEntry(); 
     baos.close(); 
    } 
    zis.close();  
} 

要顯示的視頻我重寫MraidWebChromeClient.onShowCustomView:

super.onShowCustomView(view, callback); 
if (view instanceof FrameLayout) { 
    FrameLayout frame = (FrameLayout) view; 
    if (frame.getFocusedChild() instanceof VideoView) { 
    VideoView video = (VideoView) frame.getFocusedChild(); 
    frame.removeView(video); 
    Activity a = (Activity)getContext(); 
    a.setContentView(video); 
    video.setOnCompletionListener(this); 
    video.setOnErrorListener(this); 
    video.start(); 
    } 
} 

我不相信有與視頻文件的錯誤,尋路或JS因爲:

  • 如果包含一個視頻正常播放是一種資源或者外部http鏈接流。
  • 當加載js文件我使用loadDataWithBaseURL和所有其他圖像元素顯示正常。
  • 我已經將文件從res複製到本地應用程序文件夾(使用與解壓縮代碼類似的代碼),併發生相同的錯誤。

我想要麼:

任何見解這個問題,將不勝感激!

ķ

PS:有沒有人知道爲什麼在正常的網頁瀏覽器,將下載的MP4鏈接,而在其他情況下,它會嘗試和流呢?

編輯: 研究這兩個職位後,似乎表明,Android有安全,防止這樣的: Android - Load video from private folder of app Playing an app local video (.mp4) in a webview 將文件複製到公共外部工作的罰款。

而且與問候到PS:爲什麼一些視頻流和一些下載,安卓3不支持從https流等都將下載的文件。

+0

要縮小問題範圍,請嘗試將其放在外部存儲上作爲測試。這也可以讓你使用另一個應用程序作爲額外的有效性測試來播放已寫出的文件。 –

+0

是的,我們提取的文件到外部存儲,併發揮很好。我們認爲它是一個Android安全問題。 – iakiak

+0

logcat中的任何內容無法從內部存儲播放? –

回答

0
  1. 既然你解壓/從SD卡中讀取視頻/,確保下面的行添加到您的清單文件:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  2. 由於您使用的JS,確保啓用它在你的WebView如下:

    private WebView mWebView; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
         ... 
         ... 
         mWebView = (WebView) findViewById(R.id.webview); 
         mWebView.getSettings().setJavaScriptEnabled(true); 
         ... 
    } 
    
  3. 至於視頻播放,最可靠的解決方案,到目前爲止,我發現是它交給本地的媒體播放器應用程序(因爲我找到了真正的WebView越野車)。爲了實現這一點,你需要Bind JavaScript code to Android code,這樣當用戶點擊視頻縮略圖,您創建相應的意圖並啓動媒體播放器應用程序如下:

    Intent i = new Intent(); 
    i.setAction(android.content.Intent.ACTION_VIEW); 
    File file = new File(PATH_TO_YOUR_VIDEO); 
    i.setDataAndType(Uri.fromFile(file), "video/*"); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    mContext.startActivity(i); 
    
  4. [更新]按官方documentation(參見 「外部存儲訪問文件」),

「如果你正在使用API級別8或更高,使用g^etExternalFilesDir()打開一個文件,該文件表示應該保存文件的外部存儲目錄「。

「如果你正在使用API 7級或更低,使用getExternalStorageDirectory(),打開代表外部存儲的根文件」。

您的解壓縮代碼包含行String path = context.getFilesDir().getPath(),嘗試按照上述修改它。

+0

感謝您的建議。不幸的是,我已經完成了第一點和第二點。 理論上的代碼是很好的,因爲它可以播放視頻,如果js給視頻一個外部URL流,或一個文件uri嵌入式原始資源。 它只是無法播放我手動複製或解壓到本地文件存儲的文件,例如:data/data//files – iakiak

+0

@iakiak:查看上面的更新(點#4)。讓我知道如果這有效! :) –

+0

再次感謝您的幫助。 我們希望存儲和播放應用本地存儲中的文件。從這兩個職位:http://stackoverflow.com/questions/9067468/android-load-video-from-private-folder-of-app和http://stackoverflow.com/questions/7739494/playing-an-app -local-video-mp4-in-a-webview 由於安全原因,似乎這是不可能的。 如果您按照建議將文件複製到外部存儲,則視頻播放正常。 – iakiak