(轉)H5通過WebView錄像上傳

轉載自H5通過WebView錄像上傳

前面的博文《Android開發筆記(一百五十二)H5通過WebView上傳圖片》介紹瞭如何拍照上傳給網頁,不料客戶又要求再加個攝像上傳給網頁。既然如此,那麼再探討一下如何實現這個攝像上傳的功能。

與拍照上傳一樣,攝像上傳也要重寫WebChromeClient的openFileChooser/onShowFileChooser方法,在這兩個方法內部跳轉到系統的攝像機頁面,示例代碼如下:
  1.     private static ValueCallback<Uri> mUploadMessage;
  2.     private static ValueCallback<Uri[]> mUploadMessageLollipop;
  3.     
  4.     private class MyWebChromeClient extends WebChromeClient {
  5.         // Android 4.*
  6.         public void openFileChooser(ValueCallback<Uri> uploadMsg,
  7.                 String acceptType, String capture) {
  8.             Log.d(TAG, "openFileChooser 4.1");
  9.             mUploadMessage = uploadMsg;
  10.             recordVideo();
  11.         }
  12.         // Android 5.0+
  13.         @Override
  14.         public boolean onShowFileChooser(WebView webView,
  15.                 ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
  16.             Log.d(TAG, "openFileChooser 5.0+");
  17.             mUploadMessageLollipop = filePathCallback;
  18.             recordVideo();
  19.             return true;
  20.         }
  21.     }
  22.     private final static int VIDEO_REQUEST = 120;
  23.     private void recordVideo() {
  24.         Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
  25.         //設置視頻質量
  26.         intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  27.         //設置視頻時長
  28.         intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
  29.         //開啓攝像機
  30.         startActivityForResult(intent, VIDEO_REQUEST);
  31.     }
在攝像機頁面錄像結束,返回到上一頁時回調onActivityResult方法,所以需要重寫上個頁面的onActivityResult方法,在該方法中把攝像結果傳給h5網頁。下面是回傳視頻的處理代碼:
  1.     @Override
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.         super.onActivityResult(requestCode, resultCode, data);
  4.         Log.d(TAG, "onActivityResult requestCode="+requestCode);
  5.         if (requestCode == VIDEO_REQUEST) {
  6.             if (null == mUploadMessage && null == mUploadMessageLollipop) {
  7.                 return;
  8.             }
  9.             Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
  10.             Log.d(TAG, "onActivityResult path="+result.getPath());
  11.             if (mUploadMessageLollipop != null) {
  12.                 if (resultCode == RESULT_OK) {
  13.                     mUploadMessageLollipop.onReceiveValue(new Uri[]{result});
  14.                     mUploadMessageLollipop = null;
  15.                 } else {
  16.                     mUploadMessageLollipop.onReceiveValue(new Uri[]{});
  17.                     mUploadMessageLollipop = null;
  18.                 }
  19.             } else if (mUploadMessage != null) {
  20.                 if (resultCode == RESULT_OK) {
  21.                     mUploadMessage.onReceiveValue(result);
  22.                     mUploadMessage = null;
  23.                 } else {
  24.                     mUploadMessage.onReceiveValue(Uri.EMPTY);
  25.                     mUploadMessage = null;
  26.                 }
  27.             }
  28.         }
  29.     }

上面代碼應該是完成攝像上傳了,但是要怎樣驗證是否上傳成功呢?當然是在當前網頁直接觀看網頁已上傳的視頻,如果網頁都能正常播放視頻,說明這個攝像視頻的的確確是成功上傳了。讓WebView支持觀看網頁視頻的話,得進行以下的WebSettings設置操作,相關的設置代碼如下所示:
  1.     private void initSetting() {
  2.         WebSettings webSettings = webView.getSettings();
  3.         webSettings.setJavaScriptEnabled(true);
  4.         webSettings.setPluginState(WebSettings.PluginState.ON);
  5.         webSettings.setUseWideViewPort(true); // 支持HTML的“viewport”標籤或者使用wide viewport
  6.         webSettings.setAllowFileAccess(true); // 允許訪問文件
  7.         webSettings.setSupportZoom(true); // 支持縮放
  8.         webSettings.setLoadWithOverviewMode(true);
  9.         webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加載緩存內容
  10.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  11.             webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  12.         }
  13.         webSettings.setDomStorageEnabled(true);
  14.     }

最後通過演示界面截圖,觀察一下攝像上傳的完整流程。一開始打開WebView所在的頁面,此時顯示初始網頁如下圖所示:


點擊紅色按鈕,跳到系統的攝像機頁面,攝像結束後返回當前頁面,此時網頁下方出現了一個視頻佔位圖標,如下圖所示:


點擊佔位圖標上的三角符號,則網頁開始播放已上傳的攝像視頻,下面的圖片正是播放過程中的截圖:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章