From 7164c94e186df01c6bc735e099a5b9ce38d2054c Mon Sep 17 00:00:00 2001
From: Administrator <981964879@qq.com>
Date: Fri, 10 Jan 2020 20:22:04 +0800
Subject: [PATCH] =?UTF-8?q?update:2020.01.10=2020:21=20fix:=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9=E5=AE=89=E8=A3=85=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E7=8A=B6=E6=80=81=E6=A0=8F=E9=80=BB=E8=BE=91=20add:?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 6 +-
app/src/main/AndroidManifest.xml | 5 +-
.../com/mjsheng/myappstore/MyApplication.java | 62 ++++
.../myappstore/activity/MainActivity.java | 274 +++++++++++++-----
.../com/mjsheng/myappstore/bean/FileData.java | 29 ++
.../myappstore/network/HTTPInterface.java | 38 ++-
.../myappstore/receiver/MyJPushReceiver.java | 61 ++--
.../myappstore/receiver/NewAppReceiver.java | 37 +--
.../myappstore/server/GuardService.java | 21 +-
.../myappstore/server/InitJpushServer.java | 157 ++++++++--
.../myappstore/server/MyDownloadService.java | 34 +--
.../myappstore/server/StepService.java | 20 ++
.../mjsheng/myappstore/utils/ApkUtils.java | 157 ++++------
.../mjsheng/myappstore/utils/Configure.java | 4 +
.../com/mjsheng/myappstore/utils/Utils.java | 22 +-
.../drawable-v24/ic_launcher_foreground.xml | 34 ---
.../res/drawable/ic_launcher_background.xml | 170 -----------
.../main/res/layout-land/activity_main.xml | 13 +-
.../main/res/layout-port/activity_main.xml | 10 +-
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 -
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 -
app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 13865 -> 5129 bytes
.../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 0 bytes
app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 13865 -> 5129 bytes
.../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 0 bytes
app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 13865 -> 5129 bytes
.../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 0 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 13865 -> 5129 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 0 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 13865 -> 5129 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 0 bytes
app/src/main/res/values/strings.xml | 2 +-
32 files changed, 645 insertions(+), 521 deletions(-)
create mode 100644 app/src/main/java/com/mjsheng/myappstore/bean/FileData.java
delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml
delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml
delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png
delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png
delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
diff --git a/app/build.gradle b/app/build.gradle
index 76be20b..5447c4c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
def appName() {
- return "应用市场"
+ return "设备信息"
}
def releaseTime() {
@@ -16,8 +16,8 @@ android {
targetSdkVersion 26
// versionCode 85
// versionName "2.0.4.6"//正式jiaoguanyi.com
- versionCode 86
- versionName "2.4.8"//测试jiaoguanyi.cn
+ versionCode 93
+ versionName "2.5.5"//测试jiaoguanyi.cn
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
packagingOptions {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bca35f8..9876aeb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,7 +29,6 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
@@ -158,7 +157,9 @@
android:value="20f70bbeb78bad23eddd08d0" />
-
+
fileList = new ArrayList<>();
+
+
+ static String packageName = "";
+
+ public void setInstallIngPackageName(String packageNames) {
+ packageName = packageNames;
+ Log.e("fht", "正在安装:" + packageNames);
+ }
+
+ public String getInstallIngPackageName() {
+ return packageName;
+ }
+
+ public void addFileData(FileData data) {
+ fileList.add(data);
+ updateList();
+ }
+
+ public void removeDate(String packageName) {
+ if (fileList != null && fileList.size() > 0) {
+ for (FileData data : fileList) {
+ if (data.getPackageName().equals(packageName)) {
+ fileList.remove(data);
+ break;
+ } else {
+ Log.e("fht", "not found object");
+ }
+ }
+ }
+ setInstallIngPackageName("");
+ if (fileList.size() > 0) {
+ updateList();
+ } else {
+ Log.e("fht", "fileList为空");
+ setInstallIngPackageName("");
+ }
+
+ }
+
+ public void updateList() {
+ if (getInstallIngPackageName().equals("") || ApkUtils.isAvailable(getAppContext(), packageName)) {
+ if (fileList != null && fileList.size() > 0) {
+ if (!fileList.get(0).getPackageName().equals("") || ApkUtils.isAvailable(getAppContext(), fileList.get(0).getPackageName())) {
+ String s = packageName;
+ ApkUtils.installApp(this, fileList.get(0).getFilePath());
+ setInstallIngPackageName(fileList.get(0).getPackageName());
+ } else {
+ removeDate(fileList.get(0).getPackageName());
+ Log.e("fht", "已安装");
+ setInstallIngPackageName("");
+ }
+ } else {
+ Log.e("fht", "任务为空");
+ }
+ } else {
+ Log.e("fht", "安装中:" + packageName);
+
+ }
+ }
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java b/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java
index e1dd8c5..4788544 100644
--- a/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java
+++ b/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java
@@ -8,6 +8,7 @@ import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.BatteryManager;
@@ -37,13 +38,19 @@ import com.hjq.permissions.OnPermission;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.lzy.okgo.OkGo;
+import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
import com.mjsheng.myappstore.BuildConfig;
import com.mjsheng.myappstore.R;
+import com.mjsheng.myappstore.bean.AppDateInfo;
+import com.mjsheng.myappstore.bean.CommonPicBean;
+import com.mjsheng.myappstore.bean.CommonPicData;
import com.mjsheng.myappstore.bean.ForceDownloadBean;
import com.mjsheng.myappstore.bean.ForceDownloadData;
+import com.mjsheng.myappstore.bean.JsonCallback;
+import com.mjsheng.myappstore.bean.LzyResponse;
import com.mjsheng.myappstore.bean.NetAndLaunchBean;
import com.mjsheng.myappstore.bean.NetAndLaunchData;
import com.mjsheng.myappstore.bean.UploadAppInfo;
@@ -52,6 +59,7 @@ import com.mjsheng.myappstore.comm.CommonDatas;
import com.mjsheng.myappstore.network.HTTPInterface;
import com.mjsheng.myappstore.network.Network;
import com.mjsheng.myappstore.network.api.AppLimitApi;
+import com.mjsheng.myappstore.network.api.BrankPicApi;
import com.mjsheng.myappstore.network.api.DeselectBrowserIDApi;
import com.mjsheng.myappstore.network.api.DeselectIDApi;
import com.mjsheng.myappstore.network.api.ForceDownloadApi;
@@ -70,6 +78,7 @@ import com.mjsheng.myappstore.utils.update.AllDialogShowStrategy;
import com.mjsheng.myappstore.utils.update.NotificationDownloadCreator;
import com.mjsheng.myappstore.utils.update.OkhttpCheckWorker;
import com.mjsheng.myappstore.utils.update.ToastCallback;
+import com.mjsheng.myappstore.utils.update.ToastTool;
import com.tianma.netdetector.lib.NetStateChangeObserver;
import com.tianma.netdetector.lib.NetworkType;
@@ -79,6 +88,7 @@ import org.lzh.framework.updatepluginlib.UpdateBuilder;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -106,7 +116,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
private DownloadManager downloadManager;
public static boolean isForeground = false;
private ImageView imageView;
- private TextView tv_devsn, tv_devmac, tv_version;
+ private TextView tv_devsn, tv_devmac, tv_version;
private int DeviceInfo;
@Override
@@ -143,7 +153,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
// }
requestPermission();
registerMessageReceiver(); // used for receive msg
- HTTPInterface.checkDevicesInfo(handler);
+// HTTPInterface.checkDevicesInfo(handler);
startService(new Intent(MainActivity.this, MyDownloadService.class));
Aria.get(this).getDownloadConfig().setMaxTaskNum(1);
@@ -162,7 +172,6 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
allIntent.setAction(Utils.DOWNLOAD_ALLTASK_ACTION);
sendBroadcast(allIntent);
-
}
@@ -172,18 +181,19 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
.params("sn", Utils.getSerial())
.params("mac", com.blankj.utilcode.util.DeviceUtils.getMacAddress())
.params("jpush_id", rid)
+ .params("appstore_version", Utils.getProperty("ro.custom.build.version","获取失败"))
+ .params("store_version", BuildConfig.VERSION_NAME)
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
com.alibaba.fastjson.JSONObject msgObject = JSON.parseObject(s);
- int code = msgObject.getInteger("code");
- Log.e("sendMACaddress", msgObject.getString("msg"));
+ Log.e("fht", "sendMACaddress onSuccess"+s);
}
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
- Log.e("sendMACaddress", e.getMessage());
+ Log.e("fht", "sendMACaddress onError:"+e.getMessage());
}
});
@@ -195,9 +205,9 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
private void initView() {
imageView = findViewById(R.id.imageView);
tv_devsn = findViewById(R.id.tv_devsn);
- tv_devsn.setText("设备SN:" + Utils.getSerial());
+ tv_devsn.setText("设备SN\t\t" + Utils.getSerial());
tv_devmac = findViewById(R.id.tv_devmac);
- tv_devmac.setText("设备MAC:" + com.blankj.utilcode.util.DeviceUtils.getMacAddress());
+ tv_devmac.setText("MAC地址\t\t" + com.blankj.utilcode.util.DeviceUtils.getMacAddress());
tv_version = findViewById(R.id.version);
tv_version.setText("版本:" + BuildConfig.VERSION_NAME);
}
@@ -206,6 +216,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
Log.e("mjhsneg", "gagagag--------------------------" + Utils.getSerial());
getLockedState();
initJpush();//初始化极光推送
+ setJpushTags();
// update();//接口更新app
sendMACaddress();
@@ -231,52 +242,6 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
}
- private String getGrade(String grade) {
- String s;
- switch (grade) {
- case "1":
- s = "一年级";
- break;
- case "2":
- s = "二年级";
- break;
- case "3":
- s = "三年级";
- break;
- case "4":
- s = "四年级";
- break;
- case "5":
- s = "五年级";
- break;
- case "6":
- s = "六年级";
- break;
- case "7":
- s = "初一";
- break;
- case "8":
- s = "初二";
- break;
- case "9":
- s = "初三";
- break;
- case "10":
- s = "高一";
- break;
- case "11":
- s = "高二";
- break;
- case "12":
- s = "高三";
- break;
- default:
- s = "一年级";
- break;
- }
- return s;
- }
-
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -441,6 +406,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
Aria.download(this).resumeAllTask();
getForceDownload();//强制下载apk
resetDevice();//恢复出厂设置
+ checkUpdate();//更新app
// fromNetToUpdate();
String registrationID = JPushInterface.getRegistrationID(MainActivity.this);
Log.e("mjsheng", registrationID + "------------------------");
@@ -462,6 +428,49 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
}
}
+ private void checkUpdate() {
+ HTTPInterface.checkUpdate(mHandler, "com.jiaoguanyi.store");
+ }
+
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what) {
+ case 200:
+ com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) msg.obj;
+ installAPK(jsonObject);
+ break;
+ case -200:
+ Log.e("fht", "no update");
+ }
+ }
+
+ };
+
+ private void installAPK(com.alibaba.fastjson.JSONObject jsonObject) {
+ String url = jsonObject.getString("url");
+ int versionCode = jsonObject.getInteger("version_code");
+ String packageName = jsonObject.getString("package");
+ PackageManager pm = getPackageManager();
+ PackageInfo packageInfo = null;
+ try {
+ packageInfo = pm.getPackageInfo(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ if (packageInfo == null || packageInfo.versionCode != versionCode) {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString(packageName) + ".apk", true)
+ .setExtendField(packageName)
+ .start(); //启动下载}
+ } else {
+ Log.e("fht", "无需更新");
+ }
+
+ }
+
private int getBatteryLevel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
@@ -488,8 +497,93 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
Intent allIntent = new Intent();
allIntent.setAction(Utils.DOWNLOAD_ALLTASK_ACTION);
sendBroadcast(allIntent);
+ loadHeadImg(Configure.HTTP_TAG_HOME_PAGE_URL);
+
+
+ lazyLoading();
+
}
+ private void loadHeadImg(String URL) {
+ BrankPicApi brankPicApi = Network.getBrankPicApi();
+ brankPicApi.getBrankPicApi(Configure.HTTP_KEY, Utils.getSerial(), "1")
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(CommonPicBean projectPicBean) {
+ paraData(projectPicBean);
+ Log.e("mjsheng", "brankPicApi---" + projectPicBean.toString());
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.showToast(getApplicationContext(), "网络出错!");
+ Log.e("mjsheng", "brankPicApi---error----" + e.getMessage());
+
+ }
+
+ @Override
+ public void onComplete() {
+
+ }
+ });
+
+
+ }
+
+ private void paraData(CommonPicBean categoryPicBean) {
+ int code = categoryPicBean.getCode();
+ switch (code) {
+ case 200:
+ final List data = categoryPicBean.getData();
+// if (data != null && data.size() > 0) {
+// List list = new ArrayList<>();
+// for (int i = 0; i < data.size(); i++) {
+// list.add(data.get(i).getImg());
+// }
+// webBannerAdapter = new WebBannerAdapter(getActivity(), list);
+// webBannerAdapter.setOnBannerItemClickListener(new BannerLayout.OnBannerItemClickListener() {
+// @Override
+// public void onItemClick(int position) {
+// loadProjectByType(Configure.HTTP_TAG_BRAND_DETAILS_URL, data.get(position).getId(), data.get(position).getName());
+// }
+// });
+// recyclerBanner.setAdapter(webBannerAdapter);
+// mAdapter = new TopRecyclerViewAdapter(getActivity(), "home", list, new TopRecyclerViewAdapter.HorizontalScrollViewListener() {
+// @Override
+// public void onClick(String iconUrl, int position) {
+// sound.playSoundEffect();
+// loadProjectByType(Configure.HTTP_TAG_BRAND_DETAILS_URL, data.get(position).getId(), data.get(position).getName());
+// }
+// });
+// mTopRlView.setAdapter(mAdapter);
+// } else {
+// // Utils.showToast(getContext(), "数据为空!");
+// Log.e("mjsheng", "推荐页轮播图为空!");
+// }
+ break;
+ case -200:
+ paraError(categoryPicBean.getMsg());
+ break;
+ }
+ }
+
+ private void paraError(String msg) {
+ switch (msg) {
+ case "没有找到SN码":
+ Utils.showToast(getApplicationContext(), msg);
+ break;
+ default:
+ Utils.showToast(getApplicationContext(), msg);
+ break;
+ }
+ }
@Override
protected void onDestroy() {
@@ -563,6 +657,57 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
});
}
+ private void setJpushTags() {
+ OkGo.get(Configure.GET_DEVICES_TAGS)
+ .params("sn", Utils.getSerial())
+ .execute(new StringCallback() {
+ @Override
+ public void onSuccess(String s, Call call, Response response) {
+ Log.e("fht", s);
+ com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(s);
+ int code = jsonObject.getInteger("code");
+ com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");
+ if (code == 200) {
+ String batch = data.getString("batch");
+ if (batch != null && !batch.equals("")) {
+ Set set = new HashSet();
+ set.add(batch);
+ JPushInterface.setTags(MainActivity.this, set, new TagAliasCallback() {
+ @Override
+ public void gotResult(int i, String s, Set set) {
+ if (set == null) {
+ Log.e("initmjsheng", "set is null");
+ } else {
+ Log.e("initmjsheng", "set ---" + set.toString());
+ }
+ Log.e("JPushInterface", s + "---" + i + "---");
+ if (i == 0) {
+ Log.e("JPushInterface", "Tag绑定成功");
+ } else if (i == 6001) {
+ Log.e("JPushInterface", "无效的设置,用户名为空");
+ } else if (i == 6002) {
+ Log.e("JPushInterface", "设置超时,请重试");
+ timerImitate();
+ } else if (i == 6011) {
+ Log.e("JPushInterface", "短时间内操作过于频繁");
+ } else if (i == 996) {
+ Log.e("JPushInterface", "网络连接断开");
+ timerImitate();
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public void onError(Call call, Response response, Exception e) {
+ super.onError(call, response, e);
+ Log.e("fht", e.getMessage());
+ }
+ });
+ }
+
private void initJpush() {
JPushInterface.setAlias(this, Utils.getSerial(), new TagAliasCallback() {
@@ -600,6 +745,8 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
public void call(Long aLong) {
Log.e("JPushInterface", "JPushInterface重新加载");
initJpush();
+ setJpushTags();
+
}
});
}
@@ -1159,22 +1306,11 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs
//状态栏显示开关
int setting_statusbar = changeNum(data.optInt("setting_statusbar"));
- boolean qch_hide_statusBar = Settings.System.putInt(getContentResolver(), "qch_hide_statusBar", setting_statusbar);
- Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
-
- String statusbarStatus = "";
- switch (setting_statusbar) {
- case 0:
- statusbarStatus = "qch_show_statusBar";
- break;
- case 1:
- statusbarStatus = "qch_hide_statusBar";
- break;
-
+ int oldNum = Settings.System.getInt(mContext.getContentResolver(), "qch_hide_statusBar", 1);
+ if (oldNum != setting_statusbar) {
+ boolean qch_hide_statusBar = Settings.System.putInt(mContext.getContentResolver(), "qch_hide_statusBar", setting_statusbar);
+ Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
}
- Intent statusIntent = new Intent(statusbarStatus);
- sendBroadcast(statusIntent);
-
//摄像头开关
int setting_camera = changeNum(data.optInt("setting_camera"));
Log.e("SystemSetting", "setting_camera---------" + setting_camera);
diff --git a/app/src/main/java/com/mjsheng/myappstore/bean/FileData.java b/app/src/main/java/com/mjsheng/myappstore/bean/FileData.java
new file mode 100644
index 0000000..60c73bd
--- /dev/null
+++ b/app/src/main/java/com/mjsheng/myappstore/bean/FileData.java
@@ -0,0 +1,29 @@
+package com.mjsheng.myappstore.bean;
+
+import java.io.Serializable;
+
+public class FileData implements Serializable {
+ private String filePath;
+ private String packageName;
+
+ public FileData(String f, String p) {
+ this.filePath = f;
+ this.packageName = p;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public void setFilePath(String filePath) {
+ this.filePath = filePath;
+ }
+
+ public String getPackageName() {
+ return packageName;
+ }
+
+ public void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+}
diff --git a/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java b/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java
index 2dfb7f9..fa77764 100644
--- a/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java
+++ b/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java
@@ -11,11 +11,13 @@ import android.util.Log;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.LogUtils;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.mjsheng.myappstore.bean.UserInfo;
+import com.mjsheng.myappstore.utils.Configure;
import com.mjsheng.myappstore.utils.SPUtils;
import com.mjsheng.myappstore.utils.ToastUtil;
import com.mjsheng.myappstore.utils.Utils;
@@ -61,7 +63,6 @@ public class HTTPInterface {
}
-
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
@@ -69,7 +70,7 @@ public class HTTPInterface {
}
-
+
});
}
@@ -109,6 +110,7 @@ public class HTTPInterface {
Log.e("checkDevicesInfo", ex.getMessage());
}
}
+
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
@@ -155,6 +157,7 @@ public class HTTPInterface {
Log.e("checkUpdateByPackage", e.getMessage());
}
}
+
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
@@ -175,7 +178,7 @@ public class HTTPInterface {
int code = object.getInteger("code");
String msg = object.getString("msg");
LogUtils.e("setAppinstallInfo", msg);
- if (code ==200) {
+ if (code == 200) {
} else {
@@ -239,5 +242,34 @@ public class HTTPInterface {
});
}
+ synchronized public static void checkUpdate(final Handler handler, String packageName) {
+
+ OkGo.post(Configure.CHECK_UPDATE)
+ .params("package", packageName)
+ .execute(new StringCallback() {
+ @Override
+ public void onSuccess(String s, Call call, okhttp3.Response response) {
+ JSONObject jsonObject = JSON.parseObject(s);
+ int code = jsonObject.getInteger("code");
+ String msg = jsonObject.getString("msg");
+ Message message = new Message();
+ if (code == 200) {
+ JSONObject jsonArray = JSON.parseObject(jsonObject.getString("data"));
+ message.what = code;
+ message.obj = jsonArray;
+ handler.sendMessage(message);
+ } else if (code == -200) {
+ handler.sendEmptyMessage(-200);
+ }
+ }
+
+ @Override
+ public void onError(Call call, Response response, Exception e) {
+ super.onError(call, response, e);
+ Log.e("onError", e.getMessage());
+
+ }
+ });
+ }
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java
index e576fc4..26300f2 100644
--- a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java
+++ b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java
@@ -74,6 +74,8 @@ public class MyJPushReceiver extends BroadcastReceiver {
private final String GET_APP_USEDTIME = "13";
+ private final String GET_FORCEDOWNLOADURL = "14";
+
private Context mContext;
@@ -111,21 +113,21 @@ public class MyJPushReceiver extends BroadcastReceiver {
boolean qch_usb_choose = Settings.System.putString(mContext.getContentResolver(), "qch_usb_choose", setting_usb);
Log.e("SystemSetting", "qch_usb_choose---------" + setting_usb);
Log.e("SystemSetting", "qch_usb_choose---------" + qch_usb_choose);
- String usbStatus = "";
- switch (setting_usb) {
- case "usb_charge":
- usbStatus = "qch_action_usb_usb_charge";
- break;
- case "usb_mtp":
- usbStatus = "qch_action_usb_usb_mtp";
- break;
- case "usb_midi":
- usbStatus = "qch_action_usb_usb_midi";
- break;
+ String usbStatus = "";
+ switch (setting_usb) {
+ case "usb_charge":
+ usbStatus = "qch_action_usb_usb_charge";
+ break;
+ case "usb_mtp":
+ usbStatus = "qch_action_usb_usb_mtp";
+ break;
+ case "usb_midi":
+ usbStatus = "qch_action_usb_usb_midi";
+ break;
- }
- Intent usbIntent = new Intent(usbStatus);
- mContext.sendBroadcast(usbIntent);
+ }
+ Intent usbIntent = new Intent(usbStatus);
+ mContext.sendBroadcast(usbIntent);
}
int setting_bluetooth = changeNum(data.optInt("setting_bluetooth"));
@@ -156,23 +158,11 @@ public class MyJPushReceiver extends BroadcastReceiver {
//状态栏显示开关
int setting_statusbar = changeNum(data.optInt("setting_statusbar"));
- boolean qch_hide_statusBar = Settings.System.putInt(mContext.getContentResolver(), "qch_hide_statusBar", setting_statusbar);
- Log.e("SystemSetting", "qch_hide_statusBar---------" + setting_statusbar);
- Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
-
- String statusbarStatus = "";
- switch (setting_statusbar) {
- case 0:
- statusbarStatus = "qch_show_statusBar";
- break;
- case 1:
- statusbarStatus = "qch_hide_statusBar";
- break;
-
+ int oldNum = Settings.System.getInt(mContext.getContentResolver(), "qch_hide_statusBar", 1);
+ if (oldNum != setting_statusbar) {
+ boolean qch_hide_statusBar = Settings.System.putInt(mContext.getContentResolver(), "qch_hide_statusBar", setting_statusbar);
+ Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
}
- Intent statusIntent = new Intent(statusbarStatus);
- mContext.sendBroadcast(statusIntent);
-
//摄像头开关
int setting_camera = changeNum(data.optInt("setting_camera"));
Log.e("SystemSetting", "setting_camera---------" + setting_camera);
@@ -512,7 +502,16 @@ public class MyJPushReceiver extends BroadcastReceiver {
String sendType = jsonObject.getString("type");
MyApplication.sendAppUsedTime(random, sendType);
break;
-
+ case GET_FORCEDOWNLOADURL:
+ com.alibaba.fastjson.JSONObject URI = JSON.parseObject(extras);
+ String versionCode = URI.getString("version_code");
+ String url = URI.getString("url");
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.jiaoguanyi.store") + ".apk", true)
+ .setExtendField("com.jiaoguanyi.store")
+ .start(); //启动下载}
+ break;
}
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/receiver/NewAppReceiver.java b/app/src/main/java/com/mjsheng/myappstore/receiver/NewAppReceiver.java
index 98c71ae..7f38ce2 100644
--- a/app/src/main/java/com/mjsheng/myappstore/receiver/NewAppReceiver.java
+++ b/app/src/main/java/com/mjsheng/myappstore/receiver/NewAppReceiver.java
@@ -10,6 +10,7 @@ import android.util.Log;
import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
+import com.mjsheng.myappstore.MyApplication;
import com.mjsheng.myappstore.bean.AppData;
import com.mjsheng.myappstore.bean.UploadAppInfo;
import com.mjsheng.myappstore.network.Network;
@@ -45,24 +46,24 @@ public class NewAppReceiver extends BroadcastReceiver {
allIntent.setAction(Utils.DOWNLOAD_ALLTASK_ACTION);
context.sendBroadcast(allIntent);
String packageName = intent.getDataString().replace("package:", "");
- ApkUtils.removeInfo(packageName);
+ MyApplication.getInstance().removeDate(packageName);
Log.e(TAG, "安装了:" + packageName + "包名的程序");
Log.e("fht", "安装了:" + packageName + "包名的程序");
OkGo.post(Configure.HTTP_TAG_DOWNLOAD_URL)
- .params("key", Configure.HTTP_KEY)
- .params("sn", Utils.getSerial())
- .params("package", packageName)
- .tag(this)
- .execute(new StringCallback() {
- @Override
- public void onSuccess(String s, Call call, Response response) {
+ .params("key", Configure.HTTP_KEY)
+ .params("sn", Utils.getSerial())
+ .params("package", packageName)
+ .tag(this)
+ .execute(new StringCallback() {
+ @Override
+ public void onSuccess(String s, Call call, Response response) {
- }
- });
+ }
+ });
SaveListUtils.getDownLoadList().remove(packageName);//移除下载列表
// ToastTool.show("安装成功");
- if (!packageName.equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !packageName.equals(context.getPackageName())){
- updateUserApp(context,packageName);
+ if (!packageName.equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !packageName.equals(context.getPackageName())) {
+ updateUserApp(context, packageName);
}
// 下载管理服务 删除对应任务
Intent msgIntent = new Intent(Utils.DOWNLOAD_DELETE_PACKAGENAME_ACTION);
@@ -70,9 +71,9 @@ public class NewAppReceiver extends BroadcastReceiver {
context.sendBroadcast(msgIntent);
Intent intent1 = new Intent();
- if (action.equals(Intent.ACTION_PACKAGE_ADDED)){
+ if (action.equals(Intent.ACTION_PACKAGE_ADDED)) {
intent1.setAction(Utils.ACTION_PACKAGE_ADDED);
- }else {
+ } else {
intent1.setAction(Utils.ACTION_PACKAGE_REPLACED);
}
intent1.putExtra("packageName", packageName);
@@ -84,11 +85,11 @@ public class NewAppReceiver extends BroadcastReceiver {
String packageName = intent.getDataString().replace("package:", "");
Log.e(TAG, "卸载了:" + packageName + "包名的程序");
- if (!packageName.equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !packageName.equals(context.getPackageName())){
- deletedateUserApp(context,packageName);
+ if (!packageName.equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !packageName.equals(context.getPackageName())) {
+ deletedateUserApp(context, packageName);
}
Intent intent1 = new Intent();
- intent1.setAction(Utils.ACTION_PACKAGE_REMOVED);
+ intent1.setAction(Utils.ACTION_PACKAGE_REMOVED);
intent1.putExtra("packageName", packageName);
context.sendBroadcast(intent1);
getAppInfo(context);
@@ -164,7 +165,7 @@ public class NewAppReceiver extends BroadcastReceiver {
@Override
public void onNext(ResponseBody responseBody) {
try {
- Log.e("mjhseng", "上传的结果"+responseBody.string());
+ Log.e("mjhseng", "上传的结果" + responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/server/GuardService.java b/app/src/main/java/com/mjsheng/myappstore/server/GuardService.java
index 2d0cc06..14c8b37 100644
--- a/app/src/main/java/com/mjsheng/myappstore/server/GuardService.java
+++ b/app/src/main/java/com/mjsheng/myappstore/server/GuardService.java
@@ -13,6 +13,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
+import android.provider.Settings;
import android.support.annotation.Nullable;
import android.util.Log;
@@ -24,6 +25,8 @@ import com.mjsheng.myappstore.KeepAliveConnection;
import com.mjsheng.myappstore.utils.ApkUtils;
import com.mjsheng.myappstore.utils.ServiceAliveUtils;
+import java.io.File;
+
/**
* 守护进程 双进程通讯
@@ -71,18 +74,16 @@ public class GuardService extends Service {
Aria.download(this).register();
-
-
-
// startForeground(1, new Notification());
// 绑定建立链接
bindService(new Intent(this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT);
return START_STICKY;
}
+
//在这里处理任务执行中的状态,如进度进度条的刷新
@Download.onTaskRunning
protected void running(com.arialyy.aria.core.download.DownloadTask task) {
- Log.e("mjsheng", "正在下载=--------------::" + task.getState() + "-------" + task.getPercent()+ "-------" + task.getExtendField());
+ Log.e("mjsheng", "正在下载=--------------::" + task.getState() + "-------" + task.getPercent() + "-------" + task.getExtendField());
ToastUtils.showShort("正在下载=--------------::" + task.getExtendField() + "-------" + task.getPercent());
}
@@ -90,10 +91,18 @@ public class GuardService extends Service {
void taskComplete(com.arialyy.aria.core.download.DownloadTask task) {
//在这里处理任务完成的状态
String filepath = task.getDownloadPath();
- String packageName = task.getExtendField();
+ final String packageName = task.getExtendField();
Log.e("mjsheng", "downloadPath::" + filepath);
Log.e("mjsheng", "extendField::" + packageName);
- ApkUtils.installApkInSilence(filepath, packageName);
+ String s = Settings.System.getString(getContentResolver(), "qch_app_forbid");
+ String s1 = s;
+ if (s != null && !s.contains(packageName)) {
+ s1 = s + "," + packageName;
+ Settings.System.putString(getContentResolver(), "qch_app_forbid", s1);
+ ApkUtils.installApp(GuardService.this, filepath);
+ }
+
+
}
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java b/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java
index d9c1853..bd77851 100644
--- a/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java
+++ b/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java
@@ -2,7 +2,11 @@ package com.mjsheng.myappstore.server;
import android.app.Service;
import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -18,11 +22,13 @@ import com.mjsheng.myappstore.BuildConfig;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.mjsheng.myappstore.MyApplication;
+import com.mjsheng.myappstore.activity.MainActivity;
import com.mjsheng.myappstore.bean.ForceDownloadBean;
import com.mjsheng.myappstore.bean.ForceDownloadData;
import com.mjsheng.myappstore.bean.NetAndLaunchBean;
import com.mjsheng.myappstore.bean.NetAndLaunchData;
import com.mjsheng.myappstore.comm.CommonDatas;
+import com.mjsheng.myappstore.network.HTTPInterface;
import com.mjsheng.myappstore.network.Network;
import com.mjsheng.myappstore.network.api.AppLimitApi;
import com.mjsheng.myappstore.network.api.DeselectBrowserIDApi;
@@ -39,6 +45,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -86,6 +93,56 @@ public class InitJpushServer extends Service {
return super.onStartCommand(intent, flags, startId);
}
+ private void setJpushTags() {
+ OkGo.get(Configure.GET_DEVICES_TAGS)
+ .params("sn", Utils.getSerial())
+ .execute(new StringCallback() {
+ @Override
+ public void onSuccess(String s, Call call, Response response) {
+ Log.e("fht", s);
+ com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(s);
+ int code = jsonObject.getInteger("code");
+ com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");
+ if (code == 200) {
+ String batch = data.getString("batch");
+ if (batch != null && !batch.equals("")) {
+ Set set = new HashSet();
+ set.add(batch);
+ JPushInterface.setTags(InitJpushServer.this, set, new TagAliasCallback() {
+ @Override
+ public void gotResult(int i, String s, Set set) {
+ if (set == null) {
+ Log.e("initmjsheng", "set is null");
+ } else {
+ Log.e("initmjsheng", "set ---" + set.toString());
+ }
+ Log.e("JPushInterface", s + "---" + i + "---");
+ if (i == 0) {
+ Log.e("JPushInterface", "Tag绑定成功");
+ } else if (i == 6001) {
+ Log.e("JPushInterface", "无效的设置,用户名为空");
+ } else if (i == 6002) {
+ Log.e("JPushInterface", "设置超时,请重试");
+ timerImitate();
+ } else if (i == 6011) {
+ Log.e("JPushInterface", "短时间内操作过于频繁");
+ } else if (i == 996) {
+ Log.e("JPushInterface", "网络连接断开");
+ timerImitate();
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public void onError(Call call, Response response, Exception e) {
+ super.onError(call, response, e);
+ Log.e("fht", e.getMessage());
+ }
+ });
+ }
private void initJpush() {
@@ -128,8 +185,7 @@ public class InitJpushServer extends Service {
public void call(Long aLong) {
Log.e("JPushInterface", "JPushInterface重新加载");
initJpush();
-
-
+ setJpushTags();
}
});
}
@@ -594,15 +650,19 @@ public class InitJpushServer extends Service {
.params("sn", Utils.getSerial())
.params("mac", com.blankj.utilcode.util.DeviceUtils.getMacAddress())
.params("jpush_id", rid)
+ .params("appstore_version", Utils.getProperty("ro.custom.build.version","获取失败"))
+ .params("store_version", BuildConfig.VERSION_NAME)
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
-
+ com.alibaba.fastjson.JSONObject msgObject = JSON.parseObject(s);
+ Log.e("fht", "sendMACaddress onSuccess"+s);
}
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
+ Log.e("fht", "sendMACaddress onError:"+e.getMessage());
}
});
{
@@ -648,6 +708,7 @@ public class InitJpushServer extends Service {
getForceDownload();
getSystemSetting();//从后台获取功能状态
resetDevice();
+ checkUpdate();
}
}
}
@@ -668,6 +729,10 @@ public class InitJpushServer extends Service {
}
}
+ private void checkUpdate() {
+ HTTPInterface.checkUpdate(mHandler, "com.jiaoguanyi.store");
+ }
+
private void SettingSysData(JSONObject data) {
try {
int setting_call = changeNum(data.optInt("setting_call"));
@@ -696,21 +761,21 @@ public class InitJpushServer extends Service {
if (!BuildConfig.DEBUG) {
boolean qch_usb_choose = Settings.System.putString(getApplicationContext().getContentResolver(), "qch_usb_choose", setting_usb);
Log.e("SystemSetting", "qch_usb_choose---------" + qch_usb_choose);
- String usbStatus = "";
- switch (setting_usb) {
- case "usb_charge":
- usbStatus = "qch_action_usb_usb_charge";
- break;
- case "usb_mtp":
- usbStatus = "qch_action_usb_usb_mtp";
- break;
- case "usb_midi":
- usbStatus = "qch_action_usb_usb_midi";
- break;
+ String usbStatus = "";
+ switch (setting_usb) {
+ case "usb_charge":
+ usbStatus = "qch_action_usb_usb_charge";
+ break;
+ case "usb_mtp":
+ usbStatus = "qch_action_usb_usb_mtp";
+ break;
+ case "usb_midi":
+ usbStatus = "qch_action_usb_usb_midi";
+ break;
- }
- Intent usbIntent = new Intent(usbStatus);
- sendBroadcast(usbIntent);
+ }
+ Intent usbIntent = new Intent(usbStatus);
+ sendBroadcast(usbIntent);
}
int setting_bluetooth = changeNum(data.optInt("setting_bluetooth"));
@@ -738,22 +803,11 @@ public class InitJpushServer extends Service {
//状态栏显示开关
int setting_statusbar = changeNum(data.optInt("setting_statusbar"));
- boolean qch_hide_statusBar = Settings.System.putInt(getApplicationContext().getContentResolver(), "qch_hide_statusBar", setting_statusbar);
- Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
-
- String statusbarStatus = "";
- switch (setting_statusbar) {
- case 0:
- statusbarStatus = "qch_show_statusBar";
- break;
- case 1:
- statusbarStatus = "qch_hide_statusBar";
- break;
-
+ int oldNum = Settings.System.getInt(getContentResolver(), "qch_hide_statusBar", 1);
+ if (oldNum != setting_statusbar) {
+ boolean qch_hide_statusBar = Settings.System.putInt(getContentResolver(), "qch_hide_statusBar", setting_statusbar);
+ Log.e("SystemSetting", "qch_hide_statusBar---------" + qch_hide_statusBar);
}
- Intent statusIntent = new Intent(statusbarStatus);
- sendBroadcast(statusIntent);
-
//摄像头开关
int setting_camera = changeNum(data.optInt("setting_camera"));
Log.e("SystemSetting", "setting_camera---------" + setting_camera);
@@ -856,4 +910,43 @@ public class InitJpushServer extends Service {
return num;
}
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what) {
+ case 200:
+ com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) msg.obj;
+ installAPK(jsonObject);
+ break;
+ case -200:
+ Log.e("fht", "no update");
+ }
+ }
+
+ };
+
+ private void installAPK(com.alibaba.fastjson.JSONObject jsonObject) {
+ String url = jsonObject.getString("url");
+ int versionCode = jsonObject.getInteger("version_code");
+ String packageName = jsonObject.getString("package");
+ PackageManager pm = getPackageManager();
+ PackageInfo packageInfo = null;
+ try {
+ packageInfo = pm.getPackageInfo(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ if (packageInfo == null || packageInfo.versionCode != versionCode) {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString(packageName) + ".apk",true)
+ .setExtendField(packageName)
+ .start(); //启动下载}
+ } else {
+ Log.e("fht", "无需更新");
+ }
+
+ }
+
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/server/MyDownloadService.java b/app/src/main/java/com/mjsheng/myappstore/server/MyDownloadService.java
index a011215..211db65 100644
--- a/app/src/main/java/com/mjsheng/myappstore/server/MyDownloadService.java
+++ b/app/src/main/java/com/mjsheng/myappstore/server/MyDownloadService.java
@@ -131,22 +131,22 @@ public class MyDownloadService extends Service {
if (info.getApp_baoming().equals(Utils.YOUNGSYSTEM_APP_TONGBU) || info.getApp_baoming().equals(MyApplication.getAppContext().getPackageName())) {
// ApkUtils.install(MyApplication.getAppContext(), new File(downloadInfo.getTargetPath()));
- ApkUtils.installApkInSilence(downloadInfo.getTargetPath(), info.getApp_baoming());
+ ApkUtils.installApp(MyDownloadService.this, downloadInfo.getTargetPath());
Log.e("fht", "updateTask1");
// ApkUtils.updateTask(getApplicationContext());
}
if (downloadURL.contains(downloadInfo.getUrl())) {
// ApkUtils.install(MyApplication.getAppContext(), new File(downloadInfo.getTargetPath()));
- if (ApkUtils.getinstallPackage().equals("") || ApkUtils.isAvailable(getApplicationContext(), ApkUtils.getinstallPackage())) {
- //没有任务或者任务已经安装
- Log.e("fht", "task package is installed , install new apk ");
- ApkUtils.installApkInSilence(downloadInfo.getTargetPath(), info.getApp_baoming());
- } else {
- //更新正在安装的信息,更新任务列表
- ApkUtils.setInstallIngPackageName("");
- ApkUtils.updateTask(allTask, getApplicationContext());
- }
+// if (MyApplication.getInstance().getInstallIngPackageName().equals("") || ApkUtils.isAvailable(getApplicationContext(), MyApplication.getInstance().getInstallIngPackageName())) {
+ //没有任务或者任务已经安装
+ Log.e("fht", "task package is installed , install new apk ");
+ ApkUtils.installApkInSilence(downloadInfo.getTargetPath(), info.getApp_baoming());
+// } else {
+// //更新正在安装的信息,更新任务列表
+// MyApplication.getInstance().setInstallIngPackageName("");
+// MyApplication.getInstance().updateList();
+// }
//有bug,会一直回调
Log.e("fht", "updateTask2");
@@ -208,7 +208,7 @@ public class MyDownloadService extends Service {
// 删除标识 下载地址
String URL = intent.getStringExtra("URL");
DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
- if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ if (downloadInfo != null) {
downloadInfo.setState(10);
sendDownloadState(downloadInfo);
downloadManager.removeTask(downloadInfo.getUrl(), true);
@@ -297,15 +297,7 @@ public class MyDownloadService extends Service {
downloadInfo.setState(10);
sendDownloadState(downloadInfo);
downloadManager.removeTask(downloadInfo.getUrl(), true);
- }
- } else if (Utils.DOWNLOAD_DELETE_URL_ACTION.equals(intent.getAction())) {
- // 删除标识 下载地址
- String URL = intent.getStringExtra("URL");
- DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
- if (downloadInfo != null) {
- downloadInfo.setState(10);
- sendDownloadState(downloadInfo);
- downloadManager.removeTask(downloadInfo.getUrl(), true);
+
}
} else if (Utils.DOWNLOAD_DELETE_UPDATE_ACTION.equals(intent.getAction())) {
// 删除 应用更新包
@@ -362,8 +354,6 @@ public class MyDownloadService extends Service {
Intent allIntent = new Intent();
allIntent.setAction(Utils.DOWNLOAD_ALLSERVICE_ACTION);
allIntent.putExtra("allTask", (Serializable) list);
- Log.e("fht", "allTask updateTask:" + allTask.size());
- ApkUtils.updateTask(allTask, getApplicationContext());
sendBroadcast(allIntent);
}
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/server/StepService.java b/app/src/main/java/com/mjsheng/myappstore/server/StepService.java
index 6e3ac4c..ad08d73 100644
--- a/app/src/main/java/com/mjsheng/myappstore/server/StepService.java
+++ b/app/src/main/java/com/mjsheng/myappstore/server/StepService.java
@@ -14,11 +14,19 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.annotation.Nullable;
+import android.util.Log;
import com.blankj.utilcode.util.LogUtils;
+import com.lzy.okserver.download.DownloadInfo;
import com.mjsheng.myappstore.KeepAliveConnection;
+import com.mjsheng.myappstore.MyApplication;
+import com.mjsheng.myappstore.bean.AppDateInfo;
+import com.mjsheng.myappstore.bean.FileData;
+import com.mjsheng.myappstore.utils.ApkUtils;
import com.mjsheng.myappstore.utils.ServiceAliveUtils;
+import java.nio.file.Path;
+
/**
* 主进程 双进程通讯
*
@@ -59,6 +67,18 @@ public class StepService extends Service {
public int onStartCommand(Intent intent, int flags, int startId) {
// startForeground(1, new Notification());
// 绑定建立链接
+ try {
+ final String filePath = intent.getStringExtra("filePath");
+ final String packageName = intent.getStringExtra("packageName");
+ Log.e("fht", filePath);
+ Log.e("fht", packageName);
+ FileData fileData = new FileData(filePath, packageName);
+ MyApplication.getInstance().addFileData(fileData);
+
+ } catch (Exception e) {
+ Log.e("fht", e.getMessage());
+ }
+
bindService(new Intent(this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT);
return START_STICKY;
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java
index 969782a..0f56c6b 100644
--- a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java
+++ b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java
@@ -17,9 +17,11 @@ import android.widget.Toast;
import com.lzy.okserver.download.DownloadInfo;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
+import com.mjsheng.myappstore.BuildConfig;
import com.mjsheng.myappstore.R;
import com.mjsheng.myappstore.bean.AppDateInfo;
import com.mjsheng.myappstore.bean.AppDownloadInfo;
+import com.mjsheng.myappstore.bean.FileData;
import com.mjsheng.myappstore.download.StorageUtils;
import com.mjsheng.myappstore.utils.update.ToastTool;
@@ -305,11 +307,58 @@ public class ApkUtils {
// Log.e("mjsheng", "安装失败");
// }
// }
+ public interface InstallCallback {
+ void installInfoCallback(String path, String packageName);
+ }
+
+ public static boolean installApp(Context context, String apkPath) {
+ ToastTool.show("正在安装应用...");
+ Process process = null;
+ BufferedReader successResult = null;
+ BufferedReader errorResult = null;
+ StringBuilder successMsg = new StringBuilder();
+ StringBuilder errorMsg = new StringBuilder();
+ try {
+ process = new ProcessBuilder("pm", "install", "-i", BuildConfig.APPLICATION_ID, "--user", "0", apkPath).start();
+ successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+ String s;
+ while ((s = successResult.readLine()) != null) {
+ successMsg.append(s);
+ }
+ while ((s = errorResult.readLine()) != null) {
+ errorMsg.append(s);
+ }
+ } catch (Exception e) {
+
+ } finally {
+ try {
+ if (successResult != null) {
+ successResult.close();
+ }
+ if (errorResult != null) {
+ errorResult.close();
+ }
+ } catch (Exception e) {
+
+ }
+ if (process != null) {
+ process.destroy();
+ }
+ }
+ Log.e("result", "" + errorMsg.toString());
+ //如果含有“success”认为安装成功
+ Log.e("installApp", successMsg.toString());
+ if (!successMsg.toString().equalsIgnoreCase("success")) {
+ ApkUtils.install(context, new File(apkPath));
+ }
+ return successMsg.toString().equalsIgnoreCase("success");
+ }
public static void installApkInSilence(String installPath, String packageName) {
ToastTool.show("正在安装应用...");
- setInstallIngPackageName(packageName);
+
Class> pmService;
Class> activityTherad;
Method method;
@@ -380,111 +429,5 @@ public class ApkUtils {
return uid / PER_USER_RANGE;
}
- private static List taskList = new ArrayList<>();
- public static List alltask;
-
- static String packageName = "";
-
- public static void setInstallIngPackageName(String packageNames) {
- packageName = packageNames;
- Log.e("fht", "正在安装:" + packageNames);
- }
-
- public static String getinstallPackage() {
- return packageName;
- }
-
- public static boolean isInstalling(String packageNames) {
- Log.e("fht", "isInstalling:" + packageName);
- return packageName.equals(packageNames);
- }
-
- public static DownloadInfo getDownloadInfoByPackageName(String s) {
- int x = -1;
- if (alltask != null && alltask.size() > 0) {
- for (int i = 0; i < alltask.size(); i++) {
- DownloadInfo downloadInfo = alltask.get(i);
- AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
- if (dateInfo.getApp_baoming().equals(s)) {
- x = i;
- }
- }
- }
- if (x != -1) {
- return alltask.get(x);
- } else {
- return null;
- }
- }
-
- static synchronized public void updateTask(List allTask, Context context) {
- alltask = allTask;
- Log.e("fht", "updateTask:" + allTask.size());
- long time1 = System.currentTimeMillis();
- List list = new ArrayList<>();
- if (allTask.size() > 0) {
- for (int i = 0; i < allTask.size(); i++) {
- DownloadInfo downloadInfo = allTask.get(i);
- if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
- AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
- if (!dateInfo.getApp_baoming().equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !dateInfo.getApp_baoming().equals(context.getPackageName())) {
- AppDownloadInfo info = new AppDownloadInfo();
- info.setFileName(downloadInfo.getFileName());
- info.setProgress(downloadInfo.getProgress());
- info.setTargetPath(downloadInfo.getTargetPath());
- info.setUrl(downloadInfo.getUrl());
- info.setState(downloadInfo.getState());
- info.setDownloadLength(downloadInfo.getDownloadLength());
- info.setTotalLength(downloadInfo.getTotalLength());
- info.setPackageName(dateInfo.getApp_baoming());
- info.setVersion(dateInfo.getApp_banben());
- info.setData(dateInfo);
- list.add(info);
- }
- }
- }
- }
- long time2 = System.currentTimeMillis();
- Log.e("fht", "time:" + (time2 - time1));
- taskList = list;
- if ((packageName.equals("") || isAvailable(context, getinstallPackage())) && taskList.size() > 0 && taskList.get(0).getState() == DownloadManager.FINISH) {
- if (isAvailable(context, taskList.get(0).getPackageName())) {
- taskList.remove(0);
- }
- if (taskList.size() > 0) {
- ApkUtils.installApkInSilence(taskList.get(0).getTargetPath(), taskList.get(0).getPackageName());
- Log.e("fht", "updateTask1:" + taskList.get(0).getPackageName());
- }
- }
- }
-
-
- synchronized public static void removeInfo(String packageName) {
- Log.e("fht", "removeInfo:" + "taskList.size():" + taskList.size());
-
- int position = -1;
- for (int i = 0; i < taskList.size(); i++) {
- if (packageName.equals(taskList.get(i).getPackageName())) {
- position = i;
- }
- }
- if (position != -1) {
- removeInfo(taskList.get(position));
- } else {
- setInstallIngPackageName("");
- Log.e("fht", "position == -1");
- }
- }
-
- synchronized public static void removeInfo(AppDownloadInfo info) {
- taskList.remove(info);
- if (taskList != null && taskList.size() > 0) {
- ApkUtils.installApkInSilence(taskList.get(0).getTargetPath(), taskList.get(0).getPackageName());
- Log.e("fht", "removeInfo:" + taskList.get(0).getPackageName());
- } else {
- setInstallIngPackageName("");
- Log.e("fht", "任务为空");
- }
- }
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java b/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java
index ea28c6f..f5469a2 100644
--- a/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java
+++ b/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java
@@ -186,4 +186,8 @@ public class Configure {
public static final String SEND_USEDTIME= HTTP_TAG_HEAD_NEW + "Applog/getAppLog";
+ public static final String CHECK_UPDATE= HTTP_TAG_HEAD_NEW + "Silent/silent";
+ //更新接口
+ public static final String GET_DEVICES_TAGS= HTTP_TAG_HEAD_NEW + "Sn/getSnTag";
+
}
diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/Utils.java b/app/src/main/java/com/mjsheng/myappstore/utils/Utils.java
index bdd28ca..d7dceeb 100644
--- a/app/src/main/java/com/mjsheng/myappstore/utils/Utils.java
+++ b/app/src/main/java/com/mjsheng/myappstore/utils/Utils.java
@@ -48,6 +48,7 @@ import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
+import java.lang.reflect.Method;
import java.net.NetworkInterface;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -103,6 +104,7 @@ public class Utils {
public static final int COUNT_ONE_PAGE2 = 10;
public static final String YOUNGSYSTEM_APP_TONGBU = "com.school.app.syn"; // 小学系统 同步教材app
/**
+ *
*/
public static final String number[] = {
"1", "2", "3", "4", "5", "6", "7",
@@ -154,7 +156,6 @@ public class Utils {
// 积分记录 达人标准次数记录
-
// MD5 设备地址标识
public static String getMAC(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 如果当前设备系统大于等于6.0 使用下面的方法
@@ -715,15 +716,16 @@ public class Utils {
}
- public static String transferLongToDate(Long millSec){
+ public static String transferLongToDate(Long millSec) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date date= new Date(millSec);
+ Date date = new Date(millSec);
return sdf.format(date);
}
+
public static String getSn() {
return Build.SERIAL;
}
@@ -783,7 +785,6 @@ public class Utils {
}
-
//判断是否为系统应用
public static boolean isSystemApp(Context context, String pkgName) {
boolean isSystemApp = false;
@@ -856,5 +857,18 @@ public class Utils {
// return bgBitmap;
}
+ public static String getProperty(String key, String defaultValue) {
+ String value = defaultValue;
+ try {
+ Class> c = Class.forName("android.os.SystemProperties");
+ Method get = c.getMethod("get", String.class, String.class);
+ value = (String) (get.invoke(c, key, "unknown"));
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ return value;
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
deleted file mode 100644
index 1f6bb29..0000000
--- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 0d025f9..0000000
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml
index c73fe81..c4eb313 100644
--- a/app/src/main/res/layout-land/activity_main.xml
+++ b/app/src/main/res/layout-land/activity_main.xml
@@ -41,12 +41,13 @@
android:layout_marginBottom="@dimen/dp_10"
android:gravity="center_horizontal"
android:text="设备信息"
- android:textSize="@dimen/sp_18"
+ android:textSize="@dimen/sp_16"
android:textStyle="bold" />
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp_30">
@@ -65,7 +67,7 @@
diff --git a/app/src/main/res/layout-port/activity_main.xml b/app/src/main/res/layout-port/activity_main.xml
index 64b185c..31c4f3b 100644
--- a/app/src/main/res/layout-port/activity_main.xml
+++ b/app/src/main/res/layout-port/activity_main.xml
@@ -41,13 +41,13 @@
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="设备信息"
- android:textSize="@dimen/sp_18"
+ android:textSize="@dimen/sp_16"
android:textStyle="bold" />
+ android:layout_marginTop="@dimen/dp_50">
@@ -78,7 +79,8 @@
android:layout_marginEnd="@dimen/dp_5"
android:layout_marginRight="@dimen/dp_5"
android:layout_marginBottom="@dimen/dp_5"
- android:text="设备MAC:"
+ android:text="MAC地址"
+ android:textColor="#7b7b7b"
android:textSize="@dimen/sp_12" />
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index eca70cf..0000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index eca70cf..0000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 1d349f0cb934cbbe297b752d69fcdd1bbb5ecfd8..132a9d5f211b10d3d44edce8f4e3fbe86962c6c7 100644
GIT binary patch
delta 4497
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
delta 13302
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
EAC4e)Pyhe`
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 1b523998081149a985cef0cdf89045b9ed29964a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5024
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
delta 13302
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
EAC4e)Pyhe`
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 115a4c768a20c9e13185c17043f4c4d12dd4632a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2858
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