如何实现webview上传图片

//主界面

package com.example.webview_js;

import java.io.File;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnKeyListener;
import android.webkit.ConsoleMessage;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
    protected static final int FILECHOOSER_RESULTCODE = 1;
    //定义控件
    private WebView mWebView;
    private ProgressBar mProgressBar;
    //定义接口
      private Uri imageUri;
      public ValueCallback<Uri> mUploadMessage;
      public final static int REQ_CHOOSER = 1;
      private final static int REQ_CAMERA = 2;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String url = "http://101.200.142.201/Login/index?redirect_uri=http%3A%2F%2F101.200.142.201%2F";
        mWebView=(WebView) findViewById(R.id.mywebview);
        mProgressBar=(ProgressBar) findViewById(R.id.my_progresss);
        mWebView.loadUrl(url);

          WebSettings webSettings = mWebView.getSettings();  
          webSettings.setJavaScriptEnabled(true);  
          webSettings.setDefaultTextEncodingName("utf-8");  
          mWebView.setWebViewClient(new MyWebViewClient());

          mWebView.getSettings().setJavaScriptEnabled(true);          
        //设置webview视图
          mWebView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onProgressChanged(WebView view, int progress) {
                    mProgressBar.setVisibility(View.VISIBLE);
                    mProgressBar.setProgress(progress);
                    if (progress >= 80) {
                        mProgressBar.setVisibility(View.GONE);
                    }
                }
                   // For Android 3.0-
                @SuppressWarnings("unused")
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    openFileChooser(uploadMsg,"");

                }
                 @SuppressWarnings("unused")
                 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                     //选择图片
                     openFileChooser(uploadMsg,acceptType);
                 } 
                 // For Android 4.1
                 @SuppressWarnings("unused")
                 public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                     mUploadMessage=uploadMsg;
                     selectImage();
                 }
            }); 
   } 



    public class MyWebViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            mWebView.loadUrl(url);
            return true;
        }

    }


    /**
     * 
     * 弹出框,,选择图片
     */
    protected final void selectImage() {
        AlertDialog.Builder builder = new Builder(MainActivity.this);
        builder.setOnCancelListener(new ReOnCancelListener());
        final String[] items = { "照相机", "相册" };
        builder.setItems(items, new DialogInterface.OnClickListener() {

            @SuppressLint("SdCardPath")
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = null;
                switch (which) {  
                case 0:
                    Toast.makeText(getApplicationContext(), items[0],
                            Toast.LENGTH_SHORT).show();
                    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    // 必须确保文件夹路径存在,否则拍照后无法完成回调
                    File vFile = new File(Environment
                            .getExternalStorageDirectory().getPath()
                            + "/DCIM/Camera/"
                            + (System.currentTimeMillis() + ".jpg"));
                    if (!vFile.exists()) {
                        File vDirPath = vFile.getParentFile();
                        vDirPath.mkdirs();
                    } else {
                        if (vFile.exists()) {
                            vFile.delete();
                        }
                    }
                    //或得图片的url
                    imageUri = Uri.fromFile(vFile);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    MainActivity.this
                            .startActivityForResult(intent, REQ_CAMERA);
                    break;
                case 1:
                    Toast.makeText(getApplicationContext(), items[1],
                            Toast.LENGTH_SHORT).show();
                    intent = new Intent(Intent.ACTION_PICK, null);

                    intent.setDataAndType(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            "image/*");
                    /*// 裁切图片
                    intent.putExtra("crop", "true");
                    // 裁切的宽高比率
                    intent.putExtra("aspectX", 1);
                    intent.putExtra("aspectY", 1);
                    // 设置输出的图片大小
                    intent.putExtra("outputX", 200);
                    intent.putExtra("outputY", 200);
                    intent.putExtra("return-data", true);*/
                    MainActivity.this.startActivityForResult(
                            Intent.createChooser(intent, "选择图片"), REQ_CHOOSER);
                    break;
                }
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.create().show();
    }

    //(这里的意思是取消弹框之后要告诉WebView不要再等待返回结果,设置为空就等于重置了状态)
    private class ReOnCancelListener implements
            DialogInterface.OnCancelListener {

    @Override
    public void onCancel(DialogInterface dialogInterface) {
        if (mUploadMessage != null) {
            mUploadMessage.onReceiveValue(null);
            mUploadMessage = null;
        }
    }
}

    //回调方法
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        switch (requestCode) {
        //相册
        case REQ_CHOOSER:
            if (resultCode == Activity.RESULT_OK) {
            if (null == mUploadMessage)
                return;
            Uri result = data == null || resultCode != RESULT_OK ? null : data
                    .getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
            }else{
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
            }
            break;
        //相机
        case REQ_CAMERA:
            if (resultCode == Activity.RESULT_OK) {
                mUploadMessage.onReceiveValue(imageUri);              
                mUploadMessage = null;
            }else{
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
            }
            break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

 // 此按键监听的是返回键,能够返回到上一个网页(通过网页的hostlistery)
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

//布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.webview_js.MainActivity" >


    <WebView 
        android:id="@+id/mywebview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

  <ProgressBar
        android:id="@+id/my_progresss"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="36dp" />

</RelativeLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值