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