使用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;
        }  
    }

 

posted @ 2016-11-28 17:32  ts-android  阅读(1452)  评论(0编辑  收藏  举报