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