مكون WebView المحسّن لنظام Android الذي يعمل على النحو المنصوص عليه في المربع
أعلن أن مستودع Gradle في build.gradle
allprojects {
repositories {
maven { url " https://jitpack.io " }
}
} أعلن أن تبعية Gradle في build.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 ) ملاحظة: إذا كنت تستخدم فئة Fragment من مكتبة الدعم ( android.support.v4.app.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 الأصل من أجل إعادة توجيه النتائج من FragmentActivity إلى مثيل Fragment المناسب
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.**
إذا كنت ترغب في تقديم مواقع أو مجرد موارد واحدة على http العادي بدلاً من https ، فعادة ما لا يمكنك فعله إذا كنت تستهدف Android 8.1 (API المستوى 27) أو قبل ذلك. على Android 9 (مستوى API 28) وبعد ذلك ، يتم تعطيل دعم ClearText بشكل افتراضي. قد تضطر إلى تعيين android:usesCleartextTraffic="true" على العنصر <application> في AndroidManifest.xml أو توفير تكوين أمان للشبكة مخصص.
تم تحسينه للحصول على أفضل الأداء والأمان
تم تصحيح الميزات عبر إصدارات Android
يتم التعامل مع تحميل الملفات تلقائيًا (تحقق من توفر مع AdvancedWebView.isFileUploadAvailable() )
multiple في HTML) على 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
}
} تمكين دعم تحديد الموقع الجغرافي (الاحتياجات <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); تحميل ملف HTML من "الأصول" (على سبيل المثال في app/src/main/assets/html/index.html )
mWebView . loadUrl ( "file:///android_asset/html/index.html" );تحميل ملف HTML من بطاقة 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" );
}قم بتحميل نص مصدر 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 ;
}
}جميع المساهمات موضع ترحيب! إذا كنت ترغب في المساهمة ، فيرجى إنشاء مشكلة أولاً بحيث يمكن مناقشة الميزة أو المشكلات أو السؤال.
هذا المشروع مرخص بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.