老夫最近需要做一個項目,需要調用伺服器段的一些網頁來選擇檔案,剛開始還挺糾結的,不知從何下手,網上大致預覽了大神們走過的路,他們傳統的方式都是使用一下代碼:
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); context.startActivityForResult( Intent.createChooser(intent, "完成操作需要使用"), WebMainActivity.FILECHOOSER_RESULTCODE); }
看了一下網上的朋友,基本上都是一樣的代碼,全部都是蜘蛛抓取別人的文檔,噁心無比!本人很討厭,直接導致了我要得到的搜尋結果已經被海量的垃圾覆蓋,不過,從http://stackoverflow.com/找到了我想要的代碼,誒,蠻失望的,對國內的一些程式員部落格等....
好了,廢話,上敘的代碼,其實根本就不滿足我們的需要,至少我們的產品經理一般的想法就是希望我們能從相機中或者相簿中選擇圖片的,這才是他們的核心要求,所以,我們必須自訂屬於自己的彈出框介面的
不過,說這個上傳前,先講幾個小知識吧;
如果你是使用webview的時候,會不會莫名其妙的開啟系統的瀏覽器,是不是很糾結的!
其實要自訂屬於我們自己的東西---WebViewClient,其實定義了就是啥操作也不錯 呵呵
/*** * 自訂WebViewClient,否則會自動跳轉到系統的瀏覽器的 * @author spring sky * 建立時間:Aug 19, 20133:40:18 PM */private class MyWebViewClient extends WebViewClient{private Context mContext;public MyWebViewClient(Context context){super();mContext = context;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {Log.d(TAG,"URL地址:" + url);super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {Log.i(TAG, "onPageFinished");super.onPageFinished(view, url);}}
然後調用我們自訂的WebViewClient:
mWebView.setWebViewClient(new MyWebViewClient(this));
現在我們開始說說彈出框的問題吧,經過stackoverflow的牛人說明,android源碼的html標記<input type=file> 在選擇檔案,其實就是自訂WebChromeClient,所以我們要在這個裡面做處理,但是有一點,因為android的系統有一直升級(google為了追求完美),所以很多功能都是逐步的實現的,這就是照成了相容性的問題,需要說明的是,這對我們的彈出框沒任何影響,首先,我們要自訂我們的MyWebChromeClient
代碼如下:
/*** * 自訂WebChromeClient,做選擇圖片處理 * @author spring sky * 建立時間:Aug 19, 20133:40:46 PM */private class MyWebChromeClient extends WebChromeClient {// For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; selectImage(); } // 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); }}
以上的代碼就是已經相容了目前的android所有市場版本了,需要說明的是:selectImage(); 就是我定義的一個方法,內容就是彈出來一個選擇框,選擇相簿和camera,這點,我覺得沒必要講了吧,反正給你們要共用代碼的,還有一點,就是很多朋友反饋我之前寫的代碼在選擇相簿或相機的時候程式崩潰,這次我徹底的解決了這個問題,還是版本相容的問題,煩煩煩.....程式員的煩惱....傷不起....
伺服器端我是用的是javaEE的struts上傳,有地方說明一下吧:
1.我當時用的是apache-tomcat7作為我的伺服器端,大家都知道上傳檔案,上傳的時候都會先把用戶端發過來的檔案儲存在臨時的檔案中,然後上傳完成就會copy到正式的檔案,之後臨時檔案會刪除,至於為什麼,如果你是一個多思考的人,你會明白為什麼,如果不知道為什麼,希望你去多想想為什麼,人的大腦不是為了談戀愛,賺錢的,是用來思考的,實在不明白為什麼,請在思考了以後找我!QQ:840950105
我的電腦是mac系統,所以在struts.xml配置了這樣的代碼:
<constant name="struts.multipart.saveDir" value="/Users/mac/Documents/tomcat/apache-tomcat-7.0.42/temp"/>
希望各位大哥大姐一定要注意這點,因為之前很多人就問我,為什麼我上傳老是失敗,需要先把臨時目錄配置好,如果是window系統的話,肯定找不到/Users/mac/Documents/
這呀的目錄的,各位大哥大姐,小弟真心的希望你們在學習程式的過程中多注意別人說的每一個重點地方,多自己找找錯誤,解決問題,這樣就能走出自己的路!
2.一下代碼,如果稍微東一點點代碼的人,都會看懂的,request存放兩個值,一個上傳的訊息,一個上傳後的檔案路徑!(順便說一下,我的javaEE好多年沒折騰了,都忘記的差不多了,隨便寫的伺服器端,請大家多多見諒,誒,程式員傷不起,過兩年回家種田了...產品經理折磨我...測試折磨我...尼瑪客戶這不懂那不明白的也折磨我...)
ServletActionContext.getRequest(). setAttribute("typeError",result);ServletActionContext.getRequest().setAttribute("uploadFile", rsImage);
以上基本上都是核心的技術點了,沒啥了!
需要說明的是,大家在拿到我的android用戶端代碼,請先把自己的webview需要load的url修改為自己部署javaEE的項目url,切記切記,不然,老夫真的要吐血身亡了!
廢話不說了,哥討厭那些使用蜘蛛爬來爬去的部落格和網站,小弟懇請希望這些站長能活出自己的人生,別裝逼的拿著別人的經驗給自己做裝逼炫耀的資本!路都是自己走出來的,別吃了別人拉下來的還喊香!
著作權:spring sky
共用程式碼如下:
android用戶端代碼
javaEE伺服器端代碼
順便說一下,本人年紀不小了,為了能做出自己的一些事情,有點創業的想法,如果有創業的朋友缺忠誠的夥伴,請聯絡我!(專註於android ios開發,沒有神一樣的智商,但擁有不屈不服的心,不為困難而低頭,只為理想而拼搏)