精华内容
下载资源
问答
  • 每个程序都会随着时间的推移更新新的版本,下面来介绍一下检测到新的版本并提示更新 思路:首先检测当前版本是否是最近版本,是无需任何操作,不是,就需要下载新的程序版本替换旧版本,并安装(大概就是这么个思路...

    每个程序都会随着时间的推移更新新的版本,下面来介绍一下检测到新的版本并提示更新

    思路:首先检测当前版本是否是最近版本,是无需任何操作,不是,就需要下载新的程序版本替换旧版本,并安装(大概就是这么个思路,下面就是具体的操作)

    package cn.xu.test;
    
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Environment;
    import android.support.v4.content.FileProvider;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import cn.xu.test.utils.CommomDialog;
    
    public class UpdateVersionActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_update_version);
        
            //实际开发中请求网络,对比服务器上的版本和当前本地上的版本   ,不同的提示版本更新
            //我本地的版本号是1,我将版本号写3,大于他
            try {
                if (3 > getCurrentVersionCode()) {
                //todo   这里是一个自定义弹出框,我在上一篇文章中有介绍是怎么封装的,不知道怎么写的小伙伴可以看我的上一篇文章在这里我附上上一章的地址https://blog.csdn.net/qq_42221857/article/details/100518167
                    new CommomDialog(UpdateVersionActivity.this, R.style.dialog, "这里写提示更新的内容",
                            new CommomDialog.OnCloseListener() {
                                @Override
                                public void onClick(Dialog dialog, boolean confirm) {
                                    if (confirm) {
                                        dialog.dismiss();
                                        //下载apk安装  todo注这里需要换上自己下载apk的地址
                                        downLoadApk("这里放下载apk安装包的地址,这个也是后台返回过来的地址");
                                    }
    
                                }
                            }).setTitle("版本更新").show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    /**
    *下载apk
    *@param url 下载的地址
    */
        protected void downLoadApk(final String url) {
            //进度条
            final ProgressDialog pd;
            pd = new ProgressDialog(this);
            pd.setProgressNumberFormat("%1d M /%2d M");
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setMessage("正在下载更新");
            pd.setCanceledOnTouchOutside(false);
            pd.setCancelable(true);//todo 点击返回取消
            pd.show();
            new Thread() {
                @Override
                public void run() {
                    try {
                        File file = getFileFromServer(url, pd);
                        //安装APK
                        installApk(file);
                        pd.dismiss(); //结束掉进度条对话框
                    } catch (Exception e) {
                    }
                }
            }.start();
    
        }
    
    
    
        /**
         * 下载apk具体操作
         *
         * @param path 下载的地址
         * @param pd   下载进度条
         * @return
         * @throws Exception
         */
        public static File getFileFromServer(String path, ProgressDialog pd) throws Exception {
            //如果相等的话表示当前的sdcard挂载在手机上并且是可用的
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                //获取到文件的大小
                pd.setMax(conn.getContentLength() / 1024 / 1024);
                InputStream is = conn.getInputStream();
                File file = new File(Environment.getExternalStorageDirectory(), "soujianzhu.apk");
                FileOutputStream fos = new FileOutputStream(file);
                BufferedInputStream bis = new BufferedInputStream(is);
                byte[] buffer = new byte[1024];
                int len;
                int total = 0;
                while ((len = bis.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                    total += len;
                    //获取当前下载量
                    pd.setProgress(total / 1024 / 1024);
                }
                fos.close();
                bis.close();
                is.close();
                return file;
            } else {
                return null;
            }
    
        }
    
        //安装程序
        protected void installApk(File file) {
    
            if (!file.exists()) {
                Toast.makeText(this, "下载的安装包不存在", Toast.LENGTH_SHORT).show();
                return;
            }
            //判读版本是否在7.0以上 todo 这里是7.0安装是会出现解析包的错误
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
                // todo 在AndroidManifest中的android:authorities值  当前应用的包名:cn.xu.test+FileProvider(数据共享)
                Uri apkUri = FileProvider.getUriForFile(this,
                        "cn.xu.test.FileProvider", file);
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                //添加这一句表示对目标应用临时授权该Uri所代表的文件
                install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                install.setDataAndType(apkUri, "application/vnd.android.package-archive");
                this.startActivity(install);
    
            } else {
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                this.startActivity(install);
            }
    
        }
    
    
        /**
         * 获取当前版本系统的版本号
         *
         * @return
         * @throws Exception
         */
        private int getCurrentVersionCode() throws Exception {
            //获取packagemanager的实例
            PackageManager packageManager = getPackageManager();
            //getPackageName()是你当前类的包名,0代表是获取版本信息
            PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
            return packageInfo.versionCode;
        }
    
    
    }
    
    

    AndroidManifest中的配置

      <!-- 7.0安装 -->
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="cn.xu.test.FileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
            </provider>
    

    在res下创建一个xml文件,在xml文件下创建file_paths.xml文件

    
    <paths>
    <external-path
        name="files_root"
        path="Android/data/cn.soujianzhu/" />
    <external-path
        name="external_storage_root"
        path="." />
    </paths>
    

    到这里就基本上完成了,如果安装上还是出现解析包错误的话,就在AndroidManifest加上一下权限

      <!-- 8.0手机安装软件 -->
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
        <!-- 允许装载和卸载文件系统权限 -->
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    

    好啦,到这里就完成了,我在开发中遇到解析包出现错误就是这么操作的,然后解决了,今天拿出来和大家分享,共同成长!

    展开全文
  • Android应用解析包错误的原因 导致这个问题的原因目前就我所知道的而言大致有四种: 一、使用v1、v2方式签名带来的问题 二、Android7.0新特性导致的原因 三、应用内更新没有读取权限导致的安装包解析失败 一...

    Android应用解析包错误的原因

    导致这个问题的原因目前就我所知道的而言大致有三种(其他原因请看文章末尾):

    • 一、使用v1、v2方式签名带来的问题
    • 二、Android7.0新特性导致的原因
    • 三、应用内更新没有读取权限导致的安装包解析失败

    一、使用V1、v2方式签名的问题

    既然说到所谓的v1、v2签名,那么我们首先要知道啥是v1、v2签名,它们有什么作用,它们的区别在什么地方。知道了这些之后你就会基本搞明白为什么有时候会出现安装失败的情况出现。

    1、什么是v1、v2签名

    V1签名:即Jar Signature,可以理解为只对jar进行了签名;
    V2签名:即Full Apk Signature,可以看成是对整个Apk文件进行签名;
    比较官方的说法是: 这个签名(v2)是在整个APK文件的二进制内容上计算和验证的,而不是在v1的归档文件中解压缩文件内容

    2、使用V1或V2签名的apk有那些区别

    单独的对Apk进行V1或v2签名会产生什么样的结果:

    • V1:在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改------文件可以移动,甚至可以重新压缩。即可以对签名后的文件在进行处理。
    • V2:v2签名验证了归档中的所有字节,而不是单独的ZIP条目;这就造成了如果你在构建过程中有任何定制任务,包括篡改或对Apk文件进行加固,请尽量不要使用它们,否则可能会导致你的v2签名失效,从而使你的APKs与Android 7.0和以上版本不兼容。

    V2签名是在Android Studio2.2后google推出的新的签名方式,那么相比于V1签名它有那些优点:

    1. 由于它是对整个apk文件进行签名,而一些对apk的篡改和处理可能会使签名失效,因此很显然的可以看出:它是一种更加安全的签名方式。
    2. 使用V2方式签名的apk要花更少的时间在设备上验证(不需要解压),从而加快了应用安装时间。
    3. 使用V2签名的安装包比使用v1签名的安装包的体积更小。
    3、两种签名方式如何选择

    到这里相信你已经对这两种签名方式有了一定的理解,那么在实际应用中我们应该如何选择呢?

    1、 如果要支持 Android 7.0 以下版本,那么尽量同时选择两种签名方式,但是一旦遇到签名问题,可以只使用 v1 签名方案;
    2、如果需要对签名后的信息做处理修改,那就使用v1签名方案;
    3、如果最后遇到各种不同的问题,可以不勾选v1和v2,直接打包签名。

    二、Android7.0新特性导致安装包解析失败

    Android7.0引入私有目录被限制访问和StrictMode API 。即在Android7.0私有目录下将被限制访问;StrictMode API是指禁止向你的应用外公开 file:// URI,如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,则会报出异常。
    如果我们在代码中:
    Intent install = new Intent(Intent.ACTION_VIEW); install.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive"); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(install);
    这在Android7.0及以上会使应用发生异常,解决方案就是我们可以使用FileProvider

    三、对文件没有读取权限导致的安装包解析失败

    首先我们应该知道一点,当我们在在应用内下载完安装包时,程序会调用我们的安装器离开我们的应用。这时会产生一个问题:我们下载的安装包在某些奇葩手机上写只有本应用有读写权限,当我们调用安装器时就离开了当前应用,安装器没有我们文件的读写权限。因此,会出现解析失败的情况。
    这个时候我们可以通过在代码中写入linux指令修改此apk文件的权限,改为全局可读可写可执行:
    String[] command = {"chmod", "777", file.getPath() }; ProcessBuilder builder = new ProcessBuilder(command); try { builder.start(); } catch (IOException e) { e.printStackTrace(); }

    其他情况

    • 文件损坏,或者文件被修改;
    • Android8.0权限问题,这不会导致解析包错误,但会报异常错误。需要在AndroidManifest.xml文件中添加权限"REQUEST_INSTALL_PACKAGES"。
    • 使用了第三方加固、多渠道打包工具(如:360加固)带来的兼容性问题,也是导致安装包解析失败的重要原因之一;所以建议开发者直接使用AS手动混淆代码和打包,尽量不要为了贪图方便使用第三方加固打包工具。
    • 对Apk的重复加固也会导致此问题。

    在此致谢:
    https://blog.csdn.net/francisbingo/article/details/78655848
    https://blog.csdn.net/willba/article/details/78885966

    展开全文
  • 版本更新时出现解析包错误

    千次阅读 2016-11-17 13:20:05
    问题场景是:软件从1.2.4升级到1.3.0的过程中出现了如题的问题即下载后安装时出现“解析包时出现问题”的错误后停止。而且不是所有的手机都会出现这个问题,在华为2.2系统的测试机上是可以成功安装的,而用魅族2X就...
     问题场景是:软件从
    1.2.4
    升级到
    1.3.0
    的过程中出现了如题的问题即下载后安装时出现“解析包时出现问题”的错误后停止。而且不是所有的手机都会出现这个问题,在华为
    2.2
    系统的测试机上是可以成功安装的,而用魅族
    2X
    就不行。 
    

           首先我怀疑下载的apk包的时候出现了问题,或许是在数据流传输的过程中丢包了,造成apk文件不完整。于是我查看了一下下载方法。发现程序中是用File.createTempFile的方法进行下载的,而使用File.createTempFile方法下载的文件,在不同Android系统下文件的存储位置不同。

           在android1.6android2.2android2.3.x系统下,用File.createTempFile方法创建的文件会存放到sd卡上;在android 4.1.1系统下,则会将临时文件存放到/data/data/应用包名/cache目录下,而这个目录仅对本应用程序有读写权限,所以当程序下载成功后发送意图(Intent)给系统安装时,系统安装程序没有访问该文件的权限,于是系统就会打印“ Permission denied ”的log,弹出“解析包时出现错误”。

           因为魅族2XFlyme2.0系统是基于Android4.1系统修改的,所以会出现这个问题。

    那么我们如何解决这个问题呢,我的解决方法是,让系统自带的浏览器去下载,如此一来下载下来的apk包文件就不会存在权限不足的问题了。


    我这里使用的是HttpUtils.download进行下载的这个方法参数的意义:


    /**
                     * 参数一:下载地址,参数二:下载到的本地的路径,
                     * 参数三:如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。
                     * 参数四:如果从请求返回信息中获取到文件名,下载完成后自动重命名。
                     */


    1. Intent intent = new Intent();  
    2. intent.setAction("android.intent.action.VIEW");  
    3. Uri content_url = Uri.parse(url);  
    4. intent.setData(content_url);  
    5. startActivity(intent); 


          很有可能是因为路径问题,最好不要写成sdcard/Download/,这样就可能出现解析包错误,建议改成 Environment.getExternalStorageDirectory()+"/Download/",就不会出现解析包的问题了


    展开全文
  • android 解析包时出现问题 常见原因: 下载的apk与安装的apk路径不一致(对比路径) apk没有下载完全(比较下载的apk大小与打包时的大小) debug分析原因: apk的下载路径和安装路径一致, 但是...

    参考:connection.getContentLength()为负值
    android 解析包时出现问题

    常见原因:

    下载的apk与安装的apk路径不一致(对比路径)

    apk没有下载完全(比较下载的apk大小与打包时的大小)

    debug分析原因:

    apk的下载路径和安装路径一致,

    但是HttpURLConnection.getContentLength()为-1,设置下载进度条最大失败,从而 导致apk下载不全。

    后台设置请求头获取长度以前是Accept-Length,后来改为Content-Length即可。

    获取 文件总大小的方法:

    
                    //方式一:请求头:Accept-Length
                    String b = connection.getHeaderField("Accept-Length");
                    int c = connection.getHeaderFieldInt("Accept-Length", 0);
    
                    //方式二:请求头:Content-Length
                    int fileSize = connection.getContentLength();
                    System.out.println("fileSize====" + fileSize / 1024.00 / 1024.00);
                    System.out.println("b====" + b);
                    System.out.println("c====" + c / 1024.00 / 1024.00);
    展开全文
  • vivo手机解析包错误解决方式

    万次阅读 2018-04-29 09:31:03
    一.
  • 最近遇到一个问题,有个别用户在应用内更新版本会出现解析包失败的情况,而且有的机型还是必现,浏览器下载就没问题,应用内就有问题,这就很让人费解,之前一直没关注过这种情况,但是用户就是上帝,有问题必须得...
  • ![安装代码](https://img-ask.csdn.net/upload/201711/06/1509957617_117292.png)![apk路径]...[错误信息](https://img-ask.csdn.net/upload/201711/06/1509957929_34794.png)
  • 最近在做一个项目,在实现程序自动更新功能时,程序下载成功了,但是报“解析软件包时错误“,此问题困扰了我好久,从网上找的解决方法也都不管用,后台自己排查了下代码,发现文件目录不对引起的,在这里贴一下,做...
  • 更新应用程序安卓apk时出现解析程序时出现问题

    万次阅读 热门讨论 2017-04-14 09:26:34
    在一次工作中,需求是进入应用程序splash时检测版本,发现新版本提示用户进行更新更新好后就自动跳转安装界面。 我当时是把用户点击更新下载后的apk存放到data/data/packageName/files这个目录下,是通过...
  • APK解析签名错误!无法获取签名信息,请上传有效(110506)
  • 本人X21屏下指纹版,PD1728UD_A_1.21.5版本,用AS一直“解析包错误”,按照以下方法解决。   转载自:https://blog.csdn.net/qq895767507/article/details/80271933 今天刚拿到vivo x21 屏下指纹版测试机,...
  • 最近遇到一个很奇怪的事情,在测试APP升级版本的时候,出现了一个 “解析安装包错误”.....导致更新下载的APK 安装不了...  根据网页查到的资料,总结了一下原因 1.下载下来的文件命名错误,不能有空格 2.下载...
  • settings 该处打钩去掉
  • AndroidStudio运行apk时,vivo部分手机出现 解析软件包错误提示,安装失败; 解决方法: Androidstudio ——&gt; File ——&gt; Settings ——&gt; Build,Execution,Deployment ——&gt;Instant Run ...
  • 安卓APP检测到新版本,用户同意更新后,就到服务器下载最新的APP,下载到一个文件夹内,通过固定写法: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"+filePath), ...
  • 在工作的时候,使用android studio开发,调试工具是android7.1.1手机vivo x20...网上的相关问题都是用户在商城下载时,或者在更新时安装apk文件时候的情况。其实差不多,他们下载的也是我们android studio开发出...
  • 华为手机安装apk报解析错误的问题

    千次阅读 2019-06-20 15:55:04
    <application android:name="com.ioidea.mesh.light.TelinkMeshApplication" android:allowBackup="true" android:appComponentFactory="" android:icon="@mipmap/logo" ...
  • Android 9.0 安装包解析错误

    千次阅读 2019-09-19 16:02:30
    Android studio打包的debug和release 安装到android9.0版本 提示安装包解析错误,因为之前在 manifest文件里面为了解决androidx冲突问题,在application加入了以下两行: android:appComponentFactory="" ...
  • 出现APK安装包解析错误问题说明

    千次阅读 2019-01-06 08:34:13
    KM盒子生成APK安装包出现解析错误的问题,通常重新生成再安装就可以了。 出现这个问题的原因常通是,一是资源文件版本签名不一致,二是打包过程部分文件缺失或损坏, 1、导致制作过程部分文件损坏或缺失的原因,...
  • 今天测试weex build android 命令打包成apk文件之后再安卓上安装出现“安装包解析错误”,但是用 weex run android 生成的可以直接安装,后面上网查了一下发现是apk没有签名的原因,特此记录一下。 可以去下载360...
  • 可能你手机安卓系统低于安装包最低支持的安卓系统版本
  • 前一周公司要求学习android 开发,安装好环境,今天做了一个小页面后,使用build 命令打包好后,手机提示手机提示安装包解析失败。在此记录一下在网上找到的解决方法。 打包命令 打包后的apk 小米6手机安装 一...
  •  2、如果重新下载也解决不了安卓解析包出现问题的话,很大一个可能就是在于你的手机的配置参数不支持这款软件,举个例子吧,如果一款apk程序的系统版本要求在安卓2.2以上,而你的手机则是安卓2.1系统,就会出现...
  • 程序包解析处理的第二种方法
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的...特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    转载自: ... 软件测试面试题汇总 测试技术面试题 ...........................................................................................................
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    数据库系统概论前七章习题解析 第1章绪论 1.试述数据、数据库、数据库系统、数据库管理系统的概念。答: (l)数据(Data):描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,655
精华内容 67,462
关键字:

更新软件解析包错误