关闭

apk更新代码

标签: apk更新
186人阅读 评论(0) 收藏 举报
分类:

把项目中用到的apk更新代码记录一下,留待后面用:

public class UpdateManager {
    private static final String TAG = "Update";
    private  String str_url;
    private static final String UPDATE_SAVENAME = "My.apk";
    private String SAVEPATH = getSDPath()+"/my/";
    private Context mContext;
    private TextView tv_progress;


    private Dialog downloadDialog;
    private ProgressBar mProgress;

    private static final int DOWN_UPDATE = 1;
    private static final int DOWN_OVER = 2;

    private int progress;
    private Thread downLoadThread;
    private boolean interceptFlag = false;
    private String msg;

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case DOWN_UPDATE:
                mProgress.setProgress(progress);
                tv_progress.setText(progress +"%");
                break;
            case DOWN_OVER:
                installApk();
                break;
            default:
                break;
            }
        };
    };

    public UpdateManager(Context context,String url,String mg) {
        this.mContext = context;
        //更改为绝对地址
        //this.str_url=urlIp+url;
        this.str_url=url;
        this.msg=mg;
    }



    public  void showDownloadDialog() {
        AlertDialog.Builder builder = new Builder(mContext);
        builder.setTitle("版本更新");
        builder.setMessage(msg);

        final LayoutInflater inflater = LayoutInflater.from(mContext);
        View v = inflater.inflate(R.layout.download_progress, null);
        mProgress = (ProgressBar)v.findViewById(R.id.pb_download);
        tv_progress=(TextView) v.findViewById(R.id.tv_progress);
        builder.setView(v);
    /*  builder.setPositiveButton("正在下载...", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                interceptFlag = true;
            }
        });*/
        downloadDialog = builder.create();
        downloadDialog.setCanceledOnTouchOutside(false);
        downloadDialog.show();
        downloadApk();
    }

    private Runnable mdownApkRunnable = new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(str_url);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.connect();
                int length = conn.getContentLength();
                InputStream is = conn.getInputStream();

                File file = new File(SAVEPATH);
                if (!file.exists()) {
                    file.mkdir();
                }
                System.out.println("+++++file+++++++"+file.getPath());
                String apkFile = SAVEPATH + UPDATE_SAVENAME;
                File ApkFile = new File(apkFile);
                if (!file.exists()) {
                    file.mkdir();
                }
                FileOutputStream fos = new FileOutputStream(ApkFile);

                int count = 0;
                byte buf[] = new byte[1024];

                do {
                    int numread = is.read(buf);
                    count += numread;
                    progress = (int) (((float) count / length) * 100);
                    mHandler.sendEmptyMessage(DOWN_UPDATE);
                    if (numread <= 0) {
                        mHandler.sendEmptyMessage(DOWN_OVER);
                        downloadDialog.dismiss();
                        break;
                    }
                    fos.write(buf, 0, numread);
                } while (!interceptFlag);

                fos.close();
                is.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    };


    private void downloadApk() {
        downLoadThread = new Thread(mdownApkRunnable);
        downLoadThread.start();
    }

    private void installApk() {
        File apkfile = new File(SAVEPATH + UPDATE_SAVENAME);
        if (!apkfile.exists()) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse("file://" + apkfile.toString()),
                "application/vnd.android.package-archive");
        mContext.startActivity(intent);

    }

    public String getSDPath(){ 
        File sdDir = null; 
        boolean sdCardExist = Environment.getExternalStorageState() 
        .equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在 
        if (sdCardExist) 
        { 
        sdDir = Environment.getExternalStorageDirectory();//获取跟目录 
        } 
        return sdDir.toString(); 

        } 

}

下载对话框中进度条的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/pb_download"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="15dp"
        android:padding="3dp"
        android:max="100" />
    <TextView android:id="@+id/tv_progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center"/>

</LinearLayout>

apk更新一般用这两种方法进行通知:
1. 使用消息推送,可以使用集成好的SDK,比如极光推送SDK,后台推送更新消息,让用户在Notification中选择更新与否。
2. 在应用程序打开界面中访问服务器,获取当前最新apk版本,与本地应用程序versionCode进行比较。

private void getVersionInfo() {
    PackageManager packageManager = getPackageManager();
    PackageInfo packageInfo;
    try {
        packageInfo = packageManager.getPackageInfo(getPackageName(),
                PackageManager.GET_ACTIVITIES);
        VERSION_CODE = packageInfo.versionCode;
        VERSION_NAME = packageInfo.versionName;
    } catch (NameNotFoundException e) {
    }

}
0
0
查看评论

Android实现App版本自动更新

现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:                  当我们点击检查更新的时候...
  • u013718120
  • u013718120
  • 2016-11-03 11:44
  • 15497

UpdateAppUtils一行代码实现app在线更新

UpdateAppUtils一行代码,快速实现app在线下载更新A simple library for Android update app 先看效果图: 集成compile引入dependencies { compile 'com.teprinciple:updateappu...
  • Teprinciple
  • Teprinciple
  • 2017-08-17 12:12
  • 551

安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现

前言本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取 一种是打开应用之后提醒用户更新升级 而更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升级操作也分为两种形式: 一般升级 强制升级 app升级操作: 应用市场的app升级 在Ap...
  • u013278099
  • u013278099
  • 2016-09-28 17:08
  • 25299

android APK更新原理以及代码实现

关于androidAPK版本升级,其实是很多APK必须的,现在就分享一下我对于APK更新原理的理解和代码实现。apk更新原理首先需要明白两点: 1:服务器需要提供URL1(服务器存储的apk版本信息) 2:服务器需要提供URL2(下载新版本apk文件)下面开始说一下APK升级原理: 1:我们需...
  • lmq121210
  • lmq121210
  • 2017-09-12 17:04
  • 547

升级apk和更新安装apk的整理

延迟展示对话框 (重点) private void initView() { .... //r:消息的执行操作 //delayMillis : 延迟时间,但是毫秒值 new Handler().postDelayed(new Runnable() { ...
  • kunkun5love
  • kunkun5love
  • 2018-01-31 16:51
  • 43

代码中执行apk安装、卸载、更新以及静默安装

import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.vie...
  • liliang497
  • liliang497
  • 2013-01-08 09:58
  • 14440

Android APK 更新之路

一、前言提到 APK 更新,大家可能会想到友盟(umeng)更新,市场上已有数万款应用在使用友盟自动更新的服务。但友盟于 2016 年 10 月 15 日起停止了更新服务。那么我们需要自己处理 APK 更新的业务。本篇主要讲解以下知识点: 使用 DownloadManager 更新 基于 RxJa...
  • u012551350
  • u012551350
  • 2016-12-03 22:49
  • 4967

Android关于apk版本更新方法

ios的软件版本更新必须要通过苹果的服务器,而android 却不需要,开发商可以在软件本身嵌套下载安装新版本的功能,对于此是否是个优点暂且不谈(个人感觉还是ios那样更负责人些,用户体验更好点),只将一下实现步骤。 android区分软件是通过包名,也就是所如果两个软件的包名完全相同,系统就...
  • xllily_11
  • xllily_11
  • 2015-10-16 10:00
  • 1760

Cocos2d-x3.1下 Android,APK自动升级

项目要做Android的自动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能。。。。。 不对说了。这里记录下我的实现过程。
  • qqMCY
  • qqMCY
  • 2014-07-03 22:23
  • 3250

react-native 实现apk版本自动更新(非js热更新)

前言(android篇):       react-native 作为facebook推出两年,现在应该说最火的移动技术。       当然作为一新的技术(或者说一种新的编码机制),这个对于前端开发者来说,是一种福音,因...
  • jiejiegua
  • jiejiegua
  • 2017-05-09 15:26
  • 4317
    个人资料
    • 访问:27607次
    • 积分:571
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:14篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论