fctom1215
2020-07-25 fd66ba852029457fd1ce67461cf106cabb42d1d9
坐标
1个文件已修改
3个文件已添加
388 ■■■■■ 已修改文件
lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/java/com/anyun/exam/lib/InstallUtil.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/java/com/anyun/exam/lib/RemoteService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/java/com/anyun/exam/lib/DownloadManagerCallback.java
New file
@@ -0,0 +1,5 @@
package com.anyun.exam.lib;
public interface DownloadManagerCallback {
    void DownloadComplete(String title, String path);
}
lib/src/main/java/com/anyun/exam/lib/DownloadManagerUtil.java
New file
@@ -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;
    }
}
lib/src/main/java/com/anyun/exam/lib/InstallUtil.java
New file
@@ -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;
    }
}
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) {