From fd66ba852029457fd1ce67461cf106cabb42d1d9 Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期六, 25 七月 2020 20:25:35 +0800
Subject: [PATCH] 坐标
---
lib/src/main/java/com/anyun/exam/lib/InstallUtil.java | 226 ++++++++++++++++++++++++++++++++
lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java | 5
lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java | 154 ++++++++++++++++++++++
lib/src/main/java/com/anyun/exam/lib/RemoteService.java | 3
4 files changed, 388 insertions(+), 0 deletions(-)
diff --git a/lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java b/lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java
new file mode 100644
index 0000000..9a938f0
--- /dev/null
+++ b/lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java
@@ -0,0 +1,5 @@
+package com.anyun.exam.lib;
+
+public interface DownloadManagerCallback {
+ void DownloadComplete(String title, String path);
+}
diff --git a/lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java b/lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java
new file mode 100644
index 0000000..b6107a5
--- /dev/null
+++ b/lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java
@@ -0,0 +1,154 @@
+package com.anyun.exam.lib;
+
+import android.app.DownloadManager;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Environment;
+import android.util.Log;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class DownloadManagerUtil {
+ public static final String TAG = DownloadManagerUtil.class.getCanonicalName();
+ private Context context;
+ private DownloadManager downloadManager = null;
+ private static DownloadManagerUtil instance = null;
+ private DownloadManagerCallback callback = null;
+
+ class DownloadItem {
+ long id;
+ String fileName;
+ String url;
+
+ public DownloadItem (long id, String fileName, String url) {
+ this.id = id;
+ this.fileName = fileName;
+ this.url = url;
+ }
+ }
+
+ public static DownloadManagerUtil getInstance(Context context) {
+ if (instance == null) {
+ synchronized (DownloadManagerUtil.class) {
+ if (instance == null) {
+ instance = new DownloadManagerUtil(context);
+ }
+ }
+ }
+ return instance;
+ }
+
+ private DownloadManagerUtil(Context context) {
+ this.context = context;
+ if (downloadManager == null) {
+ downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+ }
+
+ RegisterDownload();
+ }
+
+ public void RegisterDownload() {
+ IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+ context.registerReceiver(mReceiver, filter);
+ }
+
+ public void SetDMCallback(final DownloadManagerCallback cb) {
+ callback = cb;
+ }
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
+ long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+ DownloadManager.Query query = new DownloadManager.Query();
+ Cursor cursor = downloadManager.query(query);
+
+ while (cursor != null && cursor.moveToFirst()) {
+ int cid = cursor.getInt( cursor.getColumnIndex(DownloadManager.COLUMN_ID) );
+ int status = cursor.getInt( cursor.getColumnIndex(DownloadManager.COLUMN_STATUS) );
+
+ if (id == cid && status == DownloadManager.STATUS_SUCCESSFUL) {
+ String title = cursor.getString( cursor.getColumnIndex(DownloadManager.COLUMN_TITLE) );
+ String fileUri = cursor.getString(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
+ Log.d(TAG, "涓嬭浇瀹屾瘯 " + fileUri);
+
+ if (callback != null) {
+ callback.DownloadComplete(title, Uri.parse(fileUri).getPath());
+ }
+ break;
+ }
+ }
+ }
+ }
+ };
+
+ public void DownloadFile(String url, String saveFileName, String title, String desc) {
+ Log.d(TAG, "涓嬭浇鏂囦欢 " + url);
+ // 璺宠繃宸茬粡鍦ㄤ笅杞界殑
+ if (CheckAndClear(title) == 1) {
+ Log.d(TAG, "璺宠繃宸茬粡鍦ㄤ笅杞界殑 " + title);
+ return;
+ }
+
+ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+
+ File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), saveFileName);
+ request.setDestinationUri(Uri.fromFile(file));
+
+ request.setTitle(title);
+ request.setDescription(desc);
+
+ if (downloadManager != null) {
+ long idx = downloadManager.enqueue(request);
+ Log.d(TAG, "鏂板缓涓嬭浇浠诲姟 id = " + idx);
+ }
+ }
+
+ public int CheckAndClear(String title) {
+ DownloadManager.Query query = new DownloadManager.Query();
+ Cursor cursor = downloadManager.query(query);
+ while (cursor != null && cursor.moveToNext()) {
+ String theTitle = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE));
+ if (theTitle.equals(title)) {
+ int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
+ long id = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID));
+ Log.d(TAG, "褰撳墠璇ユ枃浠朵笅杞界姸鎬� " + status);
+
+ if (status == DownloadManager.STATUS_FAILED || status == DownloadManager.STATUS_SUCCESSFUL) {
+ downloadManager.remove(id);
+ return 0;
+ } else if (status != DownloadManager.STATUS_RUNNING) {
+ // 濡傛灉鏄娆″浜庢殏鍋淺鎸傝捣鐘舵�侊紝杩樻槸鍒犻櫎
+ downloadManager.remove(id);
+ return 0;
+ }
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ public int CheckDownloadStatus(int id) {
+ DownloadManager.Query query = new DownloadManager.Query();
+ Cursor cursor = downloadManager.query(query);
+
+ while (cursor != null && cursor.moveToNext()) {
+ int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
+
+ if (id == cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_ID))) {
+ return status;
+ }
+ }
+ return -1;
+ }
+}
diff --git a/lib/src/main/java/com/anyun/exam/lib/InstallUtil.java b/lib/src/main/java/com/anyun/exam/lib/InstallUtil.java
new file mode 100644
index 0000000..c2a0b8d
--- /dev/null
+++ b/lib/src/main/java/com/anyun/exam/lib/InstallUtil.java
@@ -0,0 +1,226 @@
+package com.anyun.exam.lib;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.Locale;
+
+public class InstallUtil {
+ public static final String TAG = InstallUtil.class.getCanonicalName();
+ private static InstallUtil instance = null;
+ private Context context;
+
+ public static InstallUtil getInstance(Context context) {
+ if (instance == null) {
+ synchronized (InstallUtil.class) {
+ if (instance == null) {
+ instance = new InstallUtil(context);
+ }
+ }
+ }
+ return instance;
+ }
+
+ private InstallUtil(Context context) {
+ this.context = context;
+ }
+
+ public int getVerCode() {
+ int verCode = 0;
+ try {
+ verCode = context.getPackageManager().
+ getPackageInfo(context.getPackageName(), 0).versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+
+ Log.d(TAG, "APP 鐗堟湰 = " + verCode);
+
+ return verCode;
+ }
+
+ public String getVerName() {
+ String verName = "";
+ try {
+ verName = context.getPackageManager().
+ getPackageInfo(context.getPackageName(), 0).versionName;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return verName;
+ }
+
+ public String getPackageName() {
+ String name = "";
+ try {
+ name = context.getPackageManager().
+ getPackageInfo(context.getPackageName(), 0).packageName;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return name;
+ }
+
+ public class AppInfo {
+ public String appName="";
+ public String packageName="";
+ public String versionName="";
+ public int versionCode=0;
+ }
+
+ public AppInfo getAppInfo(String packageName) {
+ List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);
+
+ for (PackageInfo packageInfo : packages) {
+ if (packageName.equals(packageInfo.packageName)) {
+ AppInfo appInfo = new AppInfo();
+
+ appInfo.appName= packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
+ appInfo.packageName = packageInfo.packageName;
+ appInfo.versionName = packageInfo.versionName;
+ appInfo.versionCode = packageInfo.versionCode;
+
+ return appInfo;
+ }
+ }
+ return null;
+ }
+
+ public Signature[] getSignature() {
+ Signature[] signs = null;
+
+ try {
+ PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
+ signs = info.signatures;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return signs;
+ }
+
+ public Signature[] getSignature(String archiveFilePath) {
+ Signature[] signs = null;
+ try {
+ PackageInfo info = context.getPackageManager().getPackageArchiveInfo(archiveFilePath, PackageManager.GET_SIGNATURES);
+ signs = info.signatures;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return signs;
+ }
+
+ public String getVersionNameFromApk(Context context, String archiveFilePath) {
+ PackageManager pm = context.getPackageManager();
+ PackageInfo packInfo = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
+ return packInfo.versionName;
+ }
+
+ public int getVersionCodeFromApk(Context context, String archiveFilePath) {
+ PackageManager pm = context.getPackageManager();
+ PackageInfo packInfo = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
+ return packInfo.versionCode;
+ }
+
+ public String getPackageNameFromApk(Context context, String archiveFilePath) {
+ PackageManager pm = context.getPackageManager();
+ PackageInfo packInfo = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
+ return packInfo.packageName;
+ }
+
+ public void InstallApp(String path) {
+ File file = new File(path);
+
+ if (file.exists() && file.isFile()) {
+ try {
+ Log.d(TAG, "鍗囩骇app 鏂囦欢瀛樺湪 褰撳墠ver " + getVerCode() + " 褰撳墠Name " + getVerName() + " 鐩爣ver " + getVersionCodeFromApk(context, file.getAbsolutePath()) + " 鐩爣name " + getVersionNameFromApk(context, file.getAbsolutePath()));
+
+// Signature[] sig = getSignature();
+// Signature[] sig2 = getSignature(file.getAbsolutePath());
+
+ /*if ( getFingerprint(sig[0], "SHA-1").equals(getFingerprint(sig2[0], "SHA-1")))*/ {
+ if ( getVerCode() <= getVersionCodeFromApk(context, file.getAbsolutePath()) ) {
+ Log.d(TAG, "瀹夎鏂囦欢 " + file.getAbsolutePath());
+ String result = execCommand("pm", "install", "-i", getPackageName(), "--user", "0", "-r", "-d", file.getAbsolutePath());
+ Log.d(TAG, "瀹夎缁撴灉 " + result);
+ } else {
+ file.delete();
+ }
+ } /*else {
+ file.delete();
+ }*/
+ } catch (Exception e) {
+ Log.e(TAG, "瀹夎鍙戠敓閿欒 " + e.getMessage());
+ }
+ }
+ }
+
+ public String getFingerprint(Signature signature, String hashAlgorithm) {
+ if (signature == null) {
+ return null;
+ }
+ try {
+ MessageDigest digest = MessageDigest.getInstance(hashAlgorithm);
+ return toHexadecimalString(digest.digest(signature.toByteArray()));
+ } catch(NoSuchAlgorithmException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ private String toHexadecimalString(byte[] value) {
+ StringBuffer sb = new StringBuffer();
+ int len = value.length;
+ for (int i = 0; i < len; i++) {
+ int num = ((int) value[i]) & 0xff;
+ if (num < 0x10) {
+ sb.append('0');
+ }
+ sb.append(Integer.toHexString(num));
+ if (i < len - 1) {
+ sb.append(':');
+ }
+ }
+ return sb.toString().toUpperCase(Locale.US);
+ }
+
+ public String execCommand(String ...command) {
+ java.lang.Process process=null;
+ InputStream errIs=null;
+ InputStream inIs=null;
+ String result="";
+
+ try {
+ process = new ProcessBuilder().command(command).start();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int read = -1;
+ errIs=process.getErrorStream();
+ while((read=errIs.read())!=-1){
+ baos.write(read);
+ }
+ inIs=process.getInputStream();
+ while((read=inIs.read())!=-1){
+ baos.write(read);
+ }
+ result=new String(baos.toByteArray());
+ if(inIs!=null)
+ inIs.close();
+ if(errIs!=null)
+ errIs.close();
+ process.destroy();
+ } catch (IOException e) {
+ result = e.getMessage();
+ }
+ return result;
+ }
+}
diff --git a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
index cded731..268a5b2 100644
--- a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
+++ b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
@@ -173,6 +173,9 @@
super.onDestroy();
Log.i(TAG,"onDestroy");
mIsServiceDestroyed.set(true);
+
+ Log.d(TAG, "onDestory executed 杩涚▼ " + Process.myPid());
+ Process.killProcess(Process.myPid());
}
private void onMessageArrived(int cmd, String json) {
--
Gitblit v1.8.0