package com.casic.smartwellapp; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.net.http.SslError; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.webkit.JavascriptInterface; import android.webkit.SslErrorHandler; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.casic.smartwellapp.Entity.DeviceData; import com.casic.smartwellapp.Entity.LoginReturn; import com.google.gson.Gson; import com.telecomyt.oauthlogin.bean.JiAnBaoCheckResult; import com.telecomyt.oauthlogin.http.HttpCallback; import com.telecomyt.oauthlogin.http.HttpOauthCheckUtil; import java.lang.reflect.Method; import java.util.List; import static com.telecomyt.oauthlogin.config.Config.LOG_TAG; public class MainActivity extends AppCompatActivity { private WebView webview; private String token;// token private String ip; //ip private String imei; //imei private String yys; //运营商 private LoginReturn userInfoResult = null; //单点登录返回的用户信息 private DeviceData deviceData = null; //给用户返回的数据 private static final String oauth_url = "http://menhu.telecomyt.com.cn:8080/"; //单点登录验证地址 private long exitTime = 0; //点击退出时间 private static final int LOGIN_CODE = 1001; public static final int REQUEST_READ_PHONE_STATE = 1; private String msgId; //推送消息id private String msgContent; //推送消息内容 @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { Intent intent = new Intent("com.telecomyt.portal.OAUTH"); intent.putExtra("appID", "3pb316_oauth"); intent.putExtra("version", "v1"); startActivityForResult(intent, 1001);//REQUEST_CODE:为自己定义的回调的代码标记。 } catch (Exception e) { Toast.makeText(MainActivity.this, "请先安装警务门户", Toast.LENGTH_SHORT).show(); Log.e(LOG_TAG, "请先安装警务门户"); } // imei = getIMEI(getApplicationContext()); // imei = getDeviceId(MainActivity.this); imei = obtainSimCardSerialNumber();//20210524 Pengxh修改 // if (getIntent() != null) { //// Intent intent = getIntent(); //// msgId = intent.getStringExtra("id"); //// msgContent = intent.getStringExtra("content"); //// Toast.makeText(MainActivity.this,msgContent,Toast.LENGTH_SHORT).show(); //// Log.e("push",msgContent); //// } //webview // 获取控件对象 webview = findViewById(R.id.WV_ID); WebView.setWebContentsDebuggingEnabled(true); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true);//设置webView属性,允许运行js脚本 settings.setDomStorageEnabled(true); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setAppCacheEnabled(true); settings.setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath()); settings.setAllowFileAccess(true);//可访问文件 settings.setDefaultTextEncodingName("UTF-8"); settings.setAllowUniversalAccessFromFileURLs(true); // 设置在当前WebView继续加载网页 webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try { // 处理自定义scheme协议 if (!url.startsWith("http")) { //处理自定义scheme-->androidamap://viewMap?poiname=W00002&lat=39.9055035111111&lng=116.376759027778 Log.e("scheme", "处理自定义scheme-->" + url); // 如果要跳转地图 if (url.startsWith("androidamap:")) { String lat = "", lng = "", pointname = ""; //获取问号后的参数 String params = url.substring(url.indexOf('?')); Log.i("map", params); if (url.contains("?")) { String str = params.substring(1); String[] strs = str.split("&"); for (String s : strs) { String name = s.split("=")[0]; String value = s.split("=")[1]; switch (name) { case "lng": lng = value; break; case "lat": lat = value; break; case "poiname": pointname = value; break; } } } //用原生sdk加载地图 Intent intent = new Intent(MainActivity.this, MapInitActivity.class); intent.putExtra("lng", lng); intent.putExtra("lat", lat); intent.putExtra("pointname", pointname); startActivity(intent); } else if (url.startsWith("tel:")) { final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "未能识别URL!", Toast.LENGTH_SHORT).show(); } return true; } else { view.loadUrl(url);//表示在当前的WebView继续打开网页 return true; } } catch (Exception e) { e.printStackTrace(); } return false; } public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { //handler.cancel(); 默认的处理方式,WebView变成空白页 //接受证书 handler.proceed(); //handleMessage(Message msg); 其他处理 } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); //错误页面 webview.loadUrl("file:///android_asset/error.html"); } }); // 给web提供调用接口 webview.addJavascriptInterface(new WebAppInterface(), "android"); // 加载html文件,欢迎页面 webview.loadUrl("file:///android_asset/hello.html"); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //如果按返回键,此时WebView网页可以后退 if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) { webview.goBack(); return true; } return super.onKeyDown(keyCode, event); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { //单点登录返回 super.onActivityResult(requestCode, resultCode, data); if (resultCode == 100) { //单点登录页面的返回结果 if (requestCode == 1001) { if (data != null) { String result = data.getStringExtra("result"); Log.e(LOG_TAG, "吉安宝验证结果 result === " + result); JiAnBaoCheckResult tokenResult = new Gson().fromJson(result, JiAnBaoCheckResult.class); if (tokenResult != null) { if (tokenResult.isResult()) { token = tokenResult.getSubjectDN(); Log.e(LOG_TAG, "token === " + token); // webview.loadUrl("file:///android_asset/index.html?token="+token); if (!TextUtils.isEmpty(token)) { HttpOauthCheckUtil.getInstance().getUserInfo(oauth_url, token, new HttpCallback() { @Override public void onSuccess(String result) { Toast.makeText(getApplicationContext(), "认证通过,欢迎使用", Toast.LENGTH_SHORT).show(); Log.e(LOG_TAG, "门户验证结果 === " + result); userInfoResult = new Gson().fromJson(result, LoginReturn.class); yys = getYys(getApplicationContext()); String name = userInfoResult.getData().getName(); String identifyCard = userInfoResult.getData().getIdentityCard(); deviceData = new DeviceData(name, identifyCard, yys, imei); Log.i("deviceData", deviceData.toString()); webview.loadUrl("file:///android_asset/index.html"); } @Override public void onFailed(String err) { Log.e(LOG_TAG, "错误信息 === " + err); Toast.makeText(getApplicationContext(), err, Toast.LENGTH_SHORT).show(); } }); } } else { //吉安宝认证失败 Toast.makeText(getApplicationContext(), "吉安宝认证失败", Toast.LENGTH_SHORT).show(); Log.e(LOG_TAG, "吉安宝认证失败 "); } } else { Toast.makeText(getApplicationContext(), "请检查网络", Toast.LENGTH_SHORT).show(); Log.e(LOG_TAG, "请检查网络"); } } } } // if (requestCode == LOGIN_CODE && resultCode == 100) { // resultCode 固定为100 // String result = intent.getStringExtra("result"); // //result为json格式字符串,其中 result: true 为认证成功,false为失败;code: 错误代码 // // TODO:解析result // LoginReturn loginReturn = JSON.parseObject(result, LoginReturn.class); // if(loginReturn.isResult()){//如果result是true // this.token = loginReturn.getSubjectDN();//token // }else{ // // } // Log.i("ActivityResult", "onActivityResult: " + result); // } // super.onActivityResult(requestCode, resultCode, intent); } //我们需要重写回退按钮的时间,当用户点击回退按钮: //1.webView.canGoBack()判断网页是否能后退,可以则goback() //2.如果不可以连续点击两次退出App,否则弹出提示Toast @Override public void onBackPressed() { Log.i("webUrl", "webviewUrl" + webview.getUrl()); if (webview.canGoBack() && !webview.getUrl().endsWith("/#/") && !webview.getUrl().endsWith("/#/login")) { webview.goBack(); } else { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { super.onBackPressed(); } } } class WebAppInterface { @JavascriptInterface public String getUser() { if (deviceData != null) { String json = new Gson().toJson(deviceData); Log.i("JSON:", json); return json; } else { return ""; } } @JavascriptInterface public String getAuth() { // 返回token if (token != null && !token.equals("")) { Toast.makeText(getApplicationContext(), "获取用户权限", Toast.LENGTH_SHORT).show(); return token; } else { return null; } } } //获取运营商 public String getYys(Context context) { List<PackageInfo> pinfo = context.getPackageManager().getInstalledPackages(0); String yys = ""; lint: for (PackageInfo info : pinfo) { switch (info.packageName) { case "com.justsy.mdm": //联通 yys = "lt"; break lint; case "com.pekall.emdm": //电信 yys = "dx"; break lint; default: } } Log.i("yys", "yys:" + yys); // Toast.makeText(context, "运营商:"+yys, Toast.LENGTH_SHORT).show(); return yys; } public String getIMEI(Context context) { TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); @SuppressLint("MissingPermission") String imei = telephonyManager.getDeviceId(); Log.i("imei", "yys:" + imei); Toast.makeText(context, "imei:" + imei, Toast.LENGTH_SHORT).show(); return imei; } @SuppressLint("HardwareIds") public static String getDeviceId(Context context) { String deviceId = ""; TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (null != tm) { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); } else { if (tm.getDeviceId() != null) { deviceId = tm.getDeviceId(); } else { deviceId = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); } } Log.d("deviceId--->", "deviceId:" + deviceId); } return deviceId; } //获取SimSerialNumber @SuppressLint({"HardwareIds"}) public String obtainSimCardSerialNumber() { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //Android 10改为获取Android_ID return Settings.System.getString(getContentResolver(), Settings.Secure.ANDROID_ID); } else { TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Class<?> telephonyClass; try { telephonyClass = Class.forName(telephony.getClass().getName()); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); } //Android 10以下默认获取deviceId,部分手机获取不到deviceId不到的改为获取sim卡串码,如果依旧获取不到,返回"" String imei = telephony.getDeviceId(); if (TextUtils.isEmpty(imei)) { Method m = telephonyClass.getMethod("getSimSerialNumber", int.class); //主卡,卡1 String mainCard = (String) m.invoke(telephony, 0); //副卡,卡2 String otherCard = (String) m.invoke(telephony, 1); return mainCard; } else { return imei; } } catch (Exception e) { e.printStackTrace(); } } return ""; } }