javascript - 将视频从相机意图传递到 webView
问题描述
我正在尝试实现一个启动视频意图的 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 - 从 webview 调用它:
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) => {
...
}
我的问题是,如何访问视频?
也许有一种完全不同的方式来解决它?
解决方案
好的,我找到了一个解决方案,它有点矫枉过正,但它的工作......
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)
}
如果有人有更优雅的解决方案,我会很高兴看到它!
推荐阅读
- windows - 如何从 Windows 中的文件夹中提取特定的文件列表?
- rest - 唯一资源的 REST 资源命名
- http - URL 缓存和多租户
- c# - 无法加载文件或程序集“Newtonsoft.Json,版本=10.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一
- buildbot - 如何将文件附加到 buildbot mailnotifier
- javascript - 从导航栏中删除一个类以使其在单击导航栏项目时折叠
- cmake - 文件(生成输出 ...)用法示例
- objective-c - CGImage 从 Swift 到 Objective C
- c# - 从 Wcf Windows 服务发送 Office 365 电子邮件
- sql-server - AD-HOC SQL Server 代理作业