#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 в области разрешений (под верхним пакетом).