Воспроизведение локального видео в webview

Я хочу воспроизводить локальные видео в веб-браузере. Я получаю видео-путь от намерения, открывающего свою деятельность, поэтому он может храниться внутри или на SD-карте.

Используя этот url file:///storage/emulated/0/Download/movies/movie.mp4, я получаю Failed to load resource: net::ERR_ACCESS_DENIED.

Используя диалог ввода файла с URL.createObjectURL(file);, он работает. Но поскольку я знаю путь, я не хочу его вручную выбирать вручную. Установка значения входного файла запрещена.

Создание URL-адреса, использующего этот путь, также невозможно, потому что ему нужен файл или blob.

Из-за возможного большого размера файла его невозможно временно скопировать на SD-карту.

Это дает мне не найденную ошибку файла:

@Override
    public WebResourceResponse shouldInterceptLoadRequest(XWalkView view,
                                                          String url) {
        if(url.contains("file:///storage")){
            try {
                return new WebResourceResponse("video/*", "UTF-8", new FileInputStream(url));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
            return super.shouldInterceptLoadRequest(view, url);
    }

также я определил <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

другие вопросы о stackoverflow, запрашивающие доступ к активам, поэтому я создал этот новый вопрос

Ответ 1

Чтобы получить доступ к локальным файлам на устройствах Android, работающих с marshmellow или выше, вам необходимо проверить разрешение во время выполнения, прежде чем пытаться получить доступ к файлу. Если вы этого не сделаете, он сломается

Вот учебник, в котором он реализован, в частности, чтение файлов https://www.androidhive.info/2016/11/android-working-marshmallow-m-runtime-permissions/

В зависимости от источника файла я бы рекомендовал вам не проверять перед игрой, а проверять перед точкой входа. Например, если вы пытаетесь выбрать носитель из галереи или файл из диспетчера файлов, как раз перед тем, как вы создадите сборщик заданий для файла, вы проверите разрешение на запись, затем выполните действия, показанные ниже.

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == EXTERNAL_STORAGE_PERMISSION_CONSTANT) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               //The External Storage Write Permission is granted to you... Continue your left job...
               proceedAfterPermission();
           } else {
               //request again for permission or assume permission denied and alert the user
           }
       }
    }

Вы все равно должны изучить ссылку, ее довольно легко реализовать. Надеюсь, вы найдете это полезное

Ответ 2

Проблема может заключаться в доступе к видеофайлу из внешнего хранилища, также убедитесь, что вы дали разрешение на чтение/запись. Здесь вы можете найти свое решение здесь и this