@ivanessence
Android Developer

Android WebView почему не работает камера?

Столкнулся со следующей ситуацией. На стороне сервера на js написана логика: сканер QR кодов, который вызывается по нажатию на кнопку
<input type="file" accept="image/*" capture="camera" />

На стороне android, если зайти в браузер (Chrome), то по нажатию на кнопку все корректно работает, открывается камера, сканируется код и результат сканирования отображается на сайте.

При попытке сделать тоже самое в android приложении, используя WebView, кнопка не срабатывает и соответственно далее логика не выполняется.

Вопрос, как заставить WebView работать так же, как и браузер? Поддержка js в приложении включена, разрешения камере предоставлены. Нагуглилось решение только одно - на стороне android-приложения через js аннотации (интерфейс) мапить нажатие кнопки на сайте (WebView) с методом в классе java
WebView webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new MyJavaInterface(), "test");
    
private class MyJavaInterface {
    @android.webkit.JavascriptInterface
    public String getGreeting() {
         return "Hello JavaScript!";
    }
}

<input value="Click" onclick="javascript:alert(test.getGreeting());"/>

Cоответственно всю логику сканирования кодов и отправки на сервер нужно нативно переписывать в приложении, что не очень хочется.

Хотелось бы услышать мнение экспертов, заранее спасибо.
  • Вопрос задан
  • 2235 просмотров
Решения вопроса 1
@ivanessence Автор вопроса
Android Developer
В общем сам решил проблему, ответов никаких так и не дождался. К WebVIew добавил WebChromeClient, переопределил метод onShowFileChooser, который после нажатия кнопки на сайте (в WebView) срабатывает и вызывает камеру. Далее в onActivityResult я получаю фото и отправляю на сервер колбэком.
Вот полезная статья https://www.codeday.top/2017/06/30/25817.html и часть моего кода
private ValueCallback<Uri[]> uploadMessageAboveL;
private Uri uri;
...
 zwv.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) {
                uploadMessageAboveL = filePath;
                uri = generateFileUri();
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                startActivityForResult(intent, FILE_CHOOSER_RESULT_CODE);
                return true;
            }
        });
...
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
...
 Uri[] results = null;
        if (resultCode == Activity.RESULT_OK) {
            results = new Uri[1];
            results[0] = uri;
        }
        uploadMessageAboveL.onReceiveValue(results);
}

Сервер получает фотографию и далее успешно её обрабатывает.
Возможно, кому-то пригодиться моё решения. Спасибо за внимание :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@CoolMind
В ответе автора, к сожалению, многое упущено. Поэтому лучше ознакомиться с репозиториями и ответами на SO.

https://github.com/googlearchive/chromium-webview-...
https://stackoverflow.com/questions/38589205/file-...
https://stackoverflow.com/questions/5907369/file-u...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы