From 768519e14e0ca75b4ff1a2ba6ce78d4f21f39de5 Mon Sep 17 00:00:00 2001 From: fanhuitong <981964879@qq.com> Date: Thu, 21 Oct 2021 10:15:39 +0800 Subject: [PATCH] =?UTF-8?q?version:1.0=20update:2021-10-21=2010:14:40=20fi?= =?UTF-8?q?x:=20add:=E5=A2=9E=E5=8A=A0=E5=BC=80=E6=9C=BA=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=B8=B8=E9=A9=BB?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 14 +- .../aoleyun/sn/activity/CheckNetActivity.java | 124 +++++++++++++----- .../com/aoleyun/sn/activity/HomeActivity.java | 17 ++- .../com/aoleyun/sn/network/HTTPInterface.java | 76 +++++++++++ .../sn/network/NetInterfaceManager.java | 68 ++++++++++ .../com/aoleyun/sn/network/UrlAddress.java | 26 ++-- .../sn/network/api/newapi/GetPublicIPApi.java | 21 +++ .../com/aoleyun/sn/receiver/BootReceiver.java | 4 +- .../com/aoleyun/sn/service/MainService.java | 47 +++++++ .../java/com/aoleyun/sn/utils/MD5Util.java | 112 ++++++++++++++++ .../main/java/com/aoleyun/sn/utils/Utils.java | 34 +++++ app/src/main/res/drawable-hdpi/failed.png | Bin 0 -> 1948 bytes app/src/main/res/drawable-hdpi/successful.png | Bin 0 -> 1968 bytes .../res/layout-land/activity_checknet.xml | 11 +- .../res/layout-port/activity_checknet.xml | 11 +- app/src/main/res/values/styles.xml | 13 ++ settings.gradle | 2 +- 17 files changed, 520 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/com/aoleyun/sn/network/api/newapi/GetPublicIPApi.java create mode 100644 app/src/main/java/com/aoleyun/sn/utils/MD5Util.java create mode 100644 app/src/main/res/drawable-hdpi/failed.png create mode 100644 app/src/main/res/drawable-hdpi/successful.png diff --git a/app/build.gradle b/app/build.gradle index fe6dabd..8686166 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ android { channel_value: "newly", ] /*********************************极光推送end************************************/ - buildConfigField "String", "ROOT_URL", '"http://led.aoleyun.cn/api/"' + buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' buildConfigField "String", "SCREEN_BASE_URL", '"https://led.aoleyun.cn:2018/"' buildConfigField "String", "SCREEN_URL", '"https://led.aoleyun.cn:2018/wm/is_online"' buildConfigField "String", "WebsocketURL", '"wss://led.aoleyun.cn:2018"' @@ -64,7 +64,7 @@ android { channel_value: "newly", ] /*********************************极光推送end************************************/ - buildConfigField "String", "ROOT_URL", '"http://led.aoleyun.cn/api/"' + buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' buildConfigField "String", "SCREEN_BASE_URL", '"https://led.aoleyun.cn:2018/"' buildConfigField "String", "SCREEN_URL", '"https://led.aoleyun.cn:2018/wm/is_online"' buildConfigField "String", "WebsocketURL", '"wss://led.aoleyun.cn:2018"' @@ -84,7 +84,7 @@ android { channel_value: "beta", ] /*********************************极光推送end************************************/ - buildConfigField "String", "ROOT_URL", '"http://led.aoleyun.cn/api/"' + buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' buildConfigField "String", "SCREEN_BASE_URL", '"https://led.aoleyun.cn:2018/"' buildConfigField "String", "SCREEN_URL", '"https://led.aoleyun.cn:2018/wm/is_online"' buildConfigField "String", "WebsocketURL", '"wss://led.aoleyun.cn:2018"' @@ -163,7 +163,7 @@ android { zhanRuiRelease.initWith(release) zhanRuiRelease { manifestPlaceholders = [ - AMAP_KEY: "546eb5646a65ac6a5b7d1c7456466e05" + AMAP_KEY: "6e339305206eeb43f2b4cc1f31751f89" ] buildConfigField "String", "platform", '"ZhanRui"' signingConfig signingConfigs.zhanRui @@ -172,7 +172,7 @@ android { zhanRuiDebug.initWith(debug) zhanRuiDebug { manifestPlaceholders = [ - AMAP_KEY: "546eb5646a65ac6a5b7d1c7456466e05" + AMAP_KEY: "6e339305206eeb43f2b4cc1f31751f89" ] versionNameSuffix "-debug" buildConfigField "String", "platform", '"ZhanRui"' @@ -184,7 +184,7 @@ android { zhanRuiUserdebug.initWith(zhanRuiDebug) zhanRuiUserdebug { manifestPlaceholders = [ - AMAP_KEY: "546eb5646a65ac6a5b7d1c7456466e05" + AMAP_KEY: "6e339305206eeb43f2b4cc1f31751f89" ] versionNameSuffix "-debug" buildConfigField "String", "platform", '"ZhanRui"' @@ -195,7 +195,7 @@ android { zhanRuiUserdebugReleas.initWith(release) zhanRuiUserdebugReleas { manifestPlaceholders = [ - AMAP_KEY: "546eb5646a65ac6a5b7d1c7456466e05" + AMAP_KEY: "6e339305206eeb43f2b4cc1f31751f89" ] buildConfigField "String", "platform", '"ZhanRui"' debuggable true diff --git a/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java b/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java index 770a10d..03e367e 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java @@ -12,6 +12,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; @@ -46,37 +48,63 @@ import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; +import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import pl.droidsonroids.gif.GifImageView; public class CheckNetActivity extends BaseActivity implements MainContact.MainView, NetworkUtils.OnNetworkStatusChangedListener { + @BindView(R.id.giv_1) + GifImageView giv_1; + @BindView(R.id.giv_2) + GifImageView giv_2; + @BindView(R.id.giv_3) + GifImageView giv_3; + @BindView(R.id.tv_1) + TextView tv_1; + @BindView(R.id.tv_2) + TextView tv_2; + @BindView(R.id.tv_3) + TextView tv_3; + private static final String TAG = CheckNetActivity.class.getSimpleName(); private MainPresenter mPresenter; private boolean netWorkIsRunning = false; private boolean updateApp = false; - //jiguang - public static boolean isForeground = false; //for receive customer msg from jpush server - private CheckNetActivity.MessageReceiver mMessageReceiver; + private MessageReceiver mMessageReceiver; public static final String MESSAGE_RECEIVED_ACTION = "com.aoleyun.sn.MESSAGE_RECEIVED_ACTION"; public static final String KEY_TITLE = "title"; public static final String KEY_MESSAGE = "message"; public static final String KEY_EXTRAS = "extras"; - // @Override -// protected void onCreate(Bundle savedInstanceState) { -// super.onCreate(savedInstanceState); -// setContentView(R.layout.activity_checknet); -// } + private static Handler mHandler; + + @Override + public void onDisconnected() { + Log.e("OnNetworkStatusChangedListener", "onDisconnected: "); + } + + @Override + public void onConnected(NetworkUtils.NetworkType networkType) { + Log.e("OnNetworkStatusChangedListener", "onConnected: "); + timeMillis = SystemClock.elapsedRealtime(); + //直接获取数据 + mPresenter.getLockedState(); + } @Override public int getLayoutId() { return R.layout.activity_checknet; } + boolean isAvailable = false; + int runTimes = 0; + @Override public void initView() { ButterKnife.bind(this); @@ -88,8 +116,64 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi mPresenter.getFirstConnect(); NetworkUtils.registerNetworkStatusChangedListener(this); getDevicesInfo(); + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + Resut resut = (Resut) msg.obj; + if (resut.Times == 10) { + if (resut.isAvailable) { + giv_1.setImageResource(R.drawable.successful); + } else { + giv_1.setImageResource(R.drawable.failed); + } + + } + } + }; + checkNetworkIsAvailable(); } + private static class Resut { + int Times; + boolean isAvailable; + } + + private void checkNetworkIsAvailable() { + new Thread(new Runnable() { + @Override + public void run() { + while (!isAvailable && runTimes < 10) { + runTimes++; + Log.e("initView", "run: " + "第" + runTimes + "次检测网络"); + if (NetworkUtils.isAvailable()) { + Resut resut = new Resut(); + resut.Times = runTimes; + resut.isAvailable = true; + Message message = new Message(); + message.obj = resut; + mHandler.sendMessage(message); + } else { + Resut resut = new Resut(); + resut.Times = runTimes; + resut.isAvailable = false; + Message message = new Message(); + message.obj = resut; + mHandler.sendMessage(message); + } + try { + synchronized (this) { + wait(1200); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }).start(); + } + + private void getDevicesInfo() { String sn = Utils.getSerial(); checkSNError(sn); @@ -254,14 +338,7 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi @Override public void buttonCheckUpdateFinished(boolean update, JsonObject jsonObject) { - this.updateApp = !update; - if (update) { - showDialog(jsonObject); - } else { - Observable.timer(5000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> ToastUtil.show("已经是最新版本")); - } + } /** @@ -402,14 +479,12 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi @Override protected void onPause() { - isForeground = false; super.onPause(); } @Override protected void onResume() { super.onResume(); - isForeground = true; } @Override @@ -495,19 +570,6 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); } - @Override - public void onDisconnected() { - Log.e("OnNetworkStatusChangedListener", "onDisconnected: "); - } - - @Override - public void onConnected(NetworkUtils.NetworkType networkType) { - Log.e("OnNetworkStatusChangedListener", "onConnected: "); - timeMillis = SystemClock.elapsedRealtime(); - //直接获取数据 - mPresenter.getLockedState(); - } - public static class MessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/app/src/main/java/com/aoleyun/sn/activity/HomeActivity.java b/app/src/main/java/com/aoleyun/sn/activity/HomeActivity.java index 0def029..1b585e4 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/HomeActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/HomeActivity.java @@ -11,6 +11,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.Settings; +import android.util.Log; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -24,6 +25,7 @@ import com.aoleyun.sn.R; import com.aoleyun.sn.action.JGYActions; import com.aoleyun.sn.base.BaseApplication; import com.aoleyun.sn.comm.PackageNames; +import com.aoleyun.sn.network.HTTPInterface; import com.aoleyun.sn.service.LogcatService; import com.aoleyun.sn.utils.JGYUtils; import com.aoleyun.sn.utils.Logutils; @@ -55,8 +57,8 @@ public class HomeActivity extends AppCompatActivity { initView(); debugTest(); new Handler().postDelayed(() -> { -// startActivity(new Intent(HomeActivity.this, MainActivity.class)); - startActivity(new Intent(HomeActivity.this, CheckNetActivity.class)); + startActivity(new Intent(HomeActivity.this, MainActivity.class)); +// startActivity(new Intent(HomeActivity.this, CheckNetActivity.class)); finish(); }, 2000); } @@ -134,8 +136,15 @@ public class HomeActivity extends AppCompatActivity { Logutils.e(TAG, "debugTest: SPUtils all " + SPUtils.getAll(this)); PackageManager packageManager = getPackageManager(); - packageManager.setApplicationEnabledSetting(PackageNames.OLD_DEVICE_INFO, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); - packageManager.setApplicationEnabledSetting(PackageNames.OLD_APPSTORE, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); +// packageManager.setApplicationEnabledSetting(PackageNames.OLD_DEVICE_INFO, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); +// packageManager.setApplicationEnabledSetting(PackageNames.OLD_APPSTORE, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); + HTTPInterface.getPublicIP(this, new HTTPInterface.PublicIP() { + @Override + public void set(String ip) { + Log.e("getPublicIP", "set: " + ip); + } + }); + Log.e("getLocalIP", "set: " + Utils.getIPAddress(this)); } @SuppressLint("NewApi") diff --git a/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java b/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java index 6e01e55..dcc7914 100644 --- a/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java +++ b/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java @@ -8,11 +8,15 @@ import android.content.pm.PackageManager; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; +import android.util.Log; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.action.JGYActions; +import com.aoleyun.sn.network.api.newapi.GetPublicIPApi; +import com.aoleyun.sn.network.api.newapi.SendScreenStatusApi; import com.arialyy.aria.core.Aria; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -55,6 +59,10 @@ import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.http.GET; import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.ACTION_SET; import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.sequence; @@ -846,4 +854,72 @@ public class HTTPInterface { } }); } + + public interface PublicIP { + void set(String ip); + } + + /** + * 获取设备公网IP + * + * @param context + * @param publicIP + */ + public static void getPublicIP(Context context, PublicIP publicIP) { + Retrofit retrofit = new Retrofit.Builder() + .client(NetInterfaceManager.getInstance().getOkHttpClient()) + .baseUrl(UrlAddress.SHOUHU_CITYJSON) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build(); + GetPublicIPApi getPublicIPApi = retrofit.create(GetPublicIPApi.class); + getPublicIPApi.getJpushTags() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getPublicIP", "onSubscribe: "); + } + + @Override + public void onNext(ResponseBody responseBody) { + try { + String s = responseBody.string(); + Log.e("getPublicIP", "onNext: " + s); + if (!TextUtils.isEmpty(s)) { + //var returnCitySN = {"cip": "183.11.74.141", "cid": "440300", "cname": "广东省深圳市"}; + if (s.contains("{")) { + String jsonString = s.substring(s.indexOf("{"), s.lastIndexOf("}") + 1); + JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject(); + String ip = jsonObject.get("cip").getAsString(); + if (!TextUtils.isEmpty(ip)) { + publicIP.set(ip); + } else { + publicIP.set(""); + } + } else { + publicIP.set(""); + } + } else { + publicIP.set(""); + } + } catch (IOException e) { + e.printStackTrace(); + Log.e("getPublicIP", "IOException: " + e.getMessage()); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getPublicIP", "onError: " + e.getMessage()); + publicIP.set(""); + } + + @Override + public void onComplete() { + Log.e("getPublicIP", "onComplete: "); + } + }); + } } \ No newline at end of file diff --git a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java index 372b6ad..b838808 100644 --- a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java @@ -2,6 +2,7 @@ package com.aoleyun.sn.network; import android.annotation.SuppressLint; import android.content.Context; +import android.util.Log; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.bean.Appground; @@ -48,10 +49,15 @@ import com.aoleyun.sn.network.api.newapi.SnTimeControlApi; import com.aoleyun.sn.network.api.newapi.StudentsInfosApi; import com.aoleyun.sn.network.api.newapi.TopAppControlApi; import com.aoleyun.sn.network.api.newapi.UpdateDeviceInfoApi; +import com.aoleyun.sn.utils.MD5Util; import com.aoleyun.sn.utils.Utils; +import org.jetbrains.annotations.NotNull; + import java.io.File; +import java.io.IOException; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import cn.jpush.android.api.JPushInterface; @@ -59,7 +65,11 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import okhttp3.Cache; +import okhttp3.Interceptor; import okhttp3.OkHttpClient; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.Response; import okhttp3.ResponseBody; import retrofit2.CallAdapter; import retrofit2.Converter; @@ -73,6 +83,7 @@ public class NetInterfaceManager { private Context mContext; private Retrofit mRetrofit; private OkHttpClient okHttpClient; + private final ConcurrentHashMap requestIdsMap = new ConcurrentHashMap<>(); //超时时间 private static int timeOut = 5; @@ -80,16 +91,73 @@ public class NetInterfaceManager { private static long cacheSize = 1024 * 1024 * 64; public static final String HTTP_KEY = "YTM3YTAxNTJmMmZmNzkyM2E2YzIwZjlhZTc0NzNmMGI="; + public static final String CUSTOM_REPEAT_REQ_PROTOCOL = "MY_CUSTOM_REPEAT_REQ_PROTOCOL"; private NetInterfaceManager(Context context) { this.mContext = context; if (okHttpClient == null) { + Interceptor myHttpInterceptor = new Interceptor() { + @NotNull + @Override + public Response intercept(@NotNull Chain chain) throws IOException { + Request request = chain.request(); + String requestKey = MD5Util.getUpperMD5Str(request.method() + request.url().toString()); + Response response = chain.proceed(request); //准备返回Response +// try { +// response.close(); +// response = chain.proceed(request); +// } catch (Exception e) { +// Log.e(TAG, "intercept: " + e.getMessage()); +// //异常的返回也是完成Http请求。在这里移除请求登记 +// if (!TextUtils.isEmpty(e.toString()) && e.toString().contains(NetInterfaceManager.CUSTOM_REPEAT_REQ_PROTOCOL)) { +// Log.e("REPEAT-REQUEST", "移除请求1:" + requestKey + " --- " + Thread.currentThread().getName() + " URL = " + request.url()); +// } else { +// requestIdsMap.remove(requestKey); +// } +// throw e; +// } + synchronized (requestIdsMap) { + requestIdsMap.remove(requestKey); //在这里移除正常的请求登记 + Log.e("REPEAT-REQUEST", "移除请求2:" + requestKey + " --- " + Thread.currentThread().getName() + " URL = " + request.url()); + } + return response; + } + }; + Interceptor mRequestInterceptor = new Interceptor() { + @NotNull + @Override + public Response intercept(@NotNull Chain chain) throws IOException { + Request request = chain.request(); + //拦截处理重复的HTTP 请求,类似 防止快速点击按钮去重 可以不去处理了,全局统一处理 + String requestKey = MD5Util.getUpperMD5Str(request.method() + request.url().toString()); + synchronized (requestIdsMap) { + if (requestIdsMap.get(requestKey) == null) { +// Log.e("REPEAT-REQUEST", "intercept: " + requestIdsMap); + requestIdsMap.put(requestKey, System.currentTimeMillis()); + Log.e("REPEAT-REQUEST", "注册请求:" + requestKey + " --- " + Thread.currentThread().getName() + " URL = " + request.url()); + } else { + //如果是重复的请求,抛出一个自定义的错误,这个错误大家根据自己的业务定义吧 + Log.e("REPEAT-REQUEST", "重复请求:" + requestKey + " --- " + Thread.currentThread().getName() + " URL = " + request.url()); + return new Response.Builder() + .protocol(Protocol.get(CUSTOM_REPEAT_REQ_PROTOCOL)) + .request(request) //multi thread + .build(); + } + } + Response originalResponse = chain.proceed(request); + return originalResponse.newBuilder().build(); + } + }; + //如果无法生存缓存文件目录,检测权限使用已经加上,检测手机是否把文件读写权限禁止了 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(timeOut, TimeUnit.SECONDS); // 设置连接超时时间 builder.writeTimeout(timeOut, TimeUnit.SECONDS);// 设置写入超时时间 builder.readTimeout(timeOut, TimeUnit.SECONDS);// 设置读取数据超时时间 builder.retryOnConnectionFailure(true);// 设置进行连接失败重试 + builder.addInterceptor(myHttpInterceptor); + builder.addNetworkInterceptor(mRequestInterceptor); + // 设置缓存文件路径 String cacheDirectory = mContext.getExternalCacheDir().getAbsolutePath() + "/OkHttpCache"; Cache cache = new Cache(new File(cacheDirectory), cacheSize); diff --git a/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java b/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java index 81d860f..8995fd5 100644 --- a/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java +++ b/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java @@ -42,7 +42,7 @@ public class UrlAddress { //获取隐藏桌面图标 public static final String GET_HIDE_DESKTOPICON = "Icon"; //获取应用升级自启 - public final static String NET_AND_LAUNCH_API = "automatic/get"; + public static final String NET_AND_LAUNCH_API = "automatic/get"; //通过sn获取信息 public static final String GET_STUDENTS_INFO = "Sn/getStudent"; //上传截图 @@ -50,28 +50,30 @@ public class UrlAddress { //上传我的设备 //public static final String UPDATE_DEVICEINFO = "Mac/getInfo"; //获取霸屏状态 - public final static String GET_LOCK_SCREEN_STATE = "Sn/getSnScreen"; + public static final String GET_LOCK_SCREEN_STATE = "Sn/getSnScreen"; //获取默认桌面升级 - public final static String GET_DESKTOP = "Sn/getSnDesktop"; + public static final String GET_DESKTOP = "Sn/getSnDesktop"; //获取时间管控 - public final static String GET_SN_TIME_CONTROL = "Sn/getSnTimeControl"; + public static final String GET_SN_TIME_CONTROL = "Sn/getSnTimeControl"; //获取顶部app管控 - public final static String GET_TOP_APP_CONTROL = "Sn/getSnAppControl"; + public static final String GET_TOP_APP_CONTROL = "Sn/getSnAppControl"; //获取测试app - public final static String GET_SN_APP_TEST = "Sn/getSnAppTest"; + public static final String GET_SN_APP_TEST = "Sn/getSnAppTest"; //开机动画 - public final static String GET_LOGO_IMG = "Sn/getLogoImg"; + public static final String GET_LOGO_IMG = "Sn/getLogoImg"; //开发人员选项开关 - public final static String GET_DEVELOPER = "Sn/getDeveloper"; + public static final String GET_DEVELOPER = "Sn/getDeveloper"; //通过固件名获取内置应用 - public final static String GET_ROM_APP = "And/getFirmwareApp"; + public static final String GET_ROM_APP = "And/getFirmwareApp"; //获取全部应用 - public final static String GET_ALL_APP = "recommend/index"; + public static final String GET_ALL_APP = "recommend/index"; //获取电子书包激活码 - public final static String GET_EBAG_CODE = "And/getEbagCode"; + public static final String GET_EBAG_CODE = "And/getEbagCode"; //获取系统默认程序 - public final static String GET_DEFAULT_APP = "app/getDefaultApp"; + public static final String GET_DEFAULT_APP = "app/getDefaultApp"; + //获取公网IP + public static final String SHOUHU_CITYJSON = "http://pv.sohu.com/cityjson/"; //删除alias public static final String DELETE_JPUSH_ALIAS = "https://device.jpush.cn/v3/aliases/"; //删除tags diff --git a/app/src/main/java/com/aoleyun/sn/network/api/newapi/GetPublicIPApi.java b/app/src/main/java/com/aoleyun/sn/network/api/newapi/GetPublicIPApi.java new file mode 100644 index 0000000..832f098 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/network/api/newapi/GetPublicIPApi.java @@ -0,0 +1,21 @@ +package com.aoleyun.sn.network.api.newapi; + +import com.aoleyun.sn.bean.BaseResponse; +import com.aoleyun.sn.network.UrlAddress; + +import io.reactivex.Observable; +import okhttp3.ResponseBody; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * @author : fanhuitong + * e-mail : + * @date : 2021/10/1814:39 + * desc : + * version: 1.0 + */ +public interface GetPublicIPApi { + @GET(UrlAddress.SHOUHU_CITYJSON) + Observable getJpushTags(); +} diff --git a/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java b/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java index 8b39412..a9e4cdc 100644 --- a/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java +++ b/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.os.SystemClock; import android.util.Log; +import com.aoleyun.sn.activity.CheckNetActivity; import com.aoleyun.sn.service.MainService; import com.aoleyun.sn.utils.BootManager; import com.aoleyun.sn.utils.JGYUtils; @@ -48,7 +49,7 @@ public class BootReceiver extends BroadcastReceiver { @Override public void onError(Throwable e) { - Log.e("getLockedState", "onError: "+e.getMessage()); + Log.e("getLockedState", "onError: " + e.getMessage()); } @Override @@ -72,6 +73,7 @@ public class BootReceiver extends BroadcastReceiver { default: break; case Intent.ACTION_BOOT_COMPLETED: + context.startActivity(new Intent(context, CheckNetActivity.class)); JGYUtils.startServices(context); new BootManager(context).start(); break; diff --git a/app/src/main/java/com/aoleyun/sn/service/MainService.java b/app/src/main/java/com/aoleyun/sn/service/MainService.java index 9611a7e..c90c87a 100644 --- a/app/src/main/java/com/aoleyun/sn/service/MainService.java +++ b/app/src/main/java/com/aoleyun/sn/service/MainService.java @@ -1,6 +1,10 @@ package com.aoleyun.sn.service; import android.annotation.SuppressLint; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -8,8 +12,10 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.PixelFormat; +import android.net.Uri; import android.os.Build; import android.os.IBinder; import android.os.SystemClock; @@ -23,6 +29,10 @@ import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aoleyun.sn.comm.PackageNames; @@ -173,6 +183,8 @@ public class MainService extends Service implements MainContact.MainView, Networ //发送设备mac地址和信息 mPresenter.sendMACAddress(); setFloatingWindow(this); + createNotificationChannel(); + sendSimpleNotification(); } @Override @@ -215,6 +227,41 @@ public class MainService extends Service implements MainContact.MainView, Networ return START_STICKY; } + private void createNotificationChannel() { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = channel_name; + String description = channel_description; + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); + channel.setDescription(description); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + } + + private static final String CHANNEL_ID = "CHANNEL_ID"; + private static final String channel_name = "系统通知"; + private static final String channel_description = "我的设备系统通知"; + + private void sendSimpleNotification() { + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "CHANNEL_ID") + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("设备管控中") +// .setContentText("测试内容") + .setAutoCancel(false) + .setShowWhen(false) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_MAX); + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); + // notificationId is a unique int for each notification that you must define + notificationManager.notify(1, builder.build()); + + } + private void addShortcut() { ApkUtils.addShortcut(MainService.this); } diff --git a/app/src/main/java/com/aoleyun/sn/utils/MD5Util.java b/app/src/main/java/com/aoleyun/sn/utils/MD5Util.java new file mode 100644 index 0000000..a4809df --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/utils/MD5Util.java @@ -0,0 +1,112 @@ +package com.aoleyun.sn.utils; + +import android.annotation.SuppressLint; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5Util { + + public static String packetMD5(String str) { + MessageDigest messageDigest = null; + try { + messageDigest = MessageDigest.getInstance("MD5"); + + messageDigest.reset(); + + messageDigest.update(str.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException e) { + System.out.println("NoSuchAlgorithmException caught!"); + System.exit(-1); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + byte[] byteArray = messageDigest.digest(); + + StringBuffer md5StrBuff = new StringBuffer(); + + for (int i = 0; i < byteArray.length; i++) { + if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) + md5StrBuff.append("0").append( + Integer.toHexString(0xFF & byteArray[i])); + else + md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); + } + + return md5StrBuff.toString(); + } + + @SuppressLint("DefaultLocale") + public static String getUpperMD5Str(String str) { + MessageDigest messageDigest = null; + + try { + messageDigest = MessageDigest.getInstance("MD5"); + + messageDigest.reset(); + + messageDigest.update(str.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException e) { + System.out.println("NoSuchAlgorithmException caught!"); + System.exit(-1); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + byte[] byteArray = messageDigest.digest(); + + StringBuffer md5StrBuff = new StringBuffer(); + + for (int i = 0; i < byteArray.length; i++) { + if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) + md5StrBuff.append("0").append( + Integer.toHexString(0xFF & byteArray[i])); + else + md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); + } + + return md5StrBuff.toString().toUpperCase(); + } + + + /** + * 获取16位的MD5 值得 + * + * @param str + * @return + */ + @SuppressLint("DefaultLocale") + public static String getUpperMD5Str16(String str) { + MessageDigest messageDigest = null; + + try { + messageDigest = MessageDigest.getInstance("MD5"); + + messageDigest.reset(); + + messageDigest.update(str.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException e) { + System.out.println("NoSuchAlgorithmException caught!"); + System.exit(-1); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + byte[] byteArray = messageDigest.digest(); + + StringBuffer md5StrBuff = new StringBuffer(); + + for (int i = 0; i < byteArray.length; i++) { + if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) + md5StrBuff.append("0").append( + Integer.toHexString(0xFF & byteArray[i])); + else + md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); + } + + return md5StrBuff.toString().toUpperCase().substring(8, 24); + } + +} diff --git a/app/src/main/java/com/aoleyun/sn/utils/Utils.java b/app/src/main/java/com/aoleyun/sn/utils/Utils.java index 83ab965..95f8f38 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/Utils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/Utils.java @@ -72,6 +72,8 @@ import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.Reader; import java.lang.reflect.Method; +import java.net.Inet4Address; +import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.security.MessageDigest; @@ -83,6 +85,7 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -1507,5 +1510,36 @@ public class Utils { } } + /** + * 获取本机IP + * + * @param context + * @return + */ + public static String getIPAddress(Context context) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//获取系统的连接服务 + NetworkInfo mActiveNetInfo = mConnectivityManager.getActiveNetworkInfo();//获取网络连接的信息 + NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); + if (info != null && info.isConnected()) { + if ((info.getType() == ConnectivityManager.TYPE_MOBILE) || (info.getType() == ConnectivityManager.TYPE_WIFI)) {//当前使用2G/3G/4G网络 + try { + for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { + NetworkInterface intf = en.nextElement(); + for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { + InetAddress inetAddress = enumIpAddr.nextElement(); + if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { + return inetAddress.getHostAddress(); + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + } + } else { //当前无网络连接,请在设置中打开网络 + return "网络未连接"; + } + return "获取失败"; + } } diff --git a/app/src/main/res/drawable-hdpi/failed.png b/app/src/main/res/drawable-hdpi/failed.png new file mode 100644 index 0000000000000000000000000000000000000000..30c52e1218804c8d13f354a03346fe5d4239ea1f GIT binary patch literal 1948 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-land/activity_checknet.xml b/app/src/main/res/layout-land/activity_checknet.xml index a57a206..7bedb56 100644 --- a/app/src/main/res/layout-land/activity_checknet.xml +++ b/app/src/main/res/layout-land/activity_checknet.xml @@ -17,7 +17,7 @@ app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toBottomOf="@+id/tv_title">