Просмотр исходного кода

更新 'app/src/main/java/com/sheep/gamegroup/util/js/BaseActWeb.java'

hanjing лет назад: 7
Родитель
Сommit
f97e70fe6a
1 измененных файлов с 464 добавлено и 69 удалено
  1. 464 69
      app/src/main/java/com/sheep/gamegroup/util/js/BaseActWeb.java

+ 464 - 69
app/src/main/java/com/sheep/gamegroup/util/js/BaseActWeb.java

@@ -1,116 +1,511 @@
-package com.sheep.gamegroup.util.js;
+package com.sheep.gamegroup.view.activity;
 
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.support.annotation.RequiresApi;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
+import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
-import android.webkit.WebView;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
 
-import com.sheep.gamegroup.absBase.BaseUMActivity;
-import com.sheep.gamegroup.model.entity.UserEntity;
+import com.sheep.gamegroup.model.entity.WebParams;
+import com.sheep.gamegroup.module.webview.util.WebResourceRequestAdapter;
+import com.sheep.gamegroup.module.webview.util.WebResourceResponseAdapter;
 import com.sheep.gamegroup.util.CommonUtil;
-import com.sheep.gamegroup.util.share.ShareLinkConfig;
+import com.sheep.gamegroup.util.GlideImageLoader;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.LogUtil;
+import com.sheep.gamegroup.util.NetUtil;
+import com.sheep.gamegroup.util.StringUtils;
+import com.sheep.gamegroup.util.TestUtil;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.util.js.BaseActWeb;
+import com.sheep.gamegroup.util.js.KFZSJs;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+import com.sheep.jiuyan.samllsheep.Config;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
-import com.umeng.socialize.bean.SHARE_MEDIA;
+import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
+import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
+import com.tencent.smtt.sdk.ValueCallback;
+import com.tencent.smtt.sdk.WebChromeClient;
+import com.tencent.smtt.sdk.WebSettings;
+import com.tencent.smtt.sdk.WebView;
+import com.tencent.smtt.sdk.WebViewClient;
+import com.yalantis.ucrop.util.FileUtils;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.StringCallback;
 
-import java.util.Locale;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 
+import butterknife.BindView;
+import okhttp3.Call;
 import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;
-import rx.functions.Action1;
+
 
 /**
- * Created by realicing on 2018/11/23.
- * realicing@sina.com
+ * web页面--含有所有js及url后添加authorization
+ * Created by zengjiebin on 2018/4/27.
  */
-public abstract class BaseActWeb extends BaseUMActivity {
-    public abstract boolean isResponseBack();
+public class ActWebX5 extends BaseActWeb {
 
-    public abstract void setResponseBack(boolean responseBack);
+    @BindView(R.id.webview)
+    WebView mWebView;
+    @BindView(R.id.act_web_loading_pb)
+    ProgressBar act_web_loading_pb;
+    @BindView(R.id.act_web_loading_iv)
+    ImageView act_web_loading_iv;
+    private WebParams webParams;
+    private WebSettings webViewSettings;
 
-    public abstract void clearWebView();
+    @Override
+    protected int getLayoutId() {
+        return R.layout.act_web_x5;
+    }
 
-    public abstract void loadJs(String js);
+    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+    @Override
+    public void initView() {
+        GlideImageLoader.setImage(act_web_loading_iv, R.drawable.gif_sheep_loading);
 
-    public abstract void showTitleBar(boolean isShow);
+        Intent intent = getIntent();
+        webParams = (WebParams) intent.getSerializableExtra(WebParams.class.getSimpleName());
+        String url = webParams.getUrl();
+        String jsUrl = webParams.getJsUrl();
+        if (!TextUtils.isEmpty(url)) {
+            url = url.trim();
+        }
+        if(webParams.isShowTitle()) {
+            TitleBarUtils
+                    .getInstance()
+                    .setShowOrHide(this, true)
+                    .setTitle(this, webParams.getTitle())
+                    .setRightImgBotton(this, R.drawable.ic_edit_text_delete, view -> finish())
+                    .setTitleFinish(this);
+        }
+        initWebViewSettings(mWebView);
+        webViewSettings = mWebView.getSettings();
+        webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        try {
+            if (TestUtil.isTest())
+                WebView.setWebContentsDebuggingEnabled(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+//            webViewSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+        }
+        if (TextUtils.isEmpty(jsUrl)) {
+            loadUrl(url);
+        } else {
+            initJsData(url, jsUrl);
+        }
+    }
 
-    public void superFinish(){
-        super.finish();
+    //初始化js代码数据
+    private void initJsData(final String url, String jsUrl) {
+        OkHttpUtils.get()
+                .url(jsUrl)
+                .build()
+                .execute(new StringCallback() {
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        G.showToast(R.string.service_data_error);
+                    }
+
+                    @Override
+                    public void onResponse(String response, int id) {
+                        js = response;
+                        loadUrl(url);
+                    }
+                });
+    }
+
+    @Override
+    public void initListener() {
+        CommonUtil.getInstance().setDownloadListener(this, mWebView);
     }
 
+    public static void initWebViewSettings(WebView webView) {
+        webView.setClickable(true);
+        WebSettings webSetting = webView.getSettings();
+        webSetting.setJavaScriptEnabled(true);
+        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
+        webSetting.setAllowFileAccess(true);
+        webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
+//        webSetting.setSupportZoom(true);
+//        webSetting.setBuiltInZoomControls(true);
+        webSetting.setUseWideViewPort(true);
+        webSetting.setSupportMultipleWindows(true);
+        // webSetting.setLoadWithOverviewMode(true);
+        webSetting.setAppCacheEnabled(true);
+        // webSetting.setDatabaseEnabled(true);
+        webSetting.setDomStorageEnabled(true);
+        webSetting.setGeolocationEnabled(true);
+        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
+        // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
+        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
+        // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
+        webSetting.setCacheMode(NetUtil.CAN_CONNECT_SERVICE ? WebSettings.LOAD_DEFAULT : WebSettings.LOAD_CACHE_ELSE_NETWORK);
 
-    public static String addUrlToken(String url) {
-        return addUrlQuery(url, "authorization", SpUtils.getToken(SheepApp.getInstance()));
+        // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
+        // settings 的设计
     }
 
-    public static String addUrlQuery(String url, String key, String value) {
-        if(url.contains("?"+key+"=") || url.contains("#"+key+"=") || url.contains("&"+key+"=")){
-            return url;
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mWebView != null) {
+            mWebView.setVisibility(View.GONE);
+            mWebView.removeAllViews();
+            mWebView.destroy();
         }
-        return url + ((url.contains("?") || url.contains("#") && url.contains("=")) ? "&" : "?") + key + "=" + value;
-    }
-    public void setH5Type(String h5Type) {
-        switch (h5Type){
-            case "is_unicom":
-                TitleBarUtils
-                        .getInstance()
-                        .setRightImgBotton(this, R.mipmap.share, new View.OnClickListener() {
-                            @Override
-                            public void onClick(View view) {
-                                CommonUtil.getInstance().callActionWithUserInfo(new Action1<UserEntity>() {
+    }
+
+    /**
+     *
+     */
+    public static final int INPUT_FILE_REQUEST_CODE = 1;
+    private ValueCallback<Uri> mUploadMessage;
+    private final static int FILECHOOSER_RESULTCODE = 2;
+    private ValueCallback<Uri[]> mFilePathCallback;
+
+    private String mCameraPhotoPath;
+
+    private void loadUrl(final String url) {
+
+        mWebView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onReceivedTitle(WebView view, String title) {
+                super.onReceivedTitle(view, title);
+                if (webParams.isShowTitle())
+                    TitleBarUtils
+                            .getInstance()
+                            .setTitle(ActWebX5.this, title);
+            }
+
+            @Override
+            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
+                if (mFilePathCallback != null) {
+                    mFilePathCallback.onReceiveValue(null);
+                }
+                mFilePathCallback = filePathCallback;
+
+                /*PhotoPicker.builder()
+                        .setPhotoCount(1)
+                        .setShowCamera(true)
+                        .setShowGif(false)
+                        .setPreviewEnabled(true)
+                        .start(ActWeb.this, PhotoPicker.REQUEST_CODE);*/
+                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+                if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
+                    // Create the File where the photo should go
+                    File photoFile;
+                    photoFile = createImageFile();
+                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
+
+                    // Continue only if the File was successfully created
+                    if (photoFile != null) {
+                        mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
+                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
+                                Uri.fromFile(photoFile));
+                    } else {
+                    }
+                }
+
+                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
+                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
+                contentSelectionIntent.setType("image/*");
+
+                Intent[] intentArray;
+                takePictureIntent = null;//步调用相机
+                if (takePictureIntent != null) {
+                    intentArray = new Intent[]{takePictureIntent};
+                } else {
+                    intentArray = new Intent[0];
+                }
+
+                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
+                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
+                chooserIntent.putExtra(Intent.EXTRA_TITLE, "图片选择");
+                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
+
+                startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE);
+
+                return /*super.onShowFileChooser(webView, filePathCallback, fileChooserParams)*/true;
+            }
+
+            //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.setType("image/*");
+                ActWebX5.this.startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILECHOOSER_RESULTCODE);
+
+            }
+
+            @Override
+            public void onProgressChanged(WebView view, int newProgress) {
+                LogUtil.println("ActWeb", "onProgressChanged", newProgress);
+                if (newProgress == 100 && ViewUtil.isVisible(act_web_loading_iv)) {
+                    Animation animation = AnimationUtils.loadAnimation(SheepApp.getInstance(), R.anim.anim_alpha_1_0);
+                    animation.setAnimationListener(new Animation.AnimationListener() {
+                        @Override
+                        public void onAnimationStart(Animation animation) {
+
+                        }
+
+                        @Override
+                        public void onAnimationEnd(Animation animation) {
+                            ViewUtil.setVisibility(act_web_loading_iv, false);
+                        }
+
+                        @Override
+                        public void onAnimationRepeat(Animation animation) {
+
+                        }
+                    });
+                    act_web_loading_iv.startAnimation(animation);
+                }
+                ViewUtil.setVisibility(act_web_loading_pb, newProgress != 100);
+                act_web_loading_pb.setProgress(newProgress);
+                super.onProgressChanged(view, newProgress);
+            }
+        });
+        mWebView.setWebViewClient(new WebViewClient() {
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
+                LogUtil.println("ActWeb", "shouldInterceptRequest from cache", url);
+                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().interceptRequest(s));
+            }
+
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
+                LogUtil.println("ActWeb", "shouldInterceptRequest from cache", url);
+                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().interceptRequest(WebResourceRequestAdapter.adapter(webResourceRequest)));
+            }
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                LogUtil.println("ActWeb", "shouldOverrideUrlLoading", url);
+                //微信H5支付核心代码
+                if (url.startsWith(Config.SHEEP_PAY)) {
+                    String order_no = StringUtils.getQueryParameter(url, Config.YF_SHOP_ORDER_NUMBER_KEY);
+                    Jump2View.getInstance().goActPay(ActWebX5.this, order_no, SpUtils.getToken(SheepApp.getInstance()));
+                    return true;
+                } else if (url.startsWith(Config.SHEEP)) {
+                    MiddleSchemeAct.parseAndJumpUri(ActWebX5.this, Uri.parse(url));
+                    return true;
+                } else if (url.startsWith("weixin://wap/pay?")) {
+                    try {
+                        Intent intent = new Intent();
+                        intent.setAction(Intent.ACTION_VIEW);
+                        intent.setData(Uri.parse(url));
+                        startActivity(intent);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return true;
+                } else if (url.startsWith("alipays:") || url.startsWith("alipay")) {
+                    try {
+                        startActivity(new Intent("android.intent.action.VIEW", Uri.parse(url)));
+                    } catch (Exception e) {
+                        new AlertDialog.Builder(ActWebX5.this)
+                                .setMessage("未检测到支付宝客户端,请安装后重试。")
+                                .setPositiveButton("立即安装", new DialogInterface.OnClickListener() {
+
                                     @Override
-                                    public void call(UserEntity userEntity) {
-                                        if (userEntity == null) {
-                                            G.showToast("分享功能调试中");
-                                            return;
-                                        }
-//                                是否是联通卡分享 1:是 0:不是
-//                                分享链接需要加个 is_unicom  参数
-                                        String url = addUrlQuery(userEntity.getShareLink(), "is_unicom", "1");
-                                        new ShareLinkConfig().setLink(url).setTitle("下载小绵羊,免费领取联通大/小天神卡").toShare(BaseActWeb.this);
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        Uri alipayUrl = Uri.parse("https://d.alipay.com");
+                                        startActivity(new Intent("android.intent.action.VIEW", alipayUrl));
                                     }
-                                });
-                            }
-                        });
-                break;
+                                }).setNegativeButton("取消", null).show();
+                    }
+                    return true;
+                } else if (url.startsWith("https://wx.tenpay.com")) {
+                    Map<String, String> extraHeaders = new HashMap<>();
+                    extraHeaders.put("Referer", "http://17xmy.com");
+                    webViewLoadUrl(view, extraHeaders, url);
+                    return true;
+                } else if (url.contains("kfzs.com") || (url.startsWith("http://10.8.") && TestUtil.isDev())) {
+                    Map<String, String> extraHeaders = new HashMap<>();
+                    extraHeaders.put("Referer", "http://kfzs.com");
+                    webViewLoadUrl(view, extraHeaders, url);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+
+            @Override
+            public void onPageStarted(WebView view, String url, Bitmap favicon) {
+                LogUtil.println("ActWeb", "onPageStarted", url);
+                super.onPageStarted(view, url, favicon);
+            }
+
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                LogUtil.println("ActWeb", "onPageFinished", url);
+                super.onPageFinished(view, url);
+                loadJs();
+            }
+        });
+        webViewSettings.setJavaScriptEnabled(true);
+
+        if (webParams.isNeedJsInteract()) {
+            mWebView.addJavascriptInterface(new KFZSJs(this), "kfzsjs");
+            String loadUrl = url;
+            if(webParams.getTokenKey() != null){
+                if(url.startsWith(Config.YF_SHOP_HOME))webParams.tokenFirstUpperCase();
+                loadUrl = addUrlQuery(url, webParams.getTokenKey(), SpUtils.getToken(SheepApp.getInstance()));
+                loadUrl = addUrlQuery(loadUrl, "pf", Config.YF_SHOP_PLATFORM);
+            }
+            LogUtil.println("ActWeb loadUrl = " + loadUrl);
+            webViewLoadUrl(mWebView, loadUrl);
+        } else {
+            webViewLoadUrl(mWebView, url);
         }
     }
+
+    //在sdcard卡创建缩略图
+    //createImageFileInSdcard
+    @SuppressLint("SdCardPath")
+    private File createImageFile() {
+        //mCameraPhotoPath="/mnt/sdcard/tmp.png";
+        File file = new File(Environment.getExternalStorageDirectory() + "/", "tmp.png");
+        mCameraPhotoPath = file.getAbsolutePath();
+        if (!file.exists()) {
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return file;
+    }
+
+    /**
+     * 是否响应返回键
+     */
+    private boolean responseBack = true;
+
     @Override
-    public void onStart(SHARE_MEDIA share_media) {
-        //开始分享
-        loadJs(String.format(Locale.CHINA, "callback(\"onStart\", %s)", share_media.getName()));
+    public void onBackPressed() {
+        if (responseBack)
+            super.onBackPressed();
+        else {
+            loadJs("onBackPressed()");
+        }
     }
 
     @Override
-    public void onResult(SHARE_MEDIA share_media) {
-        //分享成功 微信分享时,取消也会成功
-        loadJs(String.format(Locale.CHINA, "callback(\"onResult\", %s)", share_media.getName()));
+    public void loadJs(String js) {
+        ViewUtil.loadJs(mWebView, js);
     }
 
     @Override
-    public void onError(SHARE_MEDIA share_media, Throwable throwable) {
-        //分享出错
-        String msg = throwable.getMessage();
-        G.showToast(msg != null && msg.contains("没有安装应用") ? "没有安装应用" : msg);
-        loadJs(String.format(Locale.CHINA, "callback(\"onError\", %s)", share_media.getName()));
+    public void finish() {
+        if (mWebView != null && mWebView.canGoBack()) {
+            mWebView.goBack();
+            return;
+        }
+        super.finish();
     }
 
     @Override
-    public void onCancel(SHARE_MEDIA share_media) {
-        //取消分享 微信分享时,没有取消
-        loadJs(String.format(Locale.CHINA, "callback(\"onCancel\", %s)", share_media.getName()));
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == FILECHOOSER_RESULTCODE) {
+            if (null == mUploadMessage) return;
+            Uri result = data == null || resultCode != RESULT_OK ? null
+                    : data.getData();
+            if (result != null) {
+                String imagePath = FileUtils.getPath(this, result);
+                if (!TextUtils.isEmpty(imagePath)) {
+                    result = Uri.parse("file:///" + imagePath);
+                }
+            }
+            mUploadMessage.onReceiveValue(result);
+            mUploadMessage = null;
+        } else if (requestCode == INPUT_FILE_REQUEST_CODE && mFilePathCallback != null) {
+            // 5.0的回调
+            Uri[] results = null;
+
+            // Check that the response is a good one
+            if (resultCode == Activity.RESULT_OK) {
+                if (data == null) {
+                    // If there is not data, then we may have taken a photo
+                    if (mCameraPhotoPath != null) {
+                        results = new Uri[]{Uri.parse(mCameraPhotoPath)};
+                    }
+                } else {
+                    String dataString = data.getDataString();
+                    if (dataString != null) {
+                        results = new Uri[]{Uri.parse(dataString)};
+                    }
+                }
+            }
+
+            mFilePathCallback.onReceiveValue(results);
+            mFilePathCallback = null;
+        } else {
+            super.onActivityResult(requestCode, resultCode, data);
+            return;
+        }
+    }
+
+    // 注入js函数监听
+    public void loadJs() {
+        if (TextUtils.isEmpty(js))
+            return;
+        ViewUtil.loadJs(mWebView, getJs());
+        LogUtil.println("ActWeb", "loadJs", js);
+    }
+
+    private String js;
+
+    private String getJs() {
+        String testJsStart = "alert('成功注入');";
+        return BuildConfig.DEBUG ? testJsStart + "\n" + js : js;
+    }
+
+    @Override
+    public boolean isResponseBack() {
+        return responseBack;
     }
 
-    protected void webViewLoadUrl(com.tencent.smtt.sdk.WebView webView, String url){
-        webView.loadUrl(url);
-        WebViewCacheInterceptorInst.getInstance().loadUrl(url, webView.getSettings().getUserAgentString());
+    @Override
+    public void setResponseBack(boolean responseBack) {
+        this.responseBack = responseBack;
     }
-    protected void webViewLoadUrl(com.tencent.smtt.sdk.WebView webView, Map<String, String> map, String url){
-        webView.loadUrl(url);
-        WebViewCacheInterceptorInst.getInstance().loadUrl(url, map, webView.getSettings().getUserAgentString());
+
+    @Override
+    public void clearWebView() {
+        mWebView = null;
     }
-    protected void webViewLoadUrl(WebView webView, String url){
-        WebViewCacheInterceptorInst.getInstance().loadUrl(webView,url);
+
+    @Override
+    public void showTitleBar(boolean isShow) {
+        ActionBar actionBar = getSupportActionBar();
+        if(actionBar != null)
+            actionBar.hide();
     }
+
 }