WebView 增加橫向進度條
progressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 5, 0, 0));
addView(progressBar);
WebView 設置屬性
WebSettings ws = this.getSettings();
ws.setJavaScriptEnabled(true);//允許javascript
ws.setAllowFileAccess(true);啓用或禁用WebView訪問文件數據
ws.setBuiltInZoomControls(false);設置是否支持縮放
ws.setSupportZoom(true);設置是否支持變焦
ws.setDomStorageEnabled(true);
ws.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);設置佈局方式
ws.setUserAgentString("");
setWebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//覆蓋loadUrl方法,默認以瀏覽器打開URL
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//失敗回調
view.loadUrl("file:///android_asset/error.html");
}
setWebChromeClient()
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {//加載進度條
progressBar.setVisibility(GONE);
} else {
if (progressBar.getVisibility() == GONE) {
progressBar.setVisibility(VISIBLE);
}
progressBar.setProgress(newProgress);
}
}
網頁彈出框重寫
public boolean onJsAlert()
onJsConfirm()
onJsPrompt()
//響應網頁File標籤,現實圖片上傳
// 3.0 + 調用這個方法
public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType) {
mUploadMessage = uploadMsg;//mUploadMessage 全局變量
//跳轉系統相冊
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");// 相片類型
BaseActivity.currentActivity().startActivityForResult(intent, WebViewActivity.FILECHOOSER_RESULTCODE);
//跳轉系統相機
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
BaseActivity.currentActivity().startActivityForResult(intent,
WebViewActivity.FILECHOOSER_RESULTCODE);
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
// Android < 3.0 調用這個方法
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
javascript調用本地方法
this.addJavascriptInterface(new JSAndroidBridge(this), "android");
執行JS方法,可通過參數向JS當前頁面傳值
public void executeJSMethod(String methodName, String param) {
this.superLoadUrl("javascript:" + methodName + "('" + param + "')");
}
可供JS調用的類
public final class JSAndroidBridge {
private JSBridgeWebView webView;
public JSAndroidBridge(JSBridgeWebView webView) {
super();
this.webView = webView;
}
@JavascriptInterface
public void refreshHomeActivityList() {//js可以通過方法名調用此方法
//do something
}
}
圖片上傳
1.實現上面提到的openFileChooser(部分Android4.4.2不響應此方法)
2.當前場景中onActivityResult中獲取URI
3.uri不爲空是從相冊獲取的圖片,爲空是從相機獲得圖片
4.部分相機獲取的圖片是縮略圖
5.部分手機從系統獲取的圖片是橫向
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == FILECHOOSER_RESULTCODE) {
mUploadMessage = .getWebView().getmUploadMessage();
if (null == mUploadMessage)
return;
Uri uri = intent == null || resultCode != RESULT_OK ? null : intent.getData();
}
mUploadMessage.onReceiveValue(uri);//關鍵代碼
}
}
圖片上傳過程中得問題及解決方案
Android4.4.2 不響應openFileChooser方法
上面設置的setUserAgentString()方法中將當前系統版本傳到頁面,頁面判斷爲4.4.2系統不使用File標籤上傳圖片,改爲本地調用上傳圖片方法,上傳成功後返回的圖片路徑,調用js的方法通知頁面圖片上傳成功
選取圖片操作bitmap, OOM
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;//只獲取圖片參數
BitmapFactory.decodeFile(img_path, opt);
if (opt.outWidth > 1000 || opt.outHeight > 1000) {
opt.inSampleSize = 5;//縮小1/5
}
opt.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(img_path, opt);
判斷圖片的方向
//獲取圖片的路徑
private String getImgPath(Uri uri){
String img_path = "";
if(uri != null){
String[] proj = { MediaStore.Images.Media.DATA };
Cursor actualimagecursor = managedQuery(uri,proj,null,null,null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
img_path = actualimagecursor.getString(actual_image_column_index);
}
return img_path;
}
//獲取圖片的存儲角度
private int getBitmapDegree(String path) {
int degree = 0;
try {
// 從指定路徑下讀取圖片,並獲取其EXIF信息
ExifInterface exifInterface = new ExifInterface(path);
// 獲取圖片的旋轉信息
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
//旋轉圖片
public Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
Bitmap returnBm = null;
// 根據旋轉角度,生成旋轉矩陣
Matrix matrix = new Matrix();
matrix.postRotate(degree);
try {
// 將原始圖片按照旋轉矩陣進行旋轉,並得到新的圖片
returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}