Передать видео с камеры намерение в веб-просмотр - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь реализовать веб-просмотр, который запускает видео-намерение, и возвращать видео в веб-просмотр.

Что я пытаюсь сделать:

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 - Вызовите его из веб-просмотра:

Android.dispatchTakeVideoIntent()

3) Java - получите Uri и отправьте путь к моему веб-представлению

 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 - получите путь к моему веб-представлению

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

У меня вопрос, как получить доступ к видео?

А может быть, есть совершенно другой способ это сделать?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

хорошо, я нашел решение, это немного излишне, но оно работает ...

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

Если у кого-то есть более элегантное решение, я буду рад его увидеть!

0 голосов
/ 25 сентября 2019

Доступ к видео означает, что я предполагаю воспроизведение видео в webView.У вас есть элемент видео в вашем HTML (предположим, id - «my-video»), тогда ваш 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();
}
...