Android Webview "Sandboxing is not allowed" 加载 iframe 流时

Android Webview "Sandboxing is not allowed" when loading iframe stream

我正在尝试通过网络视图将另一个站点的 iframe 加载到我的 android 应用程序中。我能够正确加载其他网站,但是当我从 sportsbay.org 加载一个为您提供 iframe 嵌入代码片段的流时,该流变黑并打印“不允许沙盒”。我已经通过其他几个问题找到了这个问题的答案。我的android项目如下

我作为 video_url 传递的特定 url 是 https://sportsbay.org/embed/45629/1/btn-big-ten-network-live.html. The iframe snippet that sportsbay provides is <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>. This url loads two urls 1) https://lowend.xyz/stream/45629.html which is the actual stream and moments later loads 2) https://sportsbay.org/live-streams 以将您重定向到 sportsbay 的主页。我在 MyWebViewClient 中有代码阻止主 sportsbay 页面加载,这会中断我想播放的流(这是我收到沙盒消息的地方)。我尝试用 loadData 和其他变体替换 loadUrl,这些变体在 iframe html 字符串中与 mimeType 一起传递,但我目前拥有的是我最接近加载流的(其他人还不够 post 沙盒消息)。

public void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        // Bring Linear layout into view.
        setContentView(R.layout.webview);
        // Grab current intent & 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;
        }
    }
}

好消息!我想到了。沙箱消息不是因为服务器与我的应用程序交互不正确,而是因为我的应用程序没有使用 android 应用程序(应用程序沙箱)之外的文件存储的权限。这是通过以下方式修复的:

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

需要放在权限区AndroidManifest.xml中(顶包下)