WebView各种问题处理

问题:

  • webview无法调用拍照问题
  • http不显示图片问题
  • 与js交互
  • 返回上一层界面

Android的原生浏览器并不支持H5调用拍照与相册,所以在web视图使用中,需要使用的Android的代码去调用。

代码如下:

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.Toast;

import com.lebo.sdk.LogTool;
import com.lebo.smarkparking.AppApplication;
import com.lebo.smarkparking.MainActivity;
import com.lebo.smarkparking.R;
import com.lebo.smarkparking.components.LEBOTittleBar;

import java.io.File;


public class IntelligentLifeWebActivity extends BaseActivity {

    public ValueCallback<Uri> mUploadMessage;
    public ValueCallback<Uri[]> mUploadMessageForAndroid5;
    public final static int FILECHOOSER_RESULTCODE = 1;
    public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
    private String mCameraFilePath;
    Uri uri;
    WebView mywebview;
    private String presentUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_intelligentlife);
        initView();
    }


    public void initView() {
        LEBOTittleBar LEBOTitle = (LEBOTittleBar) findViewById(R.id.LEBOTitle);
        LEBOTitle.setTittle(getIntent().getStringExtra("name"));
        LEBOTitle.setLeftBtnImgResource(R.mipmap.back);
        LEBOTitle.setLeftBtnListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               //getIntent().getStringExtra("url")  初始化url  返回处理
                if(presentUrl != getIntent().getStringExtra("url")){
                mywebview.goBack();// 返回前一个页面
            } else {
                   finish();
               }
            }
        });
        mywebview = (WebView) findViewById(R.id.webview);

//与js交互事件设置
            mywebview.addJavascriptInterface(new JSClick(), "auth");
        WebSettings settings = mywebview.getSettings();
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setDomStorageEnabled(true);
        settings.setDefaultTextEncodingName("UTF-8");
        settings.setAllowContentAccess(true); // 是否可访问Content Provider的资源,默认值 true
        settings.setAllowFileAccess(true);    // 是否可访问本地文件,默认值 true
        // 是否允许通过file url加载的Javascript读取本地文件,默认值 false
        settings.setAllowFileAccessFromFileURLs(false);
        // 是否允许通过file url加载的Javascript读取全部资源(包括文件,http,https),默认值 false
        settings.setAllowUniversalAccessFromFileURLs(false);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
        //开启JavaScript支持
        settings.setJavaScriptEnabled(true);
        // 支持缩放
        settings.setSupportZoom(true);
        mywebview.setLongClickable(true);
        mywebview.setScrollbarFadingEnabled(true);
        mywebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        mywebview.setDrawingCacheEnabled(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        mywebview.loadUrl(getIntent().getStringExtra("url"));
        mywebview.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                presentUrl = url;
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }
        });

           //图片处理方法

        mywebview.setWebChromeClient(
                new WebChromeClient() {

                    public void onProgressChanged(WebView view, int progress) {// 载入进度改变而触发
                        super.onProgressChanged(view, progress);
                    }

                    //扩展支持alert事件 webview不会展示Alert 所以需要我们自己展示
                    @Override
                    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
//                        AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
//                        builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);
//                        builder.setCancelable(false);
//                        AlertDialog dialog = builder.create();
//                        dialog.show();
//                        result.confirm();
                        return true;
                    }

                    //扩展浏览器上传文件
                    //3.0++版本
                    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                        openFileChooserImpl(uploadMsg);
                    }

                    //3.0--版本
                    public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                        openFileChooserImpl(uploadMsg);
                    }

                    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                        openFileChooserImpl(uploadMsg);
                    }

                    // For Android > 5.0
                    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
                        openFileChooserImplForAndroid5(uploadMsg);
                        return true;
                    }


                }
        );
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);
    }

    public class JSClick{
        @JavascriptInterface
        public void goBack(){
            finish();
        }
    }


    /**
     * 5.0以上的
     *
     * @param uploadMsg
     */
    private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {

        mUploadMessageForAndroid5 = uploadMsg;
        Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
        contentSelectionIntent.setType("image/*");
        Intent xxx = createChooserIntent(createCameraIntent());
        xxx.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
        startActivityForResult(xxx, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
    }

    /**
     * 5.0以下
     *
     * @param uploadMsg
     */
    private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        Intent xxx = createChooserIntent(createCameraIntent());
        xxx.putExtra(Intent.EXTRA_INTENT, i);
        startActivityForResult(xxx, FILECHOOSER_RESULTCODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, 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;

            //5.0以下拍照是不是也要像5.0以上那样处理拍照的事件呢?自己测试

        } else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) {
            //针对5.0的
            if (null == mUploadMessageForAndroid5)
                return;
            Uri result = (intent == null || resultCode != RESULT_OK) ? null : intent.getData();
            if (result != null) {
                //相册或者文件
                mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
            } else {
                try {
                    File file = new File(mCameraFilePath);
                    //判断此路径是否存在 存在提供给网页
                    if (file.exists()) {
                        mUploadMessageForAndroid5.onReceiveValue(new Uri[]{FileProvider.getUriForFile(getApplicationContext(), "com.jph.takephoto.fileprovider", file)});
                        return;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //这个必须调用 否则第二次点击 不会再出现弹窗提示
                mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
            }
            mUploadMessageForAndroid5 = null;
        }
    }


    private Intent createCameraIntent() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//        File externalDataDir = Environment.getExternalStorageDirectory();
//        File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
//                File.separator + "BrowserPhotos");
//        cameraDataDir.mkdirs();
        mCameraFilePath = getPhotoFilePath(getPhotoFileName());
        File file = new File(mCameraFilePath);
        uri = FileProvider.getUriForFile(getApplicationContext(), "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的Uri
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        return cameraIntent;
    }

    public static String getPhotoFilePath(String fileName) {
        return PICTURE_SAVE_PATH + File.separatorChar + fileName;
    }

    public static String getPhotoFileName() {
        return "head_" + "lebo" + "_" + System.currentTimeMillis() + ".jpg";
    }

    public static final String ROOT_DES = "/lebo";
    public static final String PIC_DES = "/Picture";

    public static final String BASE_EXTERNAL_SAVE_PATH = Environment.getExternalStorageDirectory() + ROOT_DES;

    public static final String PICTURE_SAVE_PATH = BASE_EXTERNAL_SAVE_PATH + PIC_DES;

    private Intent createChooserIntent(Intent... intents) {
        Intent chooser = new Intent(Intent.ACTION_CHOOSER);
        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
        chooser.putExtra(Intent.EXTRA_TITLE, "选择图片来源");
        return chooser;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            if(presentUrl != getIntent().getStringExtra("url")){
                mywebview.goBack();// 返回前一个页面
                return true;
            } else {
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public EditText[] getHideInputEditTexts() {
        return new EditText[0];
    }

    @Override
    public void handleMessege(Message msg) {

    }
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值