상자 밖에서 의도 된대로 작동하는 Android 용 Enhanced WebView 구성 요소
루트 build.gradle 에서 Gradle 저장소를 선언하십시오
allprojects {
repositories {
maven { url " https://jitpack.io " }
}
} 앱 모듈의 build.gradle 에서 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 ) 참고 : 지원 라이브러리 ( android.support.v4.app.Fragment )의 Fragment 클래스를 사용하는 경우이 섹션 대신 다음 섹션 (아래 참조)을 참조하십시오.
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 )의 조각 포함 위에 표시된대로 일반 Fragment 사용에 대한 코드를 사용하십시오.
변화
mWebView . setListener ( this , this );에게
mWebView . setListener ( getActivity (), this ); FragmentActivity 의 결과를 적절한 Fragment 인스턴스로 전달하기 위해 다음 코드를 부모 FragmentActivity 에 추가하십시오.
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.**
https 대신 Plain http 를 통해 사이트 또는 단일 리소스를 제공하려는 경우 Android 8.1 (API 레벨 27)을 타겟팅하는 경우 일반적으로 할 일이 없습니다. 그러나 Android 9 (API 레벨 28) 이상에서는 ClearText 지원이 기본적으로 비활성화됩니다. AndroidManifest.xml 의 <application> 요소에서 android:usesCleartextTraffic="true" 설정하거나 사용자 정의 네트워크 보안 구성을 제공해야 할 수도 있습니다.
최상의 성능 및 보안에 최적화되었습니다
기능은 안드로이드 버전에 걸쳐 패치됩니다
파일 업로드는 자동으로 처리됩니다 ( AdvancedWebView.isFileUploadAvailable() )로 가용성 확인
multiple 속성)를 통한 다중 파일 업로드는 Android 5.0+에서 지원됩니다. 파일 (예 : 일반적으로 갤러리 또는 파일 관리자 앱)을 선택하는 데 사용되는 응용 프로그램은 일부 앱이없는 여러 파일을 선택할 수있는 컨트롤을 제공해야합니다.JavaScript 및 WebStorage는 기본적으로 활성화됩니다
가장 널리 사용되는 25 개 언어에 대한 현지화가 포함됩니다
페이지가로드를 시작하거나 마무리하거나 오류가 발생하면 콜백을받습니다
@ 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
}다운로드는 자동으로 처리되며들을 수 있습니다
@ 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
}
} geolocation support 활성화 (필요 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> )
mWebView . setGeolocationEnabled ( true );웹 브라우저 구현에서 보낸 것 외에 사용자 정의 HTTP 헤더 추가
mWebView . addHttpHeader ( "X-Requested-With" , "My wonderful app" );허용 된 호스트 이름의 사용자 정의 세트를 정의하고 다른 모든 호스트 이름에 대한 콜백을 수신합니다.
mWebView . addPermittedHostname ( "example.org" );그리고
@ Override
public void onExternalPageRequest ( String url ) {
// the user tried to open a page from a non-permitted hostname
}HTML 페이지의 캐싱을 방지합니다
boolean preventCaching = true ;
mWebView . loadUrl ( "http://www.example.org/" , preventCaching );장치에 설치된 대체 브라우저를 확인하십시오
if ( AdvancedWebView . Browsers . hasAlternative ( this )) {
AdvancedWebView . Browsers . openUrl ( this , "http://www.example.org/" );
}쿠키를 비활성화합니다
// disable third-party cookies only
mWebView . setThirdPartyCookiesEnabled ( false );
// or disable cookies in general
mWebView . setCookiesEnabled ( false );허용 또는 허용 (수동 및 활성) 혼합 컨텐츠 (HTTP 컨텐츠가 HTTPS 사이트에로드 됨)
mWebView . setMixedContentAllowed ( true );
// or
mWebView . setMixedContentAllowed ( false );모바일과 데스크탑 모드를 전환합니다
mWebView . setDesktopMode ( true );
// or
// mWebView.setDesktopMode(false); "자산" app/src/main/assets/html/index.html HTML 파일로드
mWebView . loadUrl ( "file:///android_asset/html/index.html" );SD 카드에서 HTML 파일을로드하십시오
// <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" );
}HTML 소스 텍스트를로드하고 페이지로 표시합니다
myWebView . loadHtml ( "<html>...</html>" );
// or
final String myBaseUrl = "http://www.example.com/" ;
myWebView . loadHtml ( "<html>...</html>" , myBaseUrl );다중 창 지원을 활성화하십시오
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 ;
}
}모든 기부금을 환영합니다! 기여하고 싶다면 먼저 문제를 만들어 기능, 문제 또는 질문에 대해 논의 할 수 있습니다.
이 프로젝트는 MIT 라이센스의 조건에 따라 라이센스가 부여됩니다.