Android使用WebView支持html上传图片

2019-08-07  本文已影响0人  i宁静的鱼

Android使用WebView时,html页面的上传失效了,需要android端做一些配合。

package com.iefeel.xuexi;

import android.Manifest;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.JsResult;
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;

import com.yzq.zxinglibrary.android.CaptureActivity;
import com.yzq.zxinglibrary.common.Constant;

import java.io.File;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    public WebView webview;
    public static final int FILECHOOSER_RESULTCODE_5 = 12;
    public static final int FILECHOOSER_RESULTCODE = 13;
    public WebChromeClient.FileChooserParams  mfileChooserParams;
    public ValueCallback<Uri[]> umUploadMessages;
    public ValueCallback<Uri> mUploadMessage;
    public static final int REQUEST_CODE_SCAN = 1;
    private String xdomain = "http://xuexi.iefeel.com/ydsite/default/index";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webview = new WebView(this);
        //支持Js
        webview.getSettings().setJavaScriptEnabled(true);
        //允许js弹出窗口
        webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        //设置是否开启DOM存储API权限,默认false,未开启,设置为true,WebView能够使用DOM storage API
        webview.getSettings().setDomStorageEnabled(true);
        //设置默认编码
        webview.getSettings().setDefaultTextEncodingName("UTF-8");
        //开启数据库功能
        webview.getSettings().setDatabaseEnabled(true);
        //开启web缓存功能
        webview.getSettings().setAppCacheEnabled(false);
        //设置在WebView内部是否允许访问文件,默认允许访问。
        webview.getSettings().setAllowFileAccess(true);
        //设置缓存模式
        webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        //设置WebView是否使用viewport,当该属性被设置为false时,加载页面的宽度总是适应WebView控件宽度;
        //当被设置为true,当前页面包含viewport属性标签,在标签中指定宽度值生效,如果页面不包含viewport标签,
        //无法提供一个宽度值,这个时候该方法将被使用。
        webview.getSettings().setUseWideViewPort(true);
        //必须设置setWebViewClient  自定义的继承于WebViewClient的类就是用来拦截url处理一些与H5交互的时候的逻辑
        webview.setWebViewClient(new WebViewClient(){

            //此方法可以使H5在WebView中显示,而不是手机浏览器
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            //访问url开始时候触发
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            //访问url结束时候触发
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                // TODO Auto-generated method stub
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

            public void onConsoleMessage(String message, int lineNumber, String sourceID) {
                Log.d("MyApplication", message + " -- From line " + lineNumber + " of " + sourceID);
            }

        });
        webview.setWebChromeClient(new WebChromeClient(){
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
                builder.setTitle("系统提示")
                        .setMessage(message)
                        .setPositiveButton("确定", null)
                        .setCancelable(false)
                        .create()
                        .show();
                result.confirm();
                return true;
            }

            public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
                builder.setTitle("系统提示")
                        .setMessage(message)
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        }).setNeutralButton("取消", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        result.cancel();
                    }
                })
                        .create()
                        .show();
                return true;
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                umUploadMessages = filePathCallback;
                mfileChooserParams = fileChooserParams;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.putExtra("return-data", true);
                i.setType("image/*");
                i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(Intent.createChooser(i, "选择相册"), FILECHOOSER_RESULTCODE_5);
                return true;
            }

            // For 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.putExtra("return-data", true);
                i.setType("image/*");
                i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(Intent.createChooser(i, "选择相册"), FILECHOOSER_RESULTCODE);
            }

            // For 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.putExtra("return-data", true);
                i.setType("image/*");
                i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(Intent.createChooser(i, "选择相册"),
                        FILECHOOSER_RESULTCODE);
            }

            // Android 3.0 +
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.putExtra("return-data", true);
                i.setType("image/*");
                i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(Intent.createChooser(i, "选择相册"), FILECHOOSER_RESULTCODE);
            }
        });
        webview.loadUrl(xdomain + "?is_app_client=1&rnum=" + System.currentTimeMillis());
        setContentView(webview);
    }

    //创建菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return true;
    }

    //菜单点击事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.id_about_us: //关于
                String version = getVersionName(this);
                AlertDialog aboutDialog = new AlertDialog.Builder(this).create();
                aboutDialog.setTitle("鱼知凡在线学习系统");
                aboutDialog.setMessage("当前版本:" + version);
                aboutDialog.show();
                break;
            case R.id.id_scan_some: //扫码
                checkPermission();
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, CaptureActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivityForResult(intent, REQUEST_CODE_SCAN);
                break;
            case R.id.id_close_app: //退出
                AlertDialog exitDialog = new AlertDialog.Builder(this).create();
                exitDialog.setTitle("系统提示");
                exitDialog.setMessage("确定要退出吗");
                exitDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });
                exitDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "欢迎回来", Toast.LENGTH_SHORT).show();
                    }
                });
                exitDialog.show();
                break;
            default:
                break;
        }
        return true;
    }

    //监听退出动作
    @Override
    public void onBackPressed(){
        if(webview.canGoBack()){
            webview.goBack();
            return;
        }else{
            AlertDialog exitDialog = new AlertDialog.Builder(this).create();
            exitDialog.setTitle("系统提示");
            exitDialog.setMessage("确定要退出吗");
            exitDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            exitDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "欢迎回来", Toast.LENGTH_SHORT).show();
                }
            });
            exitDialog.show();
            return;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage) return;
            if (null == data){
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
            }else{
                Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
        }else  if (requestCode == FILECHOOSER_RESULTCODE_5){// 5.0适配,主要是因为5.0的返回参数不同。
            // 处理5.0的callback
            if (umUploadMessages != null) {
                if (null != data) { // 5.0的处理方式不同,要注意。
                    ArrayList<String> resultList = data.getStringArrayListExtra("data");
                    umUploadMessages.onReceiveValue(mfileChooserParams.parseResult(resultCode, data));
                    umUploadMessages = null;
                } else {
                    umUploadMessages.onReceiveValue(null);
                }
            }
        }else if(requestCode == REQUEST_CODE_SCAN){//扫码观看
            if(resultCode == RESULT_OK){
                String result = data.getStringExtra(Constant.CODED_CONTENT);
                webview.loadUrl(result);
            }
        }
    }

    private void checkPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
            if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA,Manifest.permission.VIBRATE},333);
                return;
            }else{ }
        } else { }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    //获取版本名
    public static String getVersionName(Context context) {
        return getPackageInfo(context).versionName;
    }

    //获取版本号
    public static int getVersionCode(Context context) {
        return getPackageInfo(context).versionCode;
    }

    //通过PackageInfo得到的想要启动的应用的包名
    private static PackageInfo getPackageInfo(Context context) {
        PackageInfo pInfo = null;
        try {
            //通过PackageManager可以得到PackageInfo
            PackageManager pManager = context.getPackageManager();
            pInfo = pManager.getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS);
            return pInfo;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pInfo;
    }

}

其中用到的菜单文件menu.xml如下

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/id_about_us" android:title="关于"/>
    <item android:id="@+id/id_scan_some" android:title="扫码"/>
    <item android:id="@+id/id_close_app" android:title="退出"/>
</menu>

其中还用到了扫码功能,需要添加以下依赖包

implementation 'com.github.yuzhiqiang1993:zxing:2.2.8'
上一篇 下一篇

猜你喜欢

热点阅读