Android Webview H5資源本地化
一. 創建讀取資源項目獨立模塊
1. 項目依賴的好處
符合模塊化的思想,他們相互獨立。一個項目持有另一個項目的引用,修改更加方便。
(注:compile project編譯引用的項目其內容必須包含有java代碼、xml布局文件、AndroidManifest等,而且還要在項目的setting.gradle中用include的形式聲明引用)
2. 操作步驟導入項目ProjectR
被依賴的項目ProjectR不需要任何改動!
1. 在需要使用的項目中的settings.gradle添加配置
include ':ProjectR' project(':ProjectR').projectDir = new File(settingsDir,'../../ProjectR/') include ':ProjectR:app'
2. 在需要使用的項目中的Module中添加需要引入的library
dependencies {
... compile project(path: ':ProjectR:app') ... }
3. 設置正確的被依賴的項目路徑
project(':BProject').projectDir = new File(settingsDir,'../../ProjectR/')
其中 new File(settingsDir,'../../ProjectR/')
參數說明:
參數一: settingsDir 指的是相對於 settings.gradle 文件所在路徑
參數二: 填寫被依賴項目的路徑,**../**表示上級目錄,所以根據自己的路徑修改
3. 坑(注意)
如果你不小心填錯了被依賴項目的路徑,而且還點了同步項目。那么可能會在Project和Module 目錄下生成類似 xxx_xxx.iml 的文件,如果異常文件存在,后面就算你的路徑配置正確也可能同步不成功,不斷的提示錯誤。這是你只需要刪除上敘文件同步項目即可。
4. Assets資源文件讀取和AssetManager
AssetManager管理對assets文件夾資源的訪問,它允許你以簡單的字節流的形式打開和讀取和應用程序綁定在一起的原始資源文件。主要用到list()及open()方法。
注意:要創建一個assets文件夾和java文件夾同級,然后再asset創建一個文件夾命H5Res,此句不要assets不然會找不到文件異常處理
InputStream stream = assetManager.open("H5Res/" + resUrl);
finalString[] list(Stringpath) 返回指定路徑下的所有文件及目錄名,path是相對路徑,是assets子目錄。
finalInputStream open(String fileName) 使用 ACCESS_STREAMING模式打開assets下的指定文件,fileName是相對路徑,是assets子目錄。
finalInputStream open(String fileName,int accessMode) 使用顯示的訪問模式打開assets下的指定文件。
5. ProjectR項目主要代碼
import android.app.Activity; import android.content.res.AssetManager; import android.webkit.MimeTypeMap; import android.webkit.WebResourceResponse; import android.webkit.WebView; import java.io.FileNotFoundException; import java.io.InputStream; public class LocalAssets{ private static LocalAssets _instance = null; public static LocalAssets getInstance() { return _instance != null ? _instance : (_instance = new LocalAssets()); } private Activity mainContext = null;
// 用於保存請求鏈接截取出的本地路徑 private String resUrl = ""; /** * 初始化此類獲得上下文 */ public boolean init(Activity context) { mainContext = context; return true; } /** * 攔截webview請求地址換成讀取本地文件 */ public WebResourceResponse doLoadRes(WebView view, String url) { try { // 根據url判斷是否是需要加載的本地資源進行攔截替換響應資源
if (url === 'assets') { AssetManager assetManager = mainContext.getAssets(); InputStream stream = assetManager.open("H5Res/" + resUrl); WebResourceResponse response = new WebResourceResponse( MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)) , "UTF-8", stream ); return response; } } catch (FileNotFoundException e) { } catch (Exception e) { e.printStackTrace(); } return null; } }
二. 主項目代碼
1. 將需要本地化的資源放入assets/H5Res文件夾下。
2. 設置完webview后初始化導入的庫:
LocalAssets.getInstance().init(this);
3. 設置webview攔截請求:
@Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse resp = LocalAssets.getInstance().doLoadRes(view, url); if (resp != null) { return resp; } return super.shouldInterceptRequest(view, url); } @Override @RequiresApi(Build.VERSION_CODES.LOLLIPOP) public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { WebResourceResponse resp = LocaalAssets.getInstance().doLoadRes(view, request.getUrl().toString()); if (resp != null) { return resp; } return super.shouldInterceptRequest(view, request); }
