Newer
Older
smartwellapp / app / src / main / java / com / casic / smartwellapp / MainActivity.java
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 "";
    }
}