使用WebView调用系统相册和上传图片
我主要负责图片的显示,上传就不是我的事了
import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.chance.homecarenurse.R; import com.chance.homecarenurse.action.ConnUrls; import com.chance.homecarenurse.ui.activity.base.BaseActivity; import com.klxair.utils.android.CommonUtils; import com.klxair.utils.log.T; import com.lidroid.xutils.view.annotation.ViewInject; /** * 护理报告填写界面 */ @SuppressLint("NewApi") public class NurseReportActivity extends BaseActivity{ @ViewInject(R.id.nurse_webview) private WebView nurse_webview;//webView控件 /** * 不同方式的请求码 */ public static final int REQUEST_SELECT_FILE = 100; public final static int FILECHOOSER_RESULTCODE = 1; /** * 接收安卓5.0以上的 */ public ValueCallback<Uri[]> uploadMessage; /** * 接收5.0以下的 */ private ValueCallback<Uri> mUploadMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nurse_report); initViewID(); initView(); initData(); } private void initData() { nurseReport(); } /** * 初始化webView的设置 */ private void initView() { WebSettings settings = nurse_webview.getSettings(); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setSupportZoom(true); //支持放大缩小 settings.setBuiltInZoomControls(true); //显示缩放按钮 } /** * 填写报告 */ private void nurseReport() { if (!CommonUtils.isNetWorkConnected()) { T.showS("请检查网络状况"); return; } String url = ConnUrls.NURSE_REPORT; Bundle extras = getIntent().getExtras(); Log.i("tag", "护理报告参数:"+ extras.getString("orderSendId")+","+ extras.getString("protectedPersonId")); nurse_webview.loadUrl(url+"?orderSendId="+extras.getString("orderSendId")+"&protectedPersonId="+extras.getString("protectedPersonId")); nurse_webview.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); //设置支持调用相册 nurse_webview.setWebChromeClient(new WebChromeClient() { // Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"),FILECHOOSER_RESULTCODE); } // Android 3.0+ public void openFileChooser(ValueCallback uploadMsg,String acceptType) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); startActivityForResult(Intent.createChooser(i, "File Browser"),NurseReportActivity.FILECHOOSER_RESULTCODE); } // Android 4.1+ 会调用这个 public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType, String capture) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult( Intent.createChooser(i, "File Chooser"),NurseReportActivity.FILECHOOSER_RESULTCODE); } //Android 5.0会调用这个 public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { //确保没有现有的消息 if (uploadMessage != null) { uploadMessage.onReceiveValue(null); uploadMessage = null; } uploadMessage = filePathCallback; Intent intent = fileChooserParams.createIntent(); startActivityForResult(intent, REQUEST_SELECT_FILE); return true; } }); } @Override protected void onActivityResult(int requestCode, int resultCode,Intent intent) { if (requestCode == FILECHOOSER_RESULTCODE && resultCode == RESULT_OK) { Uri uri = intent.getData(); Log.i("tag", "图片数据:"+uri.toString()); //将图片显示到webView mUploadMessage.onReceiveValue(intent.getData()); mUploadMessage = null; }else if (requestCode == REQUEST_SELECT_FILE) { if (uploadMessage == null) return; uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); uploadMessage = null; } } }
解决在相册界面按返回键,不选择图片的后果:
@Override protected void onResume() { super.onResume(); if (mUploadMessage != null) { //取消之后要告诉WebView不要再等待返回结果,设置为空就等于重置了状态,也是避免只能选择一次图片的原因 mUploadMessage.onReceiveValue(null); mUploadMessage = null; } }