1. 程式人生 > >android使用webview上傳檔案(支援相簿和拍照)

android使用webview上傳檔案(支援相簿和拍照)

最近需要做一個專案,需要呼叫伺服器段的一些網頁來選擇檔案,剛開始還挺糾結的,不知從何下手,網上大致預覽了大神們走過的路,他們傳統的方式都是使用一下程式碼:
  1. publicvoid openFileChooser(ValueCallback<Uri> uploadMsg,  
  2.    String acceptType, String capture) {  
  3.   mUploadMessage = uploadMsg;  
  4.   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);  
  5.   intent.addCategory(Intent.CATEGORY_OPENABLE);  
  6.   intent.setType("image/*");  
  7.   context.startActivityForResult(  
  8.     Intent.createChooser(intent, "完成操作需要使用"),  
  9.     WebMainActivity.FILECHOOSER_RESULTCODE);  
  10.  }  

看了一下網上的朋友,基本上都是一樣的程式碼,全部都是蜘蛛抓取別人的文件,噁心無比!本人很討厭,直接導致了我要得到的搜尋結果已經被海量的垃圾覆蓋,不過,從http://stackoverflow.com/找到了我想要的程式碼,誒,蠻失望的,對國內的一些程式設計師部落格等....
 

好了,廢話,上敘的程式碼,其實根本就不滿足我們的需要,至少我們的產品經理一般的想法就是希望我們能從相機中或者相簿中選擇圖片的,這才是他們的核心要求,所以,我們必須自定義屬於自己的彈出框介面的

不過,說這個上傳前,先講幾個小知識吧;

如果你是使用webview的時候,會不會莫名其妙的開啟系統的瀏覽器,是不是很糾結的!
其實要自定義屬於我們自己的東西---WebViewClient,其實定義了就是啥操作也不錯 呵呵 

  1. /*** 
  2.      * 自定義WebViewClient,否則會自動跳轉到系統的瀏覽器的 
  3.      * @author spring sky 
  4.      * 建立時間:Aug 19, 20133:40:18 PM
     
  5.      */
  6.     privateclass MyWebViewClient extends WebViewClient{  
  7.         private Context mContext;  
  8.         public MyWebViewClient(Context context){  
  9.             super();  
  10.             mContext = context;  
  11.         }  
  12.         @Override
  13.         publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {  
  14.             Log.d(TAG,"URL地址:" + url);  
  15.             super.onPageStarted(view, url, favicon);  
  16.         }  
  17.         @Override
  18.         publicvoid onPageFinished(WebView view, String url) {  
  19.             Log.i(TAG, "onPageFinished");  
  20.             super.onPageFinished(view, url);  
  21.         }  
  22.     }  
然後呼叫我們自定義的WebViewClient:
  1. mWebView.setWebViewClient(new MyWebViewClient(this));  

現在我們開始說說彈出框的問題吧,經過stackoverflow的牛人說明,android原始碼的html標記<input type=file> 在選擇檔案,其實就是自定義WebChromeClient,所以我們要在這個裡面做處理,但是有一點,因為android的系統有一直升級(google為了追求完美),所以很多功能都是逐步的實現的,這就是照成了相容性的問題,需要說明的是,這對我們的彈出框沒任何影響,首先,我們要自定義我們的MyWebChromeClient

程式碼如下:

  1. /*** 
  2.      * 自定義WebChromeClient,做選擇圖片處理 
  3.      * @author spring sky 
  4.      * 建立時間:Aug 19, 20133:40:46 PM 
  5.      */
  6.     privateclass MyWebChromeClient extends WebChromeClient {  
  7.         // For Android 3.0+
  8.            publicvoid openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {    
  9.                if (mUploadMessage != nullreturn;  
  10.                mUploadMessage = uploadMsg;     
  11.                selectImage();  
  12.            }  
  13.             // For Android < 3.0
  14.             publicvoid openFileChooser(ValueCallback<Uri> uploadMsg) {  
  15.                    openFileChooser( uploadMsg, "" );  
  16.             }  
  17.             // For Android  > 4.1.1
  18.           publicvoid openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {  
  19.                   openFileChooser(uploadMsg, acceptType);  
  20.           }  
  21.     }  

以上的程式碼就是已經相容了目前的android所有市場版本了,需要說明的是:selectImage(); 就是我定義的一個方法,內容就是彈出來一個選擇框,選擇相簿和camera,這點,我覺得沒必要講了吧,反正給你們要共享程式碼的,還有一點,就是很多朋友反饋我之前寫的程式碼在選擇相簿或相機的時候程式崩潰,這次我徹底的解決了這個問題,還是版本相容的問題,煩煩煩.....程式設計師的煩惱....傷不起....

伺服器端我是用的是javaEE的struts上傳,有地方說明一下吧:

1.我當時用的是apache-tomcat7作為我的伺服器端,大家都知道上傳檔案,上傳的時候都會先把客戶端發過來的檔案儲存在臨時的檔案中,然後上傳完成就會copy到正式的檔案,之後臨時檔案會刪除,至於為什麼,如果你是一個多思考的人,你會明白為什麼,如果不知道為什麼,希望你去多想想為什麼,人的大腦不是為了談戀愛,賺錢的,是用來思考的,實在不明白為什麼,請在思考了以後找我!QQ:840950105

我的電腦是mac系統,所以在struts.xml配置了這樣的程式碼:

  1. <constantname="struts.multipart.saveDir"value="/Users/mac/Documents/tomcat/apache-tomcat-7.0.42/temp"/>
希望各位大哥大姐一定要注意這點,因為之前很多人就問我,為什麼我上傳老是失敗,需要先把臨時目錄配置好,如果是window系統的話,肯定找不到/Users/mac/Documents/
這呀的目錄的,各位大哥大姐,小弟真心的希望你們在學習程式的過程中多注意別人說的每一個重點地方,多自己找找錯誤,解決問題,這樣就能走出自己的路!


2.一下程式碼,如果稍微東一點點程式碼的人,都會看懂的,request存放兩個值,一個上傳的訊息,一個上傳後的檔案路徑!(順便說一下,我的javaEE好多年沒折騰了,都忘記的差不多了,隨便寫的伺服器端,請大家多多見諒,誒,程式設計師傷不起,過兩年回家種田了...產品經理折磨我...測試折磨我...尼瑪客戶這不懂那不明白的也折磨我...)

  1. ServletActionContext.getRequest(). setAttribute("typeError",  
  2.         result);  
  3. ServletActionContext.getRequest().setAttribute("uploadFile", rsImage);  


以上基本上都是核心的技術點了,沒啥了!
需要說明的是,大家在拿到我的android客戶端程式碼,請先把自己的webview需要load的url修改為自己部署javaEE的專案url,切記切記,不然,老夫真的要吐血身亡了!

廢話不說了,哥討厭那些使用蜘蛛爬來爬去的部落格和網站,小弟懇請希望這些站長能活出自己的人生,別裝逼的拿著別人的經驗給自己做裝逼炫耀的資本!路都是自己走出來的,別吃了別人拉下來的還喊香!

順便說一下,本人年紀不小了,為了能做出自己的一些事情,有點創業的想法,如果有創業的朋友缺忠誠的合作伙伴,請聯絡我!(專注於android ios開發,沒有神一樣的智商,但擁有不屈不服的心,不為困難而低頭,只為理想而拼搏)

相關推薦

android使用webview檔案(支援相簿拍照)

最近需要做一個專案,需要呼叫伺服器段的一些網頁來選擇檔案,剛開始還挺糾結的,不知從何下手,網上大致預覽了大神們走過的路,他們傳統的方式都是使用一下程式碼: publicvoid openFileChooser(ValueCallback<Uri> uploa

android使用webview檔案(支援相簿拍照),支援最高6.0安卓系統(改進版)

首先學習 http://blog.csdn.net/woshinia/article/details/19030437 對input file的支援1.注意 mUploadMessage.onReceiveValue(Uri.parse("")); 必須得到呼叫,無論使用者是否選了圖,否則會出現再點選不響應

Linux——x-shell檔案到Linux下載檔案到本地

一.下載安裝x-shell 百度上有很多xshell破解版,大家可以自行搜尋下載並安裝到自選目錄下。 二.連線伺服器 開啟x-shell選擇新建會話 當然,如果直接有檔案就可以直接點連線 點選新建之後會進入如下介面 輸入需要連線的主機IP。 我這裡用的是

js jquery驗證檔案的格式大小

// 驗證附件格式和大小 function confirmData() { var flag = true; var message = ""; var errorSize = ""; var fileSuffix = $("#fileSuffix").val(

AJAX POST方式檔案到後臺下載後臺傳來的檔案

ajax 下載 原本ajax是不能下載檔案的,原因:因為response,一般請求瀏覽器是會處理伺服器輸出的response,例如生成png、檔案下載等,然而ajax請求只是個“字元型”的請求,即請求的內容是以文字型別存放的。檔案的下載是以二進位制形式進行的,雖然可以讀取到返

java ftp檔案 支援併發

package com.dl.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ja

JAVA_ 網路程式設計,寫一個可以檔案的伺服器客戶端

服務端 class Server { public static void main(String[] args) throws Exception { //建立服務端Socket ServerS

IIS檔案大小限制時間限制

1、開啟某一發佈網站的配置編輯器 2、設定上傳時間限制 3、設定上傳檔案大小限制 另一種方法: 直接在網站根目錄建一個web.config檔案 <?xml version="1.0" encoding="UTF-8"?> <configura

FileZilla遠端檔案失敗原因解決辦法

使用FileZilla遠端管理伺服器檔案是很方便的  在使用其下載檔案往往能夠成功,上傳卻總是失敗!狀況如下 狀態:開始上傳 F:\sshd\info.php 狀態:讀取“/var/www/html”

檔案之獲取拍照照片本地相簿

// 上傳圖片 private CharSequence[] items = { "選擇本地圖片", "拍照" }; private final int SELECT_LOCAL = 0, SELECT_CAMER = 1, PICTURE_CROP = 2, PI

PHP-Websockets 檔案2 優化支援php socket客戶端websocket連線websocket伺服器 以守護程序方式執行編碼

WebsocketServer: users.php <?php class WebSocketUser { public $socket; public $id; public $headers = array(); public $handsh

MUI+H5手機照片 支援多圖片拍照

html程式碼:<header class="mui-bar mui-bar-nav"><a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a><

前端檔案方法 支援IE8(外掛原生方法)

最近專案要支援excel上傳,主要要求:1、只能上傳excel,2、只能單檔案上傳。嘗試了幾個方法,如下 一、ajaxfileupload.js 這個用1.4以上版本會報handerError錯,網上找了幾個方法都沒有解決,顧放棄。 二、http://www.cnblogs

# 仿照微信類的圖片,支援相簿拍照

仿照微信類的圖片上傳,支援相簿及拍照 先看看xml樣式 點選上傳圖片就可以開啟相簿或者相機如下 點選第一個圖示就開啟拍照, 第二個圖片選擇後,右上角啊會有選擇的數量,這個是虛擬機器裡寫的 所以現實的是英文. 本例是採用了 一個大神寫的 phot

C#中PUTPOST檔案

HttpClient中上傳檔案 上一篇主要是提到了HttpClient幫助類,這次針對於上傳檔案進行補充,僅做記錄 public static string HttpUploadFile(string url, string path) {

java後臺發起檔案的post請求(httphttps)

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/aabbyyz 一、http post 對於檔案上傳,客戶端通常就是頁

Windows如何連線linux檔案到linux(securcrt)

一般開發在Windows,部署專案在linux這個時候就要選一個方便的軟體可以將專案扔到linux上去了,securcrt.這個軟體很好實用 網上很多免安裝版的,開啟即用,首先是連線linux 這個就不說  輸入公網ip 使用者名稱 密碼就可以   SecureCRTPo

spring mvc --檔案檔案其他資料一起提交

jsp: var formdata = new FormData(); formdata.append('file', $('#file')[0].files[0]); //上傳檔案 formdata.append('id', $('#id').val(

IntelliJ IDEA實現遠端連線linux,並檔案到linux伺服器(SSH會話功能SFTP功能)

注意: eclipse的SSH會話功能和SFTP功能這裡不會說 點選以下連結可檢視   eclipse的SSH會話功能和SFTP功能 而IntelliJ IDEA(以下簡稱為IDEA)這麼強大的開發工具自然也有該功能,這篇部落格就介紹一下IDEA的SSH會話功能

SpringMVC(14) - spring的多部件(檔案支援

參考:https://docs.spring.io/spring/docs/4.3.20.RELEASE/spring-framework-reference/htmlsingle/#mvc-multipart   1. 簡介 Spring的內建多部件支援處理Web應用程式中的檔案