Componente WebView mejorado para Android que funciona según lo previsto fuera de la caja
Declarar el repositorio de gradle en su build.gradle raíz.
allprojects {
repositories {
maven { url " https://jitpack.io " }
}
} Declarar la dependencia de gradle en build.gradle de su módulo de aplicación.
dependencies {
implementation ' com.github.delight-im:Android-AdvancedWebView:v3.2.1 '
}< uses-permission android : name = " android.permission.INTERNET " />< im .delight.android.webview.AdvancedWebView
android : id = " @+id/webview "
android : layout_width = " match_parent "
android : layout_height = " match_parent " /> public class MyActivity extends Activity implements AdvancedWebView . Listener {
private AdvancedWebView mWebView ;
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_my );
mWebView = ( AdvancedWebView ) findViewById ( R . id . webview );
mWebView . setListener ( this , this );
mWebView . setMixedContentAllowed ( false );
mWebView . loadUrl ( "http://www.example.org/" );
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
protected void onResume () {
super . onResume ();
mWebView . onResume ();
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
protected void onPause () {
mWebView . onPause ();
// ...
super . onPause ();
}
@ Override
protected void onDestroy () {
mWebView . onDestroy ();
// ...
super . onDestroy ();
}
@ Override
protected void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
mWebView . onActivityResult ( requestCode , resultCode , intent );
// ...
}
@ Override
public void onBackPressed () {
if (! mWebView . onBackPressed ()) { return ; }
// ...
super . onBackPressed ();
}
@ Override
public void onPageStarted ( String url , Bitmap favicon ) { }
@ Override
public void onPageFinished ( String url ) { }
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) { }
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) { }
@ Override
public void onExternalPageRequest ( String url ) { }
}android.app.Fragment ) Nota: Si está utilizando la clase Fragment de la biblioteca de soporte ( android.support.v4.app.Fragment ), consulte la siguiente sección (ver más abajo) en lugar de esta.
public class MyFragment extends Fragment implements AdvancedWebView . Listener {
private AdvancedWebView mWebView ;
public MyFragment () { }
@ Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
View rootView = inflater . inflate ( R . layout . fragment_my , container , false );
mWebView = ( AdvancedWebView ) rootView . findViewById ( R . id . webview );
mWebView . setListener ( this , this );
mWebView . setMixedContentAllowed ( false );
mWebView . loadUrl ( "http://www.example.org/" );
// ...
return rootView ;
}
@ SuppressLint ( "NewApi" )
@ Override
public void onResume () {
super . onResume ();
mWebView . onResume ();
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
public void onPause () {
mWebView . onPause ();
// ...
super . onPause ();
}
@ Override
public void onDestroy () {
mWebView . onDestroy ();
// ...
super . onDestroy ();
}
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
mWebView . onActivityResult ( requestCode , resultCode , intent );
// ...
}
@ Override
public void onPageStarted ( String url , Bitmap favicon ) { }
@ Override
public void onPageFinished ( String url ) { }
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) { }
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) { }
@ Override
public void onExternalPageRequest ( String url ) { }
}android.support.v4.app.Fragment ) Use el código para el uso normal Fragment como se muestra arriba
Cambiar
mWebView . setListener ( this , this );a
mWebView . setListener ( getActivity (), this ); Agregue el siguiente código a la FragmentActivity principal de la fragmentación para reenviar los resultados de la FragmentActivity de la instancia Fragment apropiada
public class MyActivity extends FragmentActivity implements AdvancedWebView . Listener {
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
if ( mFragment != null ) {
mFragment . onActivityResult ( requestCode , resultCode , intent );
}
}
} -keep class * extends android.webkit.WebChromeClient { *; }
-dontwarn im.delight.android.webview.**
Si desea servir sitios o simplemente recursos individuales sobre http simple en lugar de https , generalmente no hay nada que hacer si se dirige a Android 8.1 (Nivel API 27) o anterior. En Android 9 (Nivel API 28) y más tarde, sin embargo, el soporte de ClearText está deshabilitado de forma predeterminada. Es posible que deba establecer android:usesCleartextTraffic="true" en el elemento <application> en AndroidManifest.xml o proporcionar una configuración de seguridad de red personalizada.
Optimizado para el mejor rendimiento y seguridad
Las características están parcheadas en las versiones de Android
Las cargas de archivos se manejan automáticamente (verifique la disponibilidad con AdvancedWebView.isFileUploadAvailable() ))
multiple en HTML) son compatibles con Android 5.0+. La aplicación que se utiliza para elegir los archivos (es decir, generalmente una aplicación de galería o administrador de archivos) debe proporcionar controles para seleccionar múltiples archivos, que algunas aplicaciones no tienen.JavaScript y WebStorage están habilitados de forma predeterminada
Incluye localizaciones para los 25 idiomas más hablados.
Reciba devoluciones de llamada cuando las páginas comiencen/terminen de cargar o tengan errores
@ Override
public void onPageStarted ( String url , Bitmap favicon ) {
// a new page started loading
}
@ Override
public void onPageFinished ( String url ) {
// the new page finished loading
}
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) {
// the new page failed to load
}Las descargas se manejan automáticamente y se pueden escuchar
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) {
// some file is available for download
// either handle the download yourself or use the code below
if ( AdvancedWebView . handleDownload ( this , url , suggestedFilename )) {
// download successfully handled
}
else {
// download couldn't be handled because user has disabled download manager app on the device
// TODO show some notice to the user
}
} Habilitar soporte de geolocalización (necesidades <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> )
mWebView . setGeolocationEnabled ( true );Agregue los encabezados HTTP personalizados además de los enviados por la implementación del navegador web
mWebView . addHttpHeader ( "X-Requested-With" , "My wonderful app" );Definir un conjunto personalizado de nombres de host permitidos y recibir devoluciones de llamada para todos los demás nombres de host
mWebView . addPermittedHostname ( "example.org" );y
@ Override
public void onExternalPageRequest ( String url ) {
// the user tried to open a page from a non-permitted hostname
}Evitar el almacenamiento en caché de las páginas HTML
boolean preventCaching = true ;
mWebView . loadUrl ( "http://www.example.org/" , preventCaching );Verifique los navegadores alternativos instalados en el dispositivo
if ( AdvancedWebView . Browsers . hasAlternative ( this )) {
AdvancedWebView . Browsers . openUrl ( this , "http://www.example.org/" );
}Deshabilitar cookies
// disable third-party cookies only
mWebView . setThirdPartyCookiesEnabled ( false );
// or disable cookies in general
mWebView . setCookiesEnabled ( false );Permitir o rechazar contenido mixto (tanto pasivo como activo) (contenido HTTP que se carga dentro de los sitios HTTPS)
mWebView . setMixedContentAllowed ( true );
// or
mWebView . setMixedContentAllowed ( false );Cambiar entre el modo móvil y de escritorio
mWebView . setDesktopMode ( true );
// or
// mWebView.setDesktopMode(false); Cargue el archivo HTML de "Activos" (por ejemplo, app/src/main/assets/html/index.html )
mWebView . loadUrl ( "file:///android_asset/html/index.html" );Cargar el archivo HTML de la tarjeta SD
// <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
if ( Environment . getExternalStorageState (). equals ( Environment . MEDIA_MOUNTED )) {
mWebView . getSettings (). setAllowFileAccess ( true );
mWebView . loadUrl ( "file:///sdcard/Android/data/com.my.app/my_folder/index.html" );
}Cargar el texto de origen HTML y mostrar como página
myWebView . loadHtml ( "<html>...</html>" );
// or
final String myBaseUrl = "http://www.example.com/" ;
myWebView . loadHtml ( "<html>...</html>" , myBaseUrl );Habilitar soporte de múltiples ventanas
myWebView . getSettings (). setSupportMultipleWindows ( true );
// myWebView.getSettings().setJavaScriptEnabled(true);
// myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
myWebView . setWebChromeClient ( new WebChromeClient () {
@ Override
public boolean onCreateWindow ( WebView view , boolean isDialog , boolean isUserGesture , Message resultMsg ) {
AdvancedWebView newWebView = new AdvancedWebView ( MyNewActivity . this );
// myParentLayout.addView(newWebView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
WebView . WebViewTransport transport = ( WebView . WebViewTransport ) resultMsg . obj ;
transport . setWebView ( newWebView );
resultMsg . sendToTarget ();
return true ;
}
}¡Todas las contribuciones son bienvenidas! Si desea contribuir, cree un problema primero para que se pueda discutir su función, problema o pregunta.
Este proyecto tiene licencia bajo los términos de la licencia MIT.