WebView基於H5的上傳和和下載
/**選擇後,回傳值*/ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (mUploadMessage == null && mUploadCallbackAboveL == null) { return; } Uri uri = null; switch (requestCode) { case RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP: uri = afterChosePic(data); if (mUploadMessage != null) { mUploadMessage.onReceiveValue(uri); mUploadMessage = null; } break; case RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP: try { uri = afterChosePic(data); if (uri == null) { mUploadCallbackAboveL.onReceiveValue(new Uri[] { }); mUploadCallbackAboveL = null; break; } if (mUploadCallbackAboveL != null && uri != null) { mUploadCallbackAboveL.onReceiveValue(new Uri[] { uri }); mUploadCallbackAboveL = null; } } catch (Exception e) { mUploadCallbackAboveL = null; e.printStackTrace(); } break; } }
** 下面把完整的程式碼貼上來: ** WebViewActivity.java package com.lwd.webviewupimg; import java.io.File; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore.Images.ImageColumns; import android.view.KeyEvent; import android.view.View; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebView; import android.webkit.WebViewClient; /** * @author lwd * @create 2016年8月17日 */ @SuppressLint("SetJavaScriptEnabled") public class WebViewActivity extends Activity{ private WebView webview; private ValueCallback<Uri> mUploadMessage; private ValueCallback<Uri[]> mUploadCallbackAboveL; private final int RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP = 1; private final int RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP = 2; private String url = "";//這裡新增含有圖片上傳功能的H5頁面訪問地址即可。 String compressPath = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); initData(); } public void initData() { webview = (WebView) findViewById(R.id.webview); initWebView(); webview.loadUrl(url); } @SuppressWarnings("deprecation") private void initWebView(){ webview.setScrollBarStyle(View.GONE); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webview.getSettings().setDomStorageEnabled(false); webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); webview.getSettings().setPluginState(WebSettings.PluginState.ON); webview.getSettings().setAllowFileAccess(true); webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); webview.getSettings().setUseWideViewPort(true); webview.getSettings().setLoadWithOverviewMode(true); webview.getSettings().setAllowContentAccess(true); webview.requestFocus(); webview.setWebViewClient(new WebClient()); webview.setWebChromeClient(new MyWebChromeClient()); } /**選擇後,回傳值*/ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (mUploadMessage == null && mUploadCallbackAboveL == null) { return; } Uri uri = null; switch (requestCode) { case RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP: uri = afterChosePic(data); if (mUploadMessage != null) { mUploadMessage.onReceiveValue(uri); mUploadMessage = null; } break; case RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP: try { uri = afterChosePic(data); if (uri == null) { mUploadCallbackAboveL.onReceiveValue(new Uri[] { }); mUploadCallbackAboveL = null; break; } if (mUploadCallbackAboveL != null && uri != null) { mUploadCallbackAboveL.onReceiveValue(new Uri[] { uri }); mUploadCallbackAboveL = null; } } catch (Exception e) { mUploadCallbackAboveL = null; e.printStackTrace(); } break; } } /** * 選擇照片後結束 * @param data */ private Uri afterChosePic(Intent data) { if (data == null) { return null; } String path = getRealFilePath(data.getData()); String[] names = path.split("\\."); String endName = null; if (names != null) { endName = names[names.length - 1]; } if (endName != null) { compressPath = compressPath.split("\\.")[0] + "." + endName; } File newFile; try { newFile = FileUtils.compressFile(path, compressPath); } catch (Exception e) { newFile = null; } return Uri.fromFile(newFile); } /** * 根據Uri獲取圖片檔案的絕對路徑 */ public String getRealFilePath(final Uri uri) { if (null == uri) { return null; } final String scheme = uri.getScheme(); String data = null; if (scheme == null) { data = uri.getPath(); } else if (ContentResolver.SCHEME_FILE.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = getContentResolver().query(uri, new String[] { ImageColumns.DATA }, null, null, null); if (null != cursor) { if (cursor.moveToFirst()) { int index = cursor.getColumnIndexOrThrow(ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data; } @Override public void onBackPressed() { super.onBackPressed(); if(webview.canGoBack()){ webview.goBack(); }else{ finish(); } } private class WebClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); return true; } return super.onKeyDown(keyCode, event); } /**開啟相簿,同時處理圖片(專案業務需要統一命名)*/ private void selectImage(int resultCode) { compressPath = Environment.getExternalStorageDirectory().getPath() + "/QWB/temp"; File file = new File(compressPath); if (!file.exists()) { file.mkdirs(); } compressPath = compressPath + File.separator + "compress.png"; File image = new File(compressPath); if (image.exists()) { image.delete(); } Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, resultCode); } /** * 內部類 */ class MyWebChromeClient extends WebChromeClient { //openFileChooser(隱藏方法)僅適用android5.0以下的環境,android5.0及以上使用onShowFileChooser // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; selectImage(RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP); } // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser(uploadMsg, ""); } // For Android > 4.1.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); } // For Android 5.0+ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mUploadCallbackAboveL = filePathCallback; selectImage(RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP); return true; } @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); } } } ● package com.lwd.webviewupimg; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.ExifInterface; import android.text.TextUtils; import android.util.Log; public class FileUtils { /** * 把圖片壓縮到200K * * @param oldpath * 壓縮前的圖片路徑 * @param newPath * 壓縮後的圖片路徑 * @return */ public static File compressFile(String oldpath, String newPath) { Bitmap compressBitmap = FileUtils.decodeFile(oldpath); Bitmap newBitmap = ratingImage(oldpath, compressBitmap); ByteArrayOutputStream os = new ByteArrayOutputStream(); newBitmap.compress(CompressFormat.PNG, 100, os); byte[] bytes = os.toByteArray(); File file = null ; try { file = FileUtils.getFileFromBytes(bytes, newPath); } catch (Exception e) { e.printStackTrace(); }finally{ if(newBitmap != null ){ if(!newBitmap.isRecycled()){ newBitmap.recycle(); } newBitmap = null; } if(compressBitmap != null ){ if(!compressBitmap.isRecycled()){ compressBitmap.recycle(); } compressBitmap = null; } } return file; } private static Bitmap ratingImage(String filePath,Bitmap bitmap){ int degree = readPictureDegree(filePath); return rotaingImageView(degree, bitmap); } /** * 旋轉圖片 * @param angle * @param bitmap * @return Bitmap */ public static Bitmap rotaingImageView(int angle , Bitmap bitmap) { //旋轉圖片 動作 Matrix matrix = new Matrix();; matrix.postRotate(angle); System.out.println("angle2=" + angle); // 建立新的圖片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); return resizedBitmap; } /** * 讀取圖片屬性:旋轉的角度 * @param path 圖片絕對路徑 * @return degree旋轉的角度 */ public static int readPictureDegree(String path) { int degree = 0; try { 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; } /** * 把位元組陣列儲存為一個檔案 * * @param b * @param outputFile * @return */ public static File getFileFromBytes(byte[] b, String outputFile) { File ret = null; BufferedOutputStream stream = null; try { ret = new File(outputFile); FileOutputStream fstream = new FileOutputStream(ret); stream = new BufferedOutputStream(fstream); stream.write(b); } catch (Exception e) { // log.error("helper:get file from byte process error!"); e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { // log.error("helper:get file from byte process error!"); e.printStackTrace(); } } } return ret; } /** * 圖片壓縮 * * @param fPath * @return */ public static Bitmap decodeFile(String fPath) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; opts.inDither = false; // Disable Dithering mode opts.inPurgeable = true; // Tell to gc that whether it needs free opts.inInputShareable = true; // Which kind of reference will be used to BitmapFactory.decodeFile(fPath, opts); final int REQUIRED_SIZE = 200; int scale = 1; if (opts.outHeight > REQUIRED_SIZE || opts.outWidth > REQUIRED_SIZE) { final int heightRatio = Math.round((float) opts.outHeight / (float) REQUIRED_SIZE); final int widthRatio = Math.round((float) opts.outWidth / (float) REQUIRED_SIZE); scale = heightRatio < widthRatio ? heightRatio : widthRatio;// } Log.i("scale", "scal ="+ scale); opts.inJustDecodeBounds = false; opts.inSampleSize = scale; Bitmap bm = BitmapFactory.decodeFile(fPath, opts).copy(Config.ARGB_8888, false); return bm; } /** * 建立目錄 * @param path */ public static void setMkdir(String path) { File file = new File(path); if(!file.exists()) { file.mkdirs(); Log.e("file", "目錄不存在 建立目錄 "); }else{ Log.e("file", "目錄存在"); } } /** * 獲取目錄名稱 * @param url * @return FileName */ public static String getFileName(String url) { int lastIndexStart = url.lastIndexOf("/"); if(lastIndexStart!=-1) { return url.substring(lastIndexStart+1, url.length()); }else{ return null; } } /** * 刪除該目錄下的檔案 * * @param path */ public static void delFile(String path) { if (!TextUtils.isEmpty(path)) { File file = new File(path); if (file.exists()) { file.delete(); } } } }
上面介紹了webView的上傳,下面來介紹一下WebView的下載功能,
WebView控制呼叫相應的WEB頁面進行展示。當碰到頁面有下載連結的時候,點選上去是一點反應都沒有的。原來是因為WebView預設沒有開啟檔案下載的功能,如果要實現檔案下載的功能,需要設定WebView的DownloadListener,通過實現自己的DownloadListener來實現檔案的下載。具體操作如下:
1、設定WebView的DownloadListener:
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、實現MyWebViewDownLoadListener這個類,具體可以如下這樣:
private class MyWebViewDownLoadListener implements DownloadListener{
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
long contentLength) {
Log.i("tag", "url="+url);
Log.i("tag", "userAgent="+userAgent);
Log.i("tag", "contentDisposition="+contentDisposition);
Log.i("tag", "mimetype="+mimetype);
Log.i("tag", "contentLength="+contentLength);
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
這只是呼叫系統中已經內建的瀏覽器進行下載,還沒有WebView本身進行的檔案下載,不過,這也基本上滿足我們的應用場景了。
我在專案中的運用
專案要求這樣:
1,需要使用WebView載入一個網頁;
2,網頁中有檔案下載的連結,點選後需要下載檔案到SDcard;
3,然後自動開啟檔案;
下面是具體解決辦法
第一步,對WebView進行一系列設定。
相關推薦
webview支援H5上傳圖片
今天H5妹子突然問我是不是遮蔽了他選擇圖片的控制元件,我一臉懵逼,一大堆黑人問號??? 上網找了半天資料 原來webview還需要做下處理 mWebView.setWebChromeClient(new WebChromeClient() {
WebView基於H5的上傳和和下載
/**選擇後,回傳值*/ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,
上傳專案和下載專案
若向上傳下載專案必須按照SVN外掛 搭建完成後就可以上傳下載專案 上傳專案 選中目標專案右鍵點選team-->share project 若第一次提交需要建立新的資源位子 否則使用已有的
django 基於form表單上傳檔案和基於ajax上傳檔案
一、基於form表單上傳檔案 1、html裡是有一個input type="file" 和 ‘submit’的標籤 2、vies.py def fileupload(request): if request.method == 'POST': print(request.P
django 基於form表單上傳文件和基於ajax上傳文件
.py ons strong code .ajax lin con html $.ajax 一、基於form表單上傳文件 1、html裏是有一個input type="file" 和 ‘submit’的標簽 2、vies.py def fileupload(request
基於springMVC+AJAX+bootstraptable實現上傳檔案和客戶端分頁
1 首先看一下上傳表格程式碼,主要程式碼如下: <form method="post" enctype="multipart/form-data" id="orderform"> <div class="col-md-6 col-sm-12"&
Java ftp 上傳檔案和下載檔案
今天同事問我一個ftp 上傳檔案和下載檔案功能應該怎麼做,當時有點懵逼,畢竟我也是第一次,然後裝了個逼,在網上找了一段程式碼發給同事,叫他除錯一下。結果悲劇了,執行不通過。(裝逼失敗) 我找的文章連結:http://blog.csdn.net/yucaifu1989/art
圖片 壓縮 上傳mongodb和下載
// 獲得SpringBoot提供的mongodb的GridFS物件 @Autowired private GridFsTemplate gridFsTemplate; public ServiceResult<FileInfoAO> compressUplo
在spring boot下如何通過rest 介面 來上傳檔案 和下載檔案 到 hadoop hdfs
本文將用程式碼來演示在spring boot裡面,用hadoop client,通過restful API來上傳檔案 和下載檔案 到 hadoop hdfs。 裡面有一些程式碼依賴坑,注意繞行。 前提: 如果你的程式碼在windows上執行,去連線linux上的hado
上傳檔案和下載pdf還有tp3掃二維碼下載and輸出text檔案給使用者
思路:後臺點選上傳,然後上傳到指定位置,然後取得這個字串寫到資料庫 <!--後臺那邊上傳檔案的標籤程式碼--> <form id="upload-form" action=
H5 移動端上傳圖片 和 視訊 頁面顯示縮圖
這是我第一次寫部落格,想要分享一下程式設計經驗,因為我也算是一個菜鳥而已,在程式設計過程中,很多問題 都是通過百度,通過CSDN裡面的各位大神分享的經驗,才得以解決的,所以我也是本著造福他人,也完善自己的意願,開始寫寫部落格,分享一下程式設計中遇到的問題及解決方法。好,廢話不
springboot專案實現檔案的上傳顯示和下載
檔案上傳:HTML上傳頁面程式碼:<input type="file" class="form-control" name="file">submit提交到controller,controller中的程式碼:@RequestMapping(value = "/u
struts3.0的上傳改進和struts2--上傳和下載
package action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.struts2.ServletActionContext; impor
利用sftp進行上傳、單個下載、批量下載和刪除
最近公司讓用SFTP用來和遠端進行互動,學習了;一段時間sftp,現在將程式碼乾貨獻上,希望對大家能夠有所幫助: 1. 在src/com/zkr/sftp(建議建立在src下)下建立sftp.properties檔案: sftp.host=
Linux上傳檔案和下載檔案命令列方式
在Linux主機上,安裝上傳下載工具包rz及sz 只需要安裝下面這個包即可,執行下面的安裝命令 yum install -y lrzsz 上傳 在Linux命令列下輸入rz, rz 輸入rz命令後,會彈出對話方塊,選擇你要上傳的檔案,
linux 上傳檔案和下載檔案命令;centos通過Xshell上傳檔案至linux伺服器以及下載檔案到windows本地
上傳檔案我們經常會選擇在伺服器搭建ftp,用來實現檔案的上傳和下載,同時,我們也應該知道用xshell也可實現檔案的上傳下載,做筆記以備忘。 1,執行yum install lrzsz 安裝lrzsz工具包,已安裝的跳過 2,安裝完會提示你是否已完成,輸入y,回車
Hadoop上傳檔案和下載檔案時候出現的問題
在Hadoop做上傳下載操作的時候,上傳的時候會出現一個超時的異常,在下載的時候回多出來crc的檔案 /**
基於SpringBoot從零構建部落格網站 - 設計可擴充套件上傳模組和開發修改頭像密碼功能
上傳模組在web開發中是很常見的功能也是很重要的功能,在web應用中需要上傳的可以是圖片、pdf、壓縮包等其它型別的檔案,同時對於圖片可能需要回顯,對於其它檔案要能夠支援下載等。在守望部落格系統中對於上傳模組進行統一管理,同時對於上傳不同的型別檔案,留有自定義實現機制的介面,也即可擴充套件。 基於上傳模組機制
C# 調用微信接口上傳素材和發送圖文消息
context puts out odin app bin utf8 light while using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;us
ajax之---上傳圖片和預覽
上傳圖片 TE obj ret upload play targe review sta views.py def upload_img(request): nid=str(uuid.uuid4()) ret={‘status‘:True,‘data‘:None