一聚教程网:一个值得你收藏的教程网站

热门教程

Android中的webview支持页面中的文件上传实例代码

时间:2022-06-25 23:27:16 编辑:袖梨 来源:一聚教程网

Android webview在默认情况下是不支持网页中的文件上传功能的;

如果在网页中有,在android webview中访问时也会出现浏览文件的按钮

但是点击按钮之后没有反应...

那么如何能够让android的webview能够响应,这个浏览按钮呢?在网上查了很多资料,很多相同的,但都漏掉了一个地方,导致无法读取到文件的完整地址(“c:upfile233232.jpg”),整理最终代码入下:

我们需要为webview设置WebChromeClient,在WebChromeClient的实现类中覆盖文件选择的方法:

 

 代码如下复制代码

packagecom.example.webviewupfile;

  

importjava.io.File;

importjava.io.IOException;

  

importandroid.app.Activity;

importandroid.content.ContentResolver;

importandroid.content.Intent;

importandroid.content.res.Configuration;

importandroid.database.Cursor;

importandroid.graphics.Bitmap;

importandroid.net.Uri;

importandroid.os.Bundle;

importandroid.provider.MediaStore;

importandroid.util.Log;

importandroid.view.View;

importandroid.webkit.ValueCallback;

importandroid.webkit.WebChromeClient;

importandroid.webkit.WebView;

importandroid.webkit.WebViewClient;

importandroid.widget.ProgressBar;

  

publicclassMainActivityextendsActivity {

  privateValueCallbackmUploadMessage;

  privatefinalstaticintFILECHOOSER_RESULTCODE =1;

  privateWebView web;

  privateProgressBar progressBar;

  

  @Override

  protectedvoidonCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

  

    web = (WebView) findViewById(R.id.webView1);

    progressBar = (ProgressBar) findViewById(R.id.progressBar1);

  

    web =newWebView(this);

    web.getSettings().setJavaScriptEnabled(true);

    web.loadUrl("http://ueditor.baidu.com/website/onlinedemo.html");

    web.setWebViewClient(newmyWebClient());

    web.setWebChromeClient(newWebChromeClient() {

      // The undocumented magic method override

      // Eclipse will swear at you if you try to put @Override here

      // For Android 3.0+

      publicvoidopenFileChooser(ValueCallbackuploadMsg) {

  

        mUploadMessage = uploadMsg;

        Intent i =newIntent(Intent.ACTION_GET_CONTENT);

        i.addCategory(Intent.CATEGORY_OPENABLE);

        i.setType("image/*");

        MainActivity.this.startActivityForResult(

            Intent.createChooser(i,"File Chooser"),

            FILECHOOSER_RESULTCODE);

  

      }

  

      // For Android 3.0+

      publicvoidopenFileChooser(ValueCallback uploadMsg,

          String acceptType) {

        mUploadMessage = uploadMsg;

        Intent i =newIntent(Intent.ACTION_GET_CONTENT);

        i.addCategory(Intent.CATEGORY_OPENABLE);

        i.setType("*/*");

        MainActivity.this.startActivityForResult(

            Intent.createChooser(i,"File Browser"),

            FILECHOOSER_RESULTCODE);

      }

  

      // For Android 4.1

      publicvoidopenFileChooser(ValueCallbackuploadMsg,

          String acceptType, String capture) {

        mUploadMessage = uploadMsg;

        Intent i =newIntent(Intent.ACTION_GET_CONTENT);

        i.addCategory(Intent.CATEGORY_OPENABLE);

        i.setType("image/*");

        MainActivity.this.startActivityForResult(

            Intent.createChooser(i,"File Chooser"),

            MainActivity.FILECHOOSER_RESULTCODE);

  

      }

  

    });

  

    setContentView(web);

  }

  

  @Override

  protectedvoidonActivityResult(intrequestCode,intresultCode,

      Intent intent) {

    if(requestCode == FILECHOOSER_RESULTCODE) {

      if(null== mUploadMessage)

        return;

      Uri result = intent ==null|| resultCode != RESULT_OK ?null

          : intent.getData();

        

      // mUploadMessage.onReceiveValue(result);

      // mUploadMessage = null;

      Bitmap bm =null;

      //外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口

      ContentResolver resolver = getContentResolver();

      try{

        Uri originalUri = intent.getData();// 获得图片的uri

        bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);

        // 这里开始的第二部分,获取图片的路径:

        String[] proj = { MediaStore.Images.Media.DATA };

        // 好像是android多媒体数据库的封装接口,具体的看Android文档

        Cursor cursor = managedQuery(originalUri, proj,null,null,

            null);

        // 按我个人理解 这个是获得用户选择的图片的索引值

        intcolumn_index = cursor

            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

        // 将光标移至开头 ,这个很重要,不小心很容易引起越界

        cursor.moveToFirst();

        // 最后根据索引值获取图片路径

  

        String path = cursor.getString(column_index);

        Uri uri = Uri.fromFile(newFile(path));

        mUploadMessage.onReceiveValue(uri);

      }catch(IOException e) {

  

        Log.e("TAG-->Error", e.toString());

  

      }

    }

  }

  

  publicclassmyWebClientextendsWebViewClient {

    @Override

    publicvoidonPageStarted(WebView view, String url, Bitmap favicon) {

      // TODO Auto-generated method stub

      super.onPageStarted(view, url, favicon);

    }

  

    @Override

    publicbooleanshouldOverrideUrlLoading(WebView view, String url) {

      // TODO Auto-generated method stub

  

      view.loadUrl(url);

      returntrue;

  

    }

  

    @Override

    publicvoidonPageFinished(WebView view, String url) {

      // TODO Auto-generated method stub

      super.onPageFinished(view, url);

  

      progressBar.setVisibility(View.GONE);

    }

  }

  

  // flipscreen not loading again

  @Override

  publicvoidonConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

  }

  

  // To handle "Back" key press event for WebView to go back to previous

  // screen.

  /*

   *@OverridepublicbooleanonKeyDown(intkeyCode, KeyEvent event) {if

   * ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack();

   *returntrue; }returnsuper.onKeyDown(keyCode, event); }

   */

}

 

热门栏目