zoukankan      html  css  js  c++  java
  • Android应用开发中webview上传文件的几种思路

    1. 常规方法,重写WebChromeClient 的 openFileChooser 方法

    private class MyWebChromeClient extends WebChromeClient {        
            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {  
                   if (mUploadMessage != null) return;
                   mUploadMessage = uploadMsg;   
                   Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                   i.addCategory(Intent.CATEGORY_OPENABLE);
                   i.setType("*/*");
                   
                       startActivityForResult( Intent.createChooser( i, "File Chooser" ), 1 );
             }
                // 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);      
            }
           
                 
        }

    这个是大家常用的,但是这个openFileChooser不是公开的方法,android4.4 不支持,肿么办?判断版本,如果是4.4就调用系统浏览器是个变通的方法,到时可以用,但是客户不认可,只有自己用app自己实现上传了。

    2. 自己实现上传

    private String post(String pathToOurFile) throws ClientProtocolException, IOException, JSONException {
              HttpClient httpclient = new DefaultHttpClient();
              //设置通信协议版本
              httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
               
              HttpPost httppost = new HttpPost(uploadUrl);
              File file = new File(pathToOurFile);
           
              MultipartEntity mpEntity = new MultipartEntity(); //文件传输
              ContentBody cbFile = new FileBody(file);
              mpEntity.addPart("userfile", cbFile); // <input type="file" name="userfile" />  对应的
           
           
              httppost.setEntity(mpEntity);
               
              HttpResponse response = httpclient.execute(httppost);
              HttpEntity resEntity = response.getEntity();
           
              String json="";
              String path="";
              if (resEntity != null) {
                json=EntityUtils.toString(resEntity,"utf-8");
                JSONObject p=null;
                try{
                    p=new JSONObject(json);
                    path=(String) p.get("path");
                }catch(Exception e){
                    e.printStackTrace();
                }
              }
              if (resEntity != null) {
                resEntity.consumeContent();
              }
           
              httpclient.getConnectionManager().shutdown();
              return path;
          }

    用到了 httpmine包,网上有下载。

    如何调用呢?

    browser.addJavascriptInterface(this, "android"); browser是webview对象。

    在页面<a href="javascrijpt:window.android.uploadFile()">上传文件</a>

    uploadFile() 是被调用的Activity的一个方法,主要就是打开选择对话框,流程和第一种方法一样。只是返回文件路径后自己上传。

    新版android系统到是可以了,又出现了问题:在android2.3等版本有个bug,从js调用app的方法会崩溃,不兼容,我们只能换一种方法调用这个uploadFile

    另外编译的时候最好选择2.2版本,不要选择2.3

    3. 过滤url, 重写 WebViewClient的 shouldOverrideUrlLoading方法

    private class MyWebViewClient extends WebViewClient{
              private Context mContext;
              public MyWebViewClient(Context context){
               super();
               mContext = context;
              }
              
              public boolean shouldOverrideUrlLoading(WebView view, String url)
              {
                  if (url.equalsIgnoreCase("app:upload")) {
                      MainActivity.this.uploadFile();
                      return true;
                  }
                  view.loadUrl(url);
                  return true;
              }
             }  

    页面中 <a href="app:upload">上传文件</a>

    Android 的兼容性问题真让人头疼啊 --

  • 相关阅读:
    EF4.1中诡异的GUID为空问题
    asp.net mvc3 Razor引擎中@使用规则小记
    【推荐】JS面象对象编程视频教程
    【转】【More Effective C#】IEnumerable和IQueryable的那点事
    【你有更好的算法吗?】合并重叠时间段算法
    jquery处理textarea中的手动换行
    实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
    架设自己的NuGet服务器
    C#中用SelectSingleNode方法解析带有多个命名空间的XML文件
    解析入口参数为实体的表达式树
  • 原文地址:https://www.cnblogs.com/sohowang/p/3998155.html
Copyright © 2011-2022 走看看