package com.tejia.lijin.app.util.web; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import androidx.core.content.ContextCompat; import android.util.Log; import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.kepler.jd.Listener.OpenAppAction; import com.kepler.jd.login.KeplerApiManager; import com.kepler.jd.sdk.bean.KeplerAttachParameter; import com.tejia.lijin.app.util.JumpActivityUtil; import com.tejia.lijin.app.util.PermissionHelper; import com.tejia.lijin.app.util.Tools; import com.tejia.lijin.app.util.web.BaseRebateJavaInterface; import com.wpc.library.util.common.StringUtils; import com.wpc.library.util.security.MD5Utils; import com.tejia.lijin.app.Interface.WebInterface; import com.tejia.lijin.app.callBack.GeneralBackCallback; import com.tejia.lijin.app.callBack.PermissionInterface; import com.tejia.lijin.app.entity.ImgText; import com.tejia.lijin.app.entity.share.ShareImageEntity; import com.tejia.lijin.app.ui.dialog.ShapeLoadingDialog; import com.tejia.lijin.app.ui.invite.ShareBrowserActivity; import com.tejia.lijin.app.util.baichuan.AlibcTradeUtil; import com.tejia.lijin.app.util.share.ShareImageUtil; import com.tejia.lijin.app.util.share.ShareTextUtil; import com.ysh.wpc.appupdate.download.DownLoadFile; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class RebateJavaInterface extends BaseRebateJavaInterface implements PermissionInterface { Activity mContext; TextView tv_top_bar_middle, tv_top_bar_left2, tv_top_bar_right; ImageView iv_right; WebView webview; ShapeLoadingDialog pd; private boolean boo = false; private PermissionHelper mPermissionsChecker; // 权限检测器 public RebateJavaInterface(Activity activity, WebView webview) { super(activity); mContext = activity; this.webview = webview; boo = true; } public RebateJavaInterface(Activity activity, TextView tv_top_bar_middle , TextView tv_top_bar_left2, TextView tv_top_bar_right , ImageView iv_right, WebView webview, ShapeLoadingDialog pd) { super(activity); mContext = activity; this.tv_top_bar_middle = tv_top_bar_middle; this.tv_top_bar_left2 = tv_top_bar_left2; this.tv_top_bar_right = tv_top_bar_right; this.iv_right = iv_right; this.webview = webview; this.pd = pd; } @JavascriptInterface public void setTitle(final String title) { // tv_top_bar_middle.setText(title); if (!boo) tv_top_bar_middle.post(new Runnable() { @Override public void run() { if (null != title && !StringUtils.isEmpty(title.trim())) tv_top_bar_middle.setText(title); } }); } /** * 保存网络图片 * * @param url * @param name */ @JavascriptInterface public void savePicture(String url, String name) { if (mPermissionsChecker == null) mPermissionsChecker = new PermissionHelper(mContext, this); if (mPermissionsChecker.lacksPermissions(getPermissions())) { //存储权限未开启 mPermissionsChecker.showNormalDialog(); } else {//存储权限已开 String md5 = MD5Utils.getMD532(url); String path = com.wpc.library.util.Environment.getExternalStorageDirectory() + "/tejiaapp"; File file = new File(path + "/" + md5 + ".jpg"); if (!file.exists()) { try { File resultFile = Tools.saveImageFromPathToSdCard(mContext, url, path, md5 + ".jpg"); if (resultFile != null) { Toast.makeText(mContext, "图片保存到相册成功", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(mContext, "图片保存失败", Toast.LENGTH_LONG).show(); if (file.exists()) file.delete(); } } else { Toast.makeText(mContext, "图片已经保存!", Toast.LENGTH_LONG).show(); } } } @JavascriptInterface public void savePictures(String urls) { if (mPermissionsChecker == null) mPermissionsChecker = new PermissionHelper(mContext, this); if (mPermissionsChecker.lacksPermissions(getPermissions())) { //存储权限未开启 mPermissionsChecker.showNormalDialog(); } else {//存储权限已开 List urlList = new ArrayList<>(); try { JSONArray array = new JSONArray(urls); for (int i = 0; i < array.length(); i++) { urlList.add(array.optString(i)); } } catch (Exception e) { } if (urlList != null && urlList.size() > 0) try { startDownLoadImages(urlList, type, 2); } catch (Exception e) { } } } @JavascriptInterface public void setTopMenuRightIcon(final String picUrl, final String jsCallback) { if (!boo) iv_right.post(new Runnable() { @Override public void run() { iv_right.setVisibility(View.VISIBLE); Glide.with(mContext).load(picUrl).into(iv_right); iv_right.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Log.e("mResult", jsCallback); webview.loadUrl("javascript:" + jsCallback); } }); } }); } @JavascriptInterface public void jumpPageWithFinishCurrentPage(String pageClassName, String paramJson) { Intent intent = null; JSONObject param = null; try { if (StringUtils.isEmpty(paramJson)) { param = null; } else { param = new JSONObject(paramJson); } if (StringUtils.isEmpty(pageClassName)) { return; } else { intent = new Intent(mContext, Class.forName(JumpActivityUtil.filterActivityName(pageClassName))); } } catch (JSONException e) { param = null; e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } if (null != param) { @SuppressWarnings("unchecked") Iterator its = param.keys(); while (its.hasNext()) { String key = its.next(); String value = param.optString(key); intent.putExtra(key, value); } } mContext.startActivity(intent); if (!boo) mContext.finish(); } @JavascriptInterface public void hiddenTopMenuCloseBtn() { if (!boo) tv_top_bar_left2.setVisibility(View.GONE); } @JavascriptInterface public void hideLoading() { if (!boo) iv_right.post(new Runnable() { @Override public void run() { if (pd != null && pd.isShowing()) pd.dismiss(); } }); } @JavascriptInterface public void showLoading() { if (!boo) iv_right.post(new Runnable() { @Override public void run() { if (pd == null) { pd = new ShapeLoadingDialog.Builder(mContext).build(); } pd.show(); } }); } @JavascriptInterface public void finishPage() { if (!boo) iv_right.post(new Runnable() { @Override public void run() { mContext.finish(); } }); } @JavascriptInterface public void setTopMenuRightText(final String text, final String callbackMethod) { if (!boo) tv_top_bar_right.post(new Runnable() { @Override public void run() { tv_top_bar_right.setText(text); tv_top_bar_right.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { webview.loadUrl("javascript:" + callbackMethod); } }); } }); } public List mList = new ArrayList<>(); @JavascriptInterface public void addMenu(String str) { Gson gson = new GsonBuilder().serializeNulls().create(); List list = gson.fromJson(str, new TypeToken>() { }.getType()); if (mList.size() > 0) mList.clear(); mList.addAll(list); } @JavascriptInterface public void showSharePanel() { webShareDesc.setShare(); } //文本分享 @JavascriptInterface public void shareText(int type, String text) { if (type == 1) { ShareTextUtil.shareWXTextByIntent(mContext, text); } else if (type == 2) { ShareTextUtil.shareWXCircleTextByIntent(mContext, text); } else if (type == 3) { ShareTextUtil.shareQQTextByIntent(mContext, text); } else if (type == 4) { ShareTextUtil.shareQQZoneTextByIntent(mContext, text); } else { ShareTextUtil.shareSinaTextByIntent(mContext, text); } } //图片分享 "type":1,//1-微信 2-朋友圈 3-QQ 4-空间 5-微博 6-更多 @JavascriptInterface public void shareImg(int type, final String url) { //检测权限 String[] str = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (lacksPermissions(str)) {//缺少权限 generalBackCallback.onSuccess(type, url); } else { this.type = type; this.imgurl = url; new Thread() { public void run() { Bitmap bitmap = getNetImage(url);//从网络下载图片 Message msg = new Message(); Bundle data = new Bundle(); data.putParcelable("bitmap", bitmap); msg.setData(data); msg.what = 1001; handler.sendMessage(msg); } }.start(); } } /** * 多图分享 * * @param type * @param urls */ @JavascriptInterface public void shareImgs(int type, final String urls) { String[] str = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (lacksPermissions(str)) {//缺少权限 generalBackCallback.onSuccess(type, null); } else { List urlList = new ArrayList<>(); try { JSONArray array = new JSONArray(urls); for (int i = 0; i < array.length(); i++) { urlList.add(array.optString(i)); } } catch (Exception e) { } if (urlList != null && urlList.size() > 0) try { startDownLoadImages(urlList, type, 1); } catch (Exception e) { } } } /** * 淘宝授权 * * @param url */ @JavascriptInterface public void tbAuth(String url) { if (StringUtils.isEmpty(url)) return; AlibcTradeUtil.openAuthLink(mContext, url); } /** * 跳转到京东 * * @param url */ @JavascriptInterface public void jumpJD(String url) { if (StringUtils.isEmpty(url)) return; KeplerApiManager.getWebViewService().openAppWebViewPage(mContext, url, new KeplerAttachParameter(), new OpenAppAction() { @Override public void onStatus(final int status, final String url) { mContext.runOnUiThread(new Runnable() { @Override public void run() { if (status == OpenAppAction.OpenAppAction_result_APP) { //呼京东成功 Log.e("mResult", "呼京东成功"); } else if (status == OpenAppAction.OpenAppAction_start) { //开始状态未必一定执行, Log.e("mResult", "开始呼起京东"); } else { //唤起京东失败 Log.e("mResult", "唤起京东失败" + status); Intent intent = new Intent(mContext, ShareBrowserActivity.class); intent.putExtra("url", url); mContext.startActivity(intent); } } }); } }); } int type; String imgurl; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1001) { Bitmap bitmap = msg.getData().getParcelable("bitmap"); shareImg(type, "", "", bitmap); } } }; private Handler shareHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); ArrayList uriList = new ArrayList(); if (shareTempImgEntity != null) for (ShareImageEntity entity : shareTempImgEntity) uriList.add(Tools.getImageContentUri(mContext, new File(entity.getFilePath()))); switch (msg.what) { case 1://微信 ShareImageUtil.shareWXPictureByIntent(mContext, uriList); break; case 2://朋友圈 ShareImageUtil.shareWXCirclePictureByIntent(mContext, uriList); break; case 3://QQ ShareImageUtil.shareQQPictureByIntent(mContext, uriList); break; case 4://QQ空间 ShareImageUtil.shareQQZonePictureByIntent(mContext, uriList); break; case 5://微博 ShareImageUtil.shareSinaPictureByIntent(mContext, uriList); break; case 6://更多 Intent mulIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); mulIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); mulIntent.setType("image/png"); mContext.startActivity(Intent.createChooser(mulIntent, "多图文件分享")); break; } } }; private ArrayList shareTempImgEntity; /** * 下载图片 * * @param urlList * @param platform * @param type 1-分享 2-下载 * @throws Exception */ private void startDownLoadImages(List urlList, final int platform, final int type) throws Exception { String path = null; if (type == 1) { path = Environment.getExternalStorageDirectory() + "/rebateshare"; } else if (type == 2) { path = com.wpc.library.util.Environment.getExternalStorageDirectory() + "/tejiaapp"; } final File storageDir = new File(path); List filePathList = new ArrayList<>(); for (String picture : urlList) { String fileName = storageDir.getPath() + "/" + System.currentTimeMillis() + "_" + (long) (Math.random() * 10000000000L) + ".png"; filePathList.add(fileName); } if (urlList.size() > 0) { showLoading(); shareTempImgEntity = new ArrayList<>(); //去下载 new DownLoadFile().downloadMultiImages(urlList, filePathList, mContext, new DownLoadFile.FileDownLoadListener() { @Override public void finish(List fileList) { hideLoading(); //完成下载 if (fileList != null) for (File f : fileList) { shareTempImgEntity.add(new ShareImageEntity(f.getPath())); } //下载成功 if (type == 1) shareHandler.sendEmptyMessage(platform); else { final String[] filePaths = new String[fileList.size()]; for (int i = 0; i < filePaths.length; i++) filePaths[i] = fileList.get(i).getPath(); shareHandler.post(new Runnable() { @Override public void run() { MediaScannerConnection.scanFile(mContext, filePaths, null, null); Toast.makeText(mContext, "保存到相册成功", Toast.LENGTH_SHORT).show(); } }); } } @Override public void process(int count) { } }); } else { hideLoading(); if (type == 1) shareHandler.sendEmptyMessage(platform); else { shareHandler.post(new Runnable() { @Override public void run() { Toast.makeText(mContext, "保存到相册成功", Toast.LENGTH_SHORT).show(); } }); } } } /*******分享图片**/ private void shareImg(final int platfrom, final String title, final String message, final Bitmap bitmap) { if (bitmap == null) return; int wchatAvilibleValue = Tools.isWeixinAvilible(mContext); int qqAvilibleValue = Tools.isQQAvilible(mContext); int sinaAvilibleValue = Tools.isSinaAvilible(mContext); if (((platfrom == 1 || platfrom == 2) && (wchatAvilibleValue == 1 || wchatAvilibleValue == 2)) || (platfrom == 3 && (qqAvilibleValue == 1 || qqAvilibleValue == 2)) || (platfrom == 5 && (sinaAvilibleValue == 1 || sinaAvilibleValue == 2))) { mContext.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(mContext, "未检测到第三方应用", Toast.LENGTH_SHORT).show(); } }); } else { String path = Environment.getExternalStorageDirectory() + "/rebateshare"; File storageDir = new File(path); if (storageDir.isDirectory()) { try { File files[] = storageDir.listFiles(); for (int i = 0; i < files.length; i++) { // deleteFolderFile(files[i].getAbsolutePath()); files[i].delete(); } if (!storageDir.isDirectory()) { storageDir.delete(); } else { if (storageDir.listFiles().length == 0) { storageDir.delete(); } } } catch (Exception e) { e.printStackTrace(); } } // files.clear(); final Thread thread = new Thread(new Runnable() { @Override public void run() { File file = Tools.saveBitmap(mContext, bitmap); ArrayList imageList = new ArrayList<>(); imageList.add(new ShareImageEntity(file.getPath())); ArrayList uriList = new ArrayList(); if (imageList != null) for (ShareImageEntity entity : imageList) uriList.add(Tools.getImageContentUri(mContext, new File(entity.getFilePath()))); if (platfrom == 1) { ShareImageUtil.shareWXPictureByIntent(mContext, uriList); } else if (platfrom == 2) { ShareImageUtil.shareWXCirclePictureByIntent(mContext, uriList); } else if (platfrom == 3) { ShareImageUtil.shareQQPictureByIntent(mContext, uriList); } else if (platfrom == 4) { ShareImageUtil.shareQQZonePictureByIntent(mContext, uriList); } else { ShareImageUtil.shareSinaPictureByIntent(mContext, uriList); } if (pd != null) pd.dismiss(); } }); thread.start(); } } private Bitmap getNetImage(String url) { // Log.e("mResult", "getNetImage---" + url); URL fileUrl = null; Bitmap bitmap = null; try { fileUrl = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); } if (fileUrl == null) return null; try { HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; } // 判断权限集合 是否授权 false授权 true未授权 public boolean lacksPermissions(String... permissions) { for (String permission : permissions) { if (lacksPermission(permission)) { return true; } } return false; } // 判断是否缺少权限 private boolean lacksPermission(String permission) { //权限未授权 return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED; } private WebInterface webShareDesc; //定义 public void setWebShareDesc(WebInterface WebShareDesc) { this.webShareDesc = WebShareDesc; } private GeneralBackCallback generalBackCallback; //定义 分享图片接口 检查权限传入网页调用type url参数 public void setGeneralBackCallback(GeneralBackCallback messageCallback) { this.generalBackCallback = messageCallback; } @Override public int getPermissionsRequestCode() { return 1001; } /** * 请求权限 * * @return */ @Override public String[] getPermissions() { return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; } /** * 权限请求成功 */ @Override public void requestPermissionsSuccess() { } /** * 权限请求失败 */ @Override public void requestPermissionsFail() { // Toast.makeText(this, "你以拒绝权限", Toast.LENGTH_SHORT).show(); } }