WebView не загружает страницу в Android 9.0?
public abstract class MainActivity extends AppCompatActivity {
private static WebView web;
private WebView mWebView;
private java.lang.String url;
Boolean isInternetPresent = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo i = manager.getActiveNetworkInfo();
boolean hasConnect = (i != null && i.isConnected() && i.isAvailable());
if (hasConnect) {
} else {
}
Timer repeatTask = new Timer();
repeatTask.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("http://www.smedk.ru/wp-content/uploads/files/education/rasp/1151.htm");
}
});
}
}, 0, 60000);
setContentView(R.layout.activity_main);
final ProgressDialog pd = ProgressDialog.show(MainActivity.this, "Загрузка расписания...", "Обновление данных...", true);
mWebView = (WebView) findViewById(R.id.web1);
mWebView.getSettings().setJavaScriptEnabled(true);
if (savedInstanceState == null) {
mWebView.loadUrl("http://www.smedk.ru/wp-content/uploads/files/education/rasp/1151.htm");
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setUseWideViewPort(true);
String newUA = "User Agent";
newUA = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/20100101 Firefox/4.0";
mWebView.getSettings().setUserAgentString(newUA);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.clearCache(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setDisplayZoomControls(false);
}
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
try {
webView.stopLoading();
} catch (Exception e) {
}
if (webView.canGoBack()) {
webView.goBack();
}
webView.loadUrl("about:blank");
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Нет интернет подключения!");
alertDialog.setMessage("Пожайлуйста убедитесть включен ли " +
"Wi-Fi или мобильные данные и повторите попытку. ");
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
super.onReceivedError(webView, errorCode, description, failingUrl);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
pd.show();
}
@Override
public void onPageFinished(WebView view, String url) {
pd.dismiss();
Toast.makeText(MainActivity.this, "Расписание загружено", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Обновление данных завершено", Toast.LENGTH_SHORT).show();
String webUrl = mWebView.getUrl();
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mWebView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
mWebView.restoreState(savedInstanceState);
mWebView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
"image.png");
DownloadManager dm = (DownloadManager) getSystemService(
DOWNLOAD_SERVICE);
dm.enqueue(request);
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
private void TakeScreenshot() {
Picture picture = mWebView.capturePicture();
Bitmap b = Bitmap.createBitmap(picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
picture.draw(c);
FileOutputStream fos = null;
try {
fos = new FileOutputStream("mnt/sdcard/Download/image.jpg");
if (fos != null) {
b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
}
} catch (Exception e) {
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.exit:
finish();
break;
case R.id.about:
Intent intent = new Intent(MainActivity.this, AboutActivity.class);
startActivity(intent);
break;
case R.id.save:
Picture picture = mWebView.capturePicture();
Bitmap b = Bitmap.createBitmap(picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
Toast.makeText(MainActivity.this, "Изображения сохранено в формате JPG", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Файл находится:" +
" /sdcard/image.jpg ", Toast.LENGTH_SHORT).show();
picture.draw(c);
FileOutputStream fos = null;
try {
fos = new FileOutputStream("mnt/sdcard/image.jpg");
if (fos != null) {
b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
}
} catch (Exception e) {
break;
}
return true;
}
return false;
}
}
импортировать android.webkit.WebView; import android.webkit.WebViewClient;
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
}
}
Я создал приложение для просмотра расписаний вызовов и в целом решил протестировать мое приложение на эмуляторе. В старых версиях webview работает нормально, но когда я решил протестировать на Android 8, я написал веб-страницу недоступную.
В старых версиях Android WebView загружается отлично, но на Android 9 не загружается. Какова причина?
Ответы
Ответ 1
На самом деле вам следует избегать использования http, но если нет способа сделать это:
Добавьте @xml/network_security_config в свои ресурсы:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.smedk.ru</domain>
</domain-config>
</network-security-config>
Добавьте эту конфигурацию безопасности в свой манифест следующим образом:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
Теперь вы можете использовать HTTP-соединение на поддоменах www.smedk.ru.
Вы можете прочитать больше в https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted
Примечание. Указания в этом разделе относятся только к приложениям, предназначенным для Android 8.1 (уровень API 27) или ниже. Начиная с Android 9 (уровень API 28), поддержка открытого текста по умолчанию отключена.
Ответ 2
Этот метод работает для всех доменов также с Android 9. Добавьте это свойство в свой манифест следующим образом:
<application
...
android:usesCleartextTraffic="true"
...>
</application>
Ответ 3
Попробуйте использовать безопасный URL-адрес. Используйте https вместо http. Android 9.0 не разрешают необеспеченные URL-адреса
Ответ 4
Та же самая проблема произошла в моем проекте, но все вышеупомянутые ответы не помогли мне. так что, потратив целый день на эту проблему, я получил
В версии Android 8.1/9/10 , если вы используете атрибут wrap_content для высоты в WebView, он всегда будет равен 0dp. В более ранних версиях (ниже 8.1) wrap_content в WebView работает нормально. но начиная с версии 8.1 и выше вы можете задавать высоту либо статически, либо динамически устанавливать ее с помощью программы, используя setLayoutParameters(). А также добавьте дополнительный атрибут в приложение (android: usedCleartextTraffic = "true") в манифесте Android.