`

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();
分享到:
评论

相关推荐

    Android中安装asset下的apk

    ### Android中安装Asset下的APK 在Android开发中,有时候我们可能会遇到需要动态加载或安装应用内部资源(如APK)的需求。本文将详细介绍如何在Android应用中安装存储于`assets`目录下的APK文件。 #### 一、背景...

    android运行assets apk代码

    1. **Assets目录**:在Android应用的资源结构中,Assets目录是一个特殊的地方,开发者可以将非结构化的数据,如文本文件、音频文件、XML文件或APK文件等放置在这里。这些文件不会被R类引用,但可以通过AssetManager...

    安卓文件下载上传解压相关-zip格式的压缩包放在asset中复制到SD卡上并解压.rar

    这里的zip文件被放置在Asset目录下,这意味着它是作为应用的一部分在安装时包含在APK中。 3. **从Asset复制到SD卡**:Android设备通常拥有外部存储(如SD卡)供应用存储大文件。为了将Asset中的zip文件复制到SD卡,...

    androidstudio打包html成为apk

    标题中的“androidstudio打包html成为apk”指的是使用Android Studio这个集成开发环境,将HTML、CSS和JavaScript等Web前端代码转换成Android应用(APK)的过程。这个过程通常用于快速构建简单的移动应用,尤其是那些...

    android的assets下的sql文件操作

    在`assets`目录下放置SQLite数据库文件(例如`PhoneBooks1.db`),需要在应用运行时将其复制到Android的特定数据存储区域,通常是`data/data/your_package_name/databases`目录。这可以通过`SQLiteOpenHelper`的...

    Android SDK tools 25.0.3

    在描述中提到的"解压直接放到build-tools目录文件夹下便可使用",这表明SDK Tools 25.0.3通常需要被安装到Android SDK的特定目录下,即`build-tools`子目录。这样,当你在使用Gradle或Android Studio进行项目构建时...

    Android SDK build-tools 26.0.2.zip

    当您下载并解压这个文件后,您需要将其放置到您的Android SDK安装路径下的 **build-tools** 目录中,以便系统能够正确识别和调用这些工具。 **Android build-tools** 是Android SDK的一个关键组件,它提供了许多...

    android 读取 assets 文件夹下的音频

    在这里放置的文件不会被Android编译器处理,而是原封不动地打包到APK中,可以在运行时通过`AssetManager`访问。 要读取`assets`文件夹下的音频文件,首先需要创建一个`AssetManager`对象,它是Android系统提供的一...

    android获取assets内容

    在Android开发中,`assets`目录是一个特殊的地方,开发者可以将非资源文件(如文本、配置文件、数据库等)放入其中。这些文件不会被编译为应用的资源,但可以在运行时通过`AssetManager`访问。本文将详细介绍如何在...

    Android离线身份证图片识别Demo

    然后,我们需要在项目的`assets`目录下放置Tesseract的训练数据文件。对于中文识别,必须包含`.traineddata`文件,如`chi_sim.traineddata`。这个文件包含了识别中文字符所需的模型和字典信息。确保在构建应用时,...

    Android SDK tools 21.1.1.zip

    在解压缩“Android SDK tools 21.1.1.zip”后,将得到的21.1.1目录放置于你的Android SDK的build-tools路径下,通常是`根目录&gt;/build-tools/`。这样,当你在使用Android Studio或其他IDE进行项目构建时,系统就能...

    Android之常用命令和工具

    ### Android之常用命令和工具详解...将此脚本命名为 `pcat`,并将其放置在 `/usr/local/bin/` 目录下。 综上所述,通过这些命令和工具,开发者可以有效地管理和监控 Android 应用的状态,从而提高开发效率和应用质量。

    Android SDK tools 26.0.2

    Android SDK Tools是Android开发者必备的工具集,它包含了一系列用于构建、调试和发布Android应用...将解压后的27.0.3文件放置到build-tools目录下,开发者即可在项目中使用这些更新的工具,从而获得更好的开发体验。

    apktool2.1.1

    1. **安装Apktool**:将上述提到的文件放置在同一个目录下,并确保Java环境已经正确配置。 2. **反编译APK**:通过命令行运行`apktool d &lt;apk_file&gt; -o &lt;output_directory&gt;`,这将把APK解压到指定的输出目录。 3. **...

    android-4.4.2 SDKbuildtools 最新mac版buildtools

    一旦下载完成,解压下载的压缩包,将`android-4.4.2`目录放置到你的Android SDK路径下的`build-tools`文件夹内。请注意,不同版本的Build Tools不能混用,因此确保你为Mac系统安装的版本与Windows版本分开。 在使用...

    Android SDK Manager build-tools升级android build tools-26.0.2.rar

    4. **解压和放置**:在下载并解压android build tools-26.0.2.rar文件后,应将其内容放置在Android SDK的`build-tools`目录下。这个目录通常位于`路径&gt;/build-tools/`,确保覆盖或替换原有的旧版本。 5. **Android ...

    Android操作存放在assets文件夹下SQLite数据库的方法

    首先,Android的`assets`文件夹是一个用于存放应用程序资源的特殊目录,不被编译为APK的一部分,而是保持原格式存储。这使得我们可以在运行时将其中的文件读取到内存或特定位置。 为了操作`assets`中的SQLite数据库...

    android build tools26.0.2

    首先,你需要从Android开发者网站下载特定版本的Build Tools,然后将解压后的文件夹放入到本地SDK的`build-tools`目录下。通常,SDK路径在`~/.android/sdk`(Linux或Mac)或`%USERPROFILE%\AppData\Local\Android\...

    apktool 定制ROM小工具

    2. 将压缩包内的apktool.jar、aapt.exe等文件放置到同一目录下。 3. 使用命令行工具运行`java -jar apktool.jar d &lt;input.apk&gt; -o &lt;output_directory&gt;`反编译APK。 4. 在解压出的目录中进行必要的修改。 5. 使用`...

Global site tag (gtag.js) - Google Analytics