Android Webview «Песочница не разрешена» при загрузке потока iframe

#java #android #html #iframe #webview

#java #Android #HTML #iframe #webview

Вопрос:

Я пытаюсь загрузить iframe другого сайта в свое приложение для Android через webview. Я могу правильно загружать другие веб-сайты, но когда я загружаю поток с sportsbay.org который предоставляет вам фрагмент кода для встраивания iframe, поток становится черным и выводит надпись «Песочница запрещена». Я рассмотрел несколько других вопросов, чтобы найти ответ на это. Мой проект Android выглядит следующим образом.

Конкретный URL-адрес, который я передаю как video_url, является https://sportsbay.org/embed/45629/1/btn-big-ten-network-live.html . Фрагмент iframe , который предоставляет <iframe allow='encrypted-media' width='640' height='360' marginwidth='0' marginheight='0' scrolling='no' frameborder='0' allowfullscreen='yes' src='//sportsbay.org/embed/45629/1/btn-big-ten-network-live.html'></iframe> sportsbay , выглядит следующим образом . Этот URL-адрес загружает два URL-адреса 1) https://lowend.xyz/stream/45629.html который является фактическим потоком и через несколько мгновений загружает 2) https://sportsbay.org/live-streams чтобы перенаправить вас на домашнюю страницу sportsbay. У меня есть код в MyWebViewClient, который предотвращает загрузку главной страницы sportsbay, что может прервать поток, который я хочу воспроизвести (здесь я получаю сообщение о песочнице). Я попытался заменить loadUrl на loadData и другие варианты, которые передаются в HTML-строке iframe вместе с mimeType, но то, что у меня есть в настоящее время, ближе всего к загрузке потока (другие не заходят достаточно далеко, чтобы опубликовать сообщение о песочнице).

 public void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        // Bring Linear layout into view.
        setContentView(R.layout.webview);
        // Grab current intent amp; pull out video url.
        Intent i = getIntent();
        String video_url = i.getStringExtra("video_url");
        // Removes app name banner at top. Allows for orientation changes without reload.
        getSupportActionBar().hide();
        // Creates webview object.
        WebView web = findViewById(R.id.webView);
        // Configure settings for webview.
        WebSettings webSettings = web.getSettings();
        // Allows use of the phones file storage.
        webSettings.setDomStorageEnabled(true);
        // Sets encoding standard for urls.
        webSettings.setDefaultTextEncodingName("utf-8");
        // Able to zoom.
        webSettings.setSupportZoom(true);
        // Needed for websites to load javascript enabled content (most videos/streams).
        webSettings.setJavaScriptEnabled(true);
        // Attached webview to java class MyWebViewClient that vets the incoming urls before loading.
        // Blocks Ads / viruses / popups.
        // Also keeps url from launch in a browser.
        web.setWebViewClient(new MyWebViewClient());

        // Checks if channel is sourced from sportsbay.org.
        if(video_url.contains("sportsbay.org"))
        {
            // Changes the browser user agent since chrome user agent returns 403 Forbidden message.
            webSettings.setUserAgentString("Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion");
        }
        web.loadUrl(video_url);
    }
 
 public class MyWebViewClient extends WebViewClient {
    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {

        return true;
    }

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();
        return handleUri(uri);
    }

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri ="   uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Check requested URL to known good
        if (host.equals("s1-tv.blogspot.com") ||
            host.equals("reddit-tv-streams.blogspot.com") ||
            host.equals("newdmn.icu") ||
            host.equals("lowend.xyz"))
        {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Do not load the requested URL
            return true;
        }
    }
}
 

Ответ №1:

Отличные новости! Я понял это. Сообщение о песочнице появилось не из-за того, что сервер неправильно взаимодействовал с моим приложением, а потому, что у моего приложения не было разрешения на использование хранилища файлов за пределами приложения Android (изолированной среды приложений). Это было исправлено с помощью:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 

который необходимо поместить в Android Manifest.xml в области разрешений (под верхним пакетом).