【问题标题】:Pass video from camera intent to webView将视频从相机意图传递到 webView
【发布时间】:2019-09-25 07:45:02
【问题描述】:

我正在尝试实现一个启动视频意图的 webview,并将视频返回到 webView。

我想做什么:

1) Java - 添加打开视频捕获意图的 webAppInterface:

mWebView = (WebView) findViewById(R.id.webView);
mWebView.addJavascriptInterface(webAppInterface, "Android");

public class WebAppInterface {
    ...
    public void dispatchTakeVideoIntent() {
        Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        takeVideoIntent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT,10);

        if (takePictureIntent.resolveActivity(mContext.getPackageManager()) != null) {
            ((AppCompatActivity) mContext).startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
        }
    }
    ...

2) JavaScript - 从 web 视图调用它:

Android.dispatchTakeVideoIntent()

3) Java - 获取 Uri,并将路径发送到我的 webview

 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == Activity.RESULT_OK) {
        Uri videoUri = intent.getData();
        wView.loadUrl("javascript:test('" + videoUri.getPath() + "')");
    }
}

4) JavaScript - 在我的 webView 中获取路径

window.test = (videoUriPath) => {
    ...
}

我的问题是,如何访问视频?

也许有一种完全不同的方式来解决它?

【问题讨论】:

    标签: javascript java android webview android-storage


    【解决方案1】:

    访问视频意味着我会假设在 webView 中播放视频。在您的 HTML 中有一个视频元素(假设 id 是“我的视频”),那么您的 javascript 将是:

    window.test = (videoUriPath) => {
     var video = document.getElementById('video');
     var source = document.createElement('source');
    
     source.setAttribute('src', videoUriPath);
    
     video.appendChild(source);
     video.load();
     video.play();
    }
    

    【讨论】:

    【解决方案2】:

    好的,我找到了一个解决方案,它有点矫枉过正,但它的工作......

    1) JAVA:将视频转换为字节数组

    byte[] bytes;
    byte[] data = new byte[16384];
    int bytesRead;
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    while ((bytesRead = is.read(data)) != -1) {
       output.write(data, 0, bytesRead);
    }
    bytes = output.toByteArray();
    

    2) JAVA:将编码的块(base64)发送到 webvView

    int startIndex = 0;
    int chunkSize= 16384;
    while(startIndex < bytes.length){
         byte[] newArray = Arrays.copyOfRange(bytes, startIndex, startIndex + chunkSize);
         startIndex = startIndex + chunkSize;
         encodedString = Base64.encodeToString(newArray, Base64.DEFAULT);
         wView.loadUrl("javascript:g_sendFile_f('" + encodedString + "')");
    }
    wView.loadUrl("javascript:g_sendFile_f('" + "finish" + "')");
    

    3) JAVASCRIPT:接收编码块,合并它们,创建blob文件

    let bytesArrFinal_an = []
    window.g_sendFile_f = (msg) =>{
         // last call
         if(msg === "finish"){
             let blob = new Blob(byteArrFinal_an,{type : "video/mp4"})
             this.test_videoUrl = URL.createObjectURL(blob);
             console.log("finish")
             return
          }
    
          // add bytes to final array
          let bytesArr_an = this.b64toByteArr(msg)
          bytesArrFinal_an = bytesArrFinal_an.concat(bytesArr_an);
          console.log(msg)
    }
    

    如果有人有更优雅的解决方案,我会很高兴看到它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多