安卓開發8-WebView支持文件上傳

安卓手機中採用webview訪問OA系統,當OA中使用input=file的方式時,點選擇文件沒有反應,須要在WebChromeClient中增長openFileChooser方法;chrome瀏覽器input=file文件路徑出現c:\fakepath\,smartUpload上傳不成功的解決辦法;在WebView經過addView方式打開附件不能關閉的解決辦法android

 

MainActivity中定義ValueCallback變量web

         //在MainActivity中定義ValueCallback變量chrome

         public ValueCallback<Uri> mUploadMessage;瀏覽器

 

         //在MainActivity中增長setUploadMessage方法,提供給WebChromeClient調用服務器

         public void setUploadMessage(ValueCallback<Uri> uploadMessage) {ide

                   mUploadMessage = uploadMessage;函數

         }測試

 

WebChromeClient實現類MyWebChromeClient中增長MainActivity變量this

         //在MyWebChromeClient中增長MainActivity變量搜索引擎

    public MainActivity mainActivity = null;

 

    //增長MyWebChromeClient構造函數,傳入MainActivity

    public MyWebChromeClient(MainActivity activity) {

       mainActivity = activity;

    }

 

修改MainActivity中新建WebChromeClient的方法

         //onCreateView中,新建MyWebChromeClient時,傳入MainActivity

         webView1.setWebChromeClient(

                   new MyWebChromeClient((MainActivity)this.getActivity()));

 

MyWebChromeClient中實現openFileChooser

    //For Android  > 4.1.1

         public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {

                   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

                   intent.addCategory(Intent.CATEGORY_OPENABLE);

                   intent.setType("image/*");

                   //必需要把uploadMsg傳給MainActivity,不然沒法接收選中的文件

                   mainActivity.setUploadMessage(uploadMsg);

                   //打開選擇文件的窗口

                   mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);

         }

        

         //For Android 3.0+

         public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {

                   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

                   intent.addCategory(Intent.CATEGORY_OPENABLE);

                   intent.setType("image/*");

                   mainActivity.setUploadMessage(uploadMsg);

                   mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);

         }

         //For Android < 3.0

         public void openFileChooser(ValueCallback<Uri> uploadMsg) {

                   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

                   intent.addCategory(Intent.CATEGORY_OPENABLE);

                   intent.setType("image/*");

 

                   mainActivity.setUploadMessage(uploadMsg);

                   mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);

         }       

 

 

MainActivity中增長onActivityResult

         @Override

         protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

                   if (requestCode == 1) {

                            if (null == mUploadMessage) {

                                     return;

                            }

                            Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();

                            //接收選中的文件路徑

                            mUploadMessage.onReceiveValue(result);

                            mUploadMessage = null;

                   }

         }

 

完成以上步驟已經,能夠實現選擇文件

 

 

使用SmartUpload保存文件沒有上傳到服務器的問題

         這個功能採用IE瀏覽器訪問並上傳圖片是正常的,採用手機webview上傳文字能夠保存,圖片不能保存,在電腦上用chrome瀏覽器測試也不能保存。

         測試發現chrome中使用input=file選擇文件時,只顯示文件名稱,用js獲取file的路徑是「c:\fakepath\」開頭,沒有顯示文件的真實路徑。雖然沒有顯示文件的真實路徑,其實沒有影響文件上傳的,問題出在SmartUpload的upload方法。

         採用IE時獲取的filePath是完整的,smartUpload解析到文件名fileName,若是沒有fileName就continue。採用chrome時獲取的filePath就是文件名,相同的方法解析fileName就會爲空,天然就放棄上傳了。

         如下是SmartUpload中update的相關部分。雖然SmartUpload原始版本有很多bug,這些年修修補補仍是很耐用的。

         filePath = fileItem.getName();

         if (filePath.equals("")) {

                   continue;

    }

         iLastIndex =    filePath.lastIndexOf('\\');

         if (filePath.length() > iLastIndex && iLastIndex > 0) {

                   fileName = filePath.substring(iLastIndex+1, filePath.length());// 獲取到文件的全名

         }     

         if (fileName.equals("")) {

                   //continue;

                   //註釋掉continue,空時將filePath賦給fileName,修改後支持chrome

                   fileName = filePath;

         }

 

WebView中查看附件後關閉的問題

         以前在MyWebChromeClient中實現了onCreateWindow方法,用來實現採用WebView的方式實現window.open彈出窗口,我打開附件是用_blank的鏈接方式,一樣被onCreateWindow攔截,而且採用WebView打開。悲劇的是window.open的頁面都有window.close的按鈕,附件卻沒有,打開的附件就一直在。

         我用setOnLongClickListener方式,當長按時自動關閉。在MyWebChromeClient的onCreateWindow方法裏,實現:

                   newWebView.setOnLongClickListener(new WebView.OnLongClickListener() {

                            public boolean onLongClick(View v) {

                                     newWebView.setVisibility(View.GONE);

                                     newWebView.clearView();

                                     return true;

                            }                          

                   });

 

         我是用ADT,android4.0環境,測試機是三星Galaxy S4。網上的資料,你們都是抄來抄去,特別是中國的博客,搜索引擎搜出來的技術文章都大同小異。手機APP研究系列從1到8都是我本身通過代碼和測試機驗證後總結下來的,只是寫了一些要點,不過對於相關問題的解決應該能帶來一些幫助。

相關文章
相關標籤/搜索