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

作者:袖梨 2022-06-25

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.bai***du.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); }

*/

}

相关文章

精彩推荐