Android将apk放置于asset目录下安装

ServiceApkInstaller.java
public class ServiceApkInstaller {
    public final static String TAG = ServiceApkInstaller.class.getSimpleName();
    private final String apkPackName = "net.easyconn.carmanservice";
    private String apkName;
    private final String newApkPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/carbit_speechservice.apk";
    private Context mContext;
    private Thread subThread;

    public ServiceApkInstaller() {
    }

    public ServiceApkInstaller(Context context, String name) {
        mContext = context;
        apkName = name;
    }

    class installTask implements Runnable {
        @Override
        public void run() {
            if (!hasInstalled()) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setDataAndType(Uri.parse("file://" + newApkPath),
                        "application/vnd.android.package-archive");
                mContext.startActivity(intent);
            }
        }
    }

    public ServiceApkInstaller install() {
        if (subThread != null && subThread.isAlive()) {
            return this;
        }
        subThread = new Thread(new installTask());
        subThread.start();
        return this;
    }

    public void uninstall() {
        Uri packageURI = Uri.parse("package:" + apkPackName);
        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
        mContext.startActivity(uninstallIntent);
    }


    public boolean hasInstalled() {


        final PackageManager packageManager = mContext.getPackageManager();
        List<PackageInfo> installedPackInfoList = packageManager.getInstalledPackages(0);
        for (int i = 0; installedPackInfoList != null && i < installedPackInfoList.size(); i++) {
            PackageInfo installedPackInfo = installedPackInfoList.get(i);
            if (installedPackInfo != null && TextUtils.equals(apkPackName, installedPackInfo.packageName)) {

                copyApkFromAssets(mContext, apkName, newApkPath);
                PackageInfo assetPackInfo = packageManager.getPackageArchiveInfo(newApkPath, PackageManager.GET_ACTIVITIES);
                if (assetPackInfo != null) {
                    ApplicationInfo appInfo = assetPackInfo.applicationInfo;
                    String assetVersionName = assetPackInfo.versionName;
                    int assetVersionCode = assetPackInfo.versionCode;
                    if (!TextUtils.equals(assetVersionName, installedPackInfo.versionName) || installedPackInfo.versionCode < assetVersionCode) {
                        return false;
                    } else {
                        return true;
                    }
                }


                return true;
            }
        }
        return false;
    }

    public boolean copyApkFromAssets(Context context, String fileName, String path) {
        boolean copyIsFinish = false;
        try {
            InputStream is = context.getAssets().open(fileName);
            File file = new File(path);
            file.createNewFile();
            FileOutputStream fos = new FileOutputStream(file);
            byte[] temp = new byte[1024];
            int i = 0;
            while ((i = is.read(temp)) > 0) {
                fos.write(temp, 0, i);
            }
            fos.close();
            is.close();
            copyIsFinish = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return copyIsFinish;
    }
}


调用方式:可以在onResume()的时候加入
new ServiceApkInstaller(HomeActivity.this, "module_speech-ht54-debug.apk").install();

猜你喜欢

转载自n-wang.iteye.com/blog/2324203
今日推荐