開發(fā)工具:
Android Studio Arctic Fox | 2020.3.1 Patch 2
1涝焙、創(chuàng)建項目
File => New => New Project => Empty Activity
(1)第一步選擇 New Project
(2)第二步選擇 Empty Activity
(3)第三步設置項目名稱及地址
2挖诸、目錄結(jié)構(gòu)
(1)設置目錄結(jié)構(gòu)
設置項目結(jié)構(gòu)為 Project纱新,該目錄下文件路徑非常清晰
(2)目錄結(jié)構(gòu)說明
使用指引創(chuàng)建空項目,會自動生成標準的項目目錄結(jié)構(gòu)
-
.gradle
Android Studio 構(gòu)建系統(tǒng) -
.idea
編輯器 配置 -
app
應用目錄-
build
打包后的目錄文件 -
libs
第三方 jar 包 -
src
源文件-
main
源文件主目錄-
java
代碼目錄-
com.xxx.myapplication2
源代碼文件目錄
-
-
res
resource 資源-
layout
頁面布局目錄
-
-
AndroidManifest.xml
應用清單
-
-
-
.gitignore
git 不需要提交的文件列表 -
build.gradle
配置整個 app 應用 -
proguard-rules.pro
編譯混淆配置
-
-
gradle/wrapper
簡化 Gradle 本身的安裝剃诅、部署 -
.gitignore
git 不需要提交的文件列表 -
build.gradle
配置整個工程 -
gradle.properties
Gradle 文件的全局性的配置 -
gradlew
UN*X 的 Gradle 啟動腳本 -
gradlew.bat
Windows 的 Gradle 啟動腳本 -
local.properties
SDK的位置配置 -
settings.gradle
配置 gradle
3、設置 Android SDK 版本
android {
compileSdk 31
buildToolsVersion '31.0.0'
compileSdkVersion 31
defaultConfig {
applicationId "com.example.myapplication2"
minSdk 21 // 最小sdk
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
4醉拓、設置 WebView layout
layout 目錄地址:
app => src => main => res => layout => activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:aandroid="http://schemas.android.com/apk/res/android"
aandroid:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity">
<WebView
android:id="@+id/wv_webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="horizontal"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
配置 WebView 組件 id android:id="@+id/wv_webview"
5墩瞳、配置程序權(quán)限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
6驼壶、在程序入口初始化 WebView
一般程序入口文件為:
app => src => main => java => com.xxx.myapplication2 => MainActivity.java
在 onCreate()
里面編寫初始化程序:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 開啟 WebView 長截圖,在 setContentView() 方法前面設置才有效
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WebView.enableSlowWholeDocumentDraw();
}
setContentView(R.layout.activity_main);
// 隱藏頂部標題欄
getSupportActionBar().hide();
// 去除狀態(tài)欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 初始化 WebView
initWebView();
}
// 銷毀 webView
@Override
protected void onDestroy() {
if (this.webView != null) {
webView.destroy();
}
super.onDestroy();
}
@Override
protected void onResume() {
/**
* 設置為橫屏
*/
// if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// }
super.onResume();
}
初始化代碼:
private WebView webView;
private void init()
{
webView = (WebView) findViewById(R.id.wv_webview);
WebSettings settings = webView.getSettings(); // webView 配置項
settings.setUseWideViewPort(true); // 是否啟用對視口元標記的支持
settings.setJavaScriptEnabled(true); // 是否啟用 JavaScript
settings.setDomStorageEnabled(true); // 是否啟用本地存儲(允許使用 localStorage 等)
settings.setAllowFileAccess(true); // 是否啟用文件訪問
settings.setAppCacheEnabled(true); // 是否應啟用應用程序緩存
settings.setAppCacheMaxSize(1024*1024*8); // 設置應用程序緩存內(nèi)容的最大大小
String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); // 緩存地址
settings.setAppCachePath(appCachePath); // 設置緩存地址
settings.setAllowContentAccess(true); // 是否啟用內(nèi)容 URL 訪問
settings.setJavaScriptCanOpenWindowsAutomatically(true); // 是否允許 JS 彈窗
settings.setMediaPlaybackRequiresUserGesture(false); // 是否需要用戶手勢來播放媒體
settings.setLoadWithOverviewMode(true); // 是否以概覽模式加載頁面喉酌,即按寬度縮小內(nèi)容以適應屏幕
settings.setBuiltInZoomControls(true); // 是否應使用其內(nèi)置的縮放機制
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
// Hide the zoom controls for HONEYCOMB+
settings.setDisplayZoomControls(false); // 是否應顯示屏幕縮放控件
}
// Enable remote debugging via chrome://inspect
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true); // 是否開啟 WebView 調(diào)試功能热凹,配合PC端 Chrome DevTools 功能使用
}
settings.setAllowFileAccessFromFileURLs(true); // 是否應允許在文件方案 URL 上下文中運行的 JavaScript 訪問來自其他文件方案 URL 的內(nèi)容
settings.setAllowUniversalAccessFromFileURLs(true); // 是否應允許在文件方案URL上下文中運行的 JavaScript 訪問任何來源的內(nèi)容
webView.loadUrl("https://www.baidu.com"); // 設置訪問地址
webView.addJavascriptInterface(new JsInterface(this, webView, MainActivity.this),"jsWebView"); // 設置 js 調(diào)用接口
webView.setDrawingCacheEnabled(true); // 啟用或禁用圖形緩存
webView.setWebViewClient(new WVViewClient()); // 幫助 WebView 處理各種通知、請求事件
webView.setWebChromeClient(new WVChromeClient(this, MainActivity.this)); // 處理解析泪电,渲染網(wǎng)頁
}
new JsInterface()
代碼:
public class JsInterface {
private Context _context;
private final WebView _webview;
private MainActivity _m;
public JsInterface(Context context, WebView webView, MainActivity mainActivity)
{
_context = context;
_webview = webView;
_m = mainActivity;
}
// 開放 test 方法給 js般妙,在 web 頁面使用 window.test('hello'); 調(diào)用。
@JavascriptInterface
public void test(String val){
Log.i("test",val);
_webview.post(new Runnable() {
@Override
public void run() {
_webview.loadUrl("javascript:cbMessage('message');",null); // java 調(diào)用 js 的 cbMessage 方法
}
});
}
}
new WVViewClient()
代碼:
public class WVViewClient extends WebViewClient {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (handler != null) {
handler.proceed();//忽略證書的錯誤繼續(xù)加載頁面內(nèi)容歪架,不會變成空白頁面
}
}
}
new WVChromeClient()
代碼:
public class WVChromeClient extends WebChromeClient{
private Context _context;
private MainActivity _m;
public WVChromeClient(Context context, MainActivity mainActivity)
{
_context = context;
_m = mainActivity;
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
Log.d("MainActivity","newProgress:"+ newProgress );
}
}