Composant WebView amélioré pour Android qui fonctionne comme prévu hors de la boîte
Déclarez le référentiel Gradle dans votre Root build.gradle
allprojects {
repositories {
maven { url " https://jitpack.io " }
}
} Déclarez la dépendance Gradle dans build.gradle de votre module d'applications. Gradle
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 ) Remarque: Si vous utilisez la classe Fragment de la bibliothèque de support ( android.support.v4.app.Fragment ), veuillez vous référer à la section suivante (voir ci-dessous) au lieu de celle-ci.
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 ) Utilisez le code pour une utilisation normale Fragment comme indiqué ci-dessus
Changement
mWebView . setListener ( this , this );à
mWebView . setListener ( getActivity (), this ); Ajoutez le code suivant au parent FragmentActivity afin de transmettre les résultats de la FragmentActivity à l'instance Fragment appropriée
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 vous souhaitez desservir des sites ou simplement des ressources uniques sur http ordinaire au lieu de https , il n'y a généralement rien à faire si vous ciblez Android 8.1 (API niveau 27) ou plus tôt. Sur Android 9 (API niveau 28) et ultérieurement, cependant, la prise en charge ClearText est désactivée par défaut. Vous devrez peut-être définir android:usesCleartextTraffic="true" sur l'élément <application> dans AndroidManifest.xml ou fournir une configuration de sécurité réseau personnalisée.
Optimisé pour les meilleures performances et sécurité
Les fonctionnalités sont corrigées sur les versions Android
Les téléchargements de fichiers sont gérés automatiquement (vérifier la disponibilité avec AdvancedWebView.isFileUploadAvailable() )
multiple en HTML) sont pris en charge sur Android 5.0+. L'application utilisée pour choisir les fichiers (c'est-à-dire généralement une galerie ou une application de gestionnaire de fichiers) doit fournir des contrôles pour sélectionner plusieurs fichiers, ce que certaines applications ne le font pas.JavaScript et WebStorage sont activés par défaut
Comprend des localisations pour les 25 langues les plus parlées
Recevoir des rappels lorsque les pages commencent / terminent le chargement ou ont des erreurs
@ 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
}Les téléchargements sont gérés automatiquement et peuvent être écoutés
@ 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
}
} Activer la prise en charge de la géolocalisation (besoins <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> )
mWebView . setGeolocationEnabled ( true );Ajouter des en-têtes HTTP personnalisés en plus de ceux envoyés par l'implémentation du navigateur Web
mWebView . addHttpHeader ( "X-Requested-With" , "My wonderful app" );Définissez un ensemble personnalisé de noms d'hôtes autorisés et recevez des rappels pour tous les autres noms d'hôte
mWebView . addPermittedHostname ( "example.org" );et
@ Override
public void onExternalPageRequest ( String url ) {
// the user tried to open a page from a non-permitted hostname
}Empêcher la mise en cache des pages HTML
boolean preventCaching = true ;
mWebView . loadUrl ( "http://www.example.org/" , preventCaching );Vérifiez les navigateurs alternatifs installés sur l'appareil
if ( AdvancedWebView . Browsers . hasAlternative ( this )) {
AdvancedWebView . Browsers . openUrl ( this , "http://www.example.org/" );
}Désactiver les cookies
// disable third-party cookies only
mWebView . setThirdPartyCookiesEnabled ( false );
// or disable cookies in general
mWebView . setCookiesEnabled ( false );Autoriser ou interdire le contenu mixte (passif et actif) (contenu HTTP chargé à l'intérieur des sites HTTPS)
mWebView . setMixedContentAllowed ( true );
// or
mWebView . setMixedContentAllowed ( false );Basculer entre le mode mobile et le mode de bureau
mWebView . setDesktopMode ( true );
// or
// mWebView.setDesktopMode(false); Chargez le fichier HTML à partir de «Assets» (par exemple sur app/src/main/assets/html/index.html )
mWebView . loadUrl ( "file:///android_asset/html/index.html" );Chargez le fichier HTML à partir de la carte 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" );
}Chargez le texte source HTML et affichez comme page
myWebView . loadHtml ( "<html>...</html>" );
// or
final String myBaseUrl = "http://www.example.com/" ;
myWebView . loadHtml ( "<html>...</html>" , myBaseUrl );Activer le support multi-fenêtres
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 ;
}
}Toutes les contributions sont les bienvenues! Si vous souhaitez contribuer, veuillez d'abord créer un problème afin que votre fonctionnalité, problème ou question puisse être discuté.
Ce projet est concédé sous licence de la licence du MIT.