Android 下载App
转载:http://blog.csdn.net/aicpzl/article/details/52993074
通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可用在软件更新等场合。
添加权限
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Activity源码
- package com.example.administrator.downloadtest;
- import android.app.Activity;
- import android.app.DownloadManager;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.net.Uri;
- import android.os.Bundle;
- import android.view.View;
- import android.webkit.MimeTypeMap;
- import android.widget.Button;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btDownload = (Button) findViewById(R.id.bt_download);
- btDownload.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- downloadApk();
- }
- });
- /**注册下载完成广播**/
- registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
- }
- /**下载APK**/
- private void downloadApk() {
- String apkUrl = "http://192.168.1.1/downloadtest.apk";
- Uri uri = Uri.parse(apkUrl);
- DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
- DownloadManager.Request request = new DownloadManager.Request(uri);
- // 设置允许使用的网络类型,这里是移动网络和wifi都可以
- request.setAllowedNetworkTypes(request.NETWORK_MOBILE| request.NETWORK_WIFI);
- //设置是否允许漫游
- request.setAllowedOverRoaming(false);
- //设置文件类型
- MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
- String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(apkUrl));
- request.setMimeType(mimeString);
- //在通知栏中显示
- request.setNotificationVisibility(request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- request.setTitle("download...");
- request.setVisibleInDownloadsUi(true);
- //sdcard目录下的download文件夹
- request.setDestinationInExternalPublicDir("/download", "downloadtest.apk");
- // 将下载请求放入队列
- downloadManager.enqueue(request);
- }
- private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- /**下载完成后安装APK**/
- installApk();
- }
- };
- private void installApk() {
- Intent i = new Intent(Intent.ACTION_VIEW);
- String filePath = "/sdcard/download/downloadtest.apk";
- i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");
- startActivity(i);
- }
- }
- package com.cardvalue.sys.activitys;
- import java.io.File;
- import java.io.UnsupportedEncodingException;
- import java.net.URLEncoder;
- import java.util.Date;
- import java.util.Map;
- import java.util.Set;
- import android.annotation.SuppressLint;
- import android.app.DownloadManager;
- import android.app.ProgressDialog;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.database.Cursor;
- import android.net.ConnectivityManager;
- import android.net.NetworkInfo;
- import android.net.Uri;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.RelativeLayout;
- import cn.jpush.android.api.InstrumentedActivity;
- import cn.jpush.android.api.JPushInterface;
- import cn.jpush.android.api.TagAliasCallback;
- import com.cardvlaue.sys.R;
- import com.cardvalue.sys.annotation.EControl;
- import com.cardvalue.sys.annotation.EventType;
- import com.cardvalue.sys.annotation.FCallHandler;
- import com.cardvalue.sys.annotation.FControl;
- import com.cardvalue.sys.common.CMessage;
- import com.cardvalue.sys.common.MD5Util;
- import com.cardvalue.sys.common.MessageBox;
- import com.cardvalue.sys.common.MyApplication;
- import com.cardvalue.sys.newnetwork.BusinessServices;
- import com.cardvalue.sys.newnetwork.Config;
- import com.cardvalue.sys.newnetwork.Convert;
- import com.cardvalue.sys.newnetwork.CustomHandler;
- import com.cardvalue.sys.newnetwork.UserServices;
- import com.cardvalue.sys.newnetwork.Utiltools;
- import com.cardvalue.sys.widget.WelcomeDialog;
- import com.cardvalue.sys.widget.WelcomeDialog.onAttendOrNotListener;
- import com.cardvalue.sys.widget.WelcomeDialog.onCancelListener;
- //import com.tencent.stat.StatService;
- /**
- * 欢迎页面
- */
- public class WelcomeActivity extends InstrumentedActivity {
- private Map<String, Object> active = null; // 活动页的相关信息
- private Map<String, Object> showIcon = null; // 首页显示的图标
- public CustomHandler handler;
- public ProgressDialog dialog;
- public UserServices userService = new UserServices();
- public BusinessServices businessService = new BusinessServices();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.welcome);
- // StatService.trackCustomEvent(this, "onCreate", "");
- EControl control = new EControl(this);
- control.setOnClickLisenner(clickLinstenner); // 设置所有的点击事件
- control.InitControl(); // 开始初始化控件
- handler = new CustomHandler(this); // 初始化handler
- dialog = new ProgressDialog(this);
- JPushInterface.init(getApplicationContext());
- Utiltools.printE("Jpush data=========>"
- + JPushInterface.getRegistrationID(this));
- handler.sendMessage(handler.obtainMessage(MSG_SET_ALIAS, "android"));
- userService.setValue(this, handler, CMessage.NET_MSG_GETNEWVERSION);
- if (hasNetworkAvailable()) {
- userService.getVersionInformation();
- } else {
- MessageBox.ToastShow("没有可用网络连接,请检查你的网络!", WelcomeActivity.this);
- // 没有网络的时候直接到home页
- handler.sendEmptyMessageDelayed(NORMAL_MSG_HOME, 3000);
- }
- }
- /***********************************************************************************************************************************************
- * 定义控件,并指定控件对应的ID
- ***********************************************************************************************************************************************/
- @FControl(id = R.id.imageView1)
- public ImageView bg1; // 第一张背景图
- @FControl(id = R.id.imageView2, eventType = EventType.ON_CLICK)
- public ImageView bg2; // 第二张背景图
- @FControl(id = R.id.btn, eventType = EventType.ON_CLICK)
- public Button button; // 跳过按钮
- @FControl(id = R.id.ry_wecome)
- public RelativeLayout wLayout; // 第二张背景图及按钮的布局
- /*********************************************************************************************************************************************
- * 处理所有的onclick事件
- *********************************************************************************************************************************************/
- public OnClickListener clickLinstenner = new OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.imageView2: // 按下了活动图片后触发
- String isForward = (String) active.get("forwardType"); // 判断是否跳转
- if (isForward.equals("1")) {
- handler.removeMessages(NORMAL_MSG_LOGIN);
- Intent intent = new Intent(WelcomeActivity.this,
- LoadWebPage.class);
- intent.putExtra("title", "活动规则");
- intent.putExtra("welcome", "welcome");
- intent.putExtra("url", (String) active.get("forwordUrl"));
- startActivity(intent);
- WelcomeActivity.this.finish();
- }
- break;
- case R.id.btn: // 按下了跳过按钮
- handler.removeMessages(NORMAL_MSG_LOGIN);
- startActivity(new Intent(WelcomeActivity.this, Home.class));
- WelcomeActivity.this.finish();
- break;
- }
- }
- };
- /**
- * 获取最新的服务器版本信息
- */
- @SuppressWarnings("unchecked")
- @FCallHandler(id = CMessage.NET_MSG_GETNEWVERSION)
- public void getNewVersion() {
- handler.tempMap = (Map<String, Object>) handler.resultMap
- .get("resultData");
- int clientCode = Utiltools.getAppVersionCode(this); // 客户端的版本code
- int serverCode = Integer.parseInt(handler.tempMap.get("versionCode")
- .toString()); // 服务端的版本code
- final String isForceUpdate = handler.tempMap.get("isForceUpdate")
- .toString(); // 是否强制更新 0不强制更新(可以选择) 1:必须更新
- active = (Map<String, Object>) handler.tempMap.get("welecomeSet");
- Utiltools.printE("handler.tempMap" + "=====" + handler.tempMap);
- Utiltools.printE("Convert.convertMap(active).size()" + "====="
- + Convert.convertMap(active).size());
- if (Convert.convertMap(active).size() != 0) {
- // http://www.cvbaoli.com/webak/resources/newm/images/welcome/welcome640-1136.png
- String imgUrl = Config.getWeixinIp() + "resources/image/welcome/"
- + (String) active.get("picName") + "640-1136."
- + (String) active.get("suffix");
- Utiltools.loadPic(this, imgUrl, bg2, R.drawable.welcome2,
- R.drawable.welcome2); // 加载网络图片
- Utiltools.printE("imgUrlimgUrl");
- } else {
- Utiltools.loadPic(this, "", bg2, R.drawable.welcome2,
- R.drawable.welcome2);
- Utiltools.printE("imgUrlimgUrl" + "===4444===");
- }
- // msg 中的内容根据是否强制更新的不同而进行改变
- String msg = isForceUpdate.equals("0") ? Utiltools
- .getString(R.string.updateSystem) : Utiltools
- .getString(R.string.needUpdateSystem);
- final WelcomeDialog mwelComeDialog = new WelcomeDialog(
- WelcomeActivity.this, msg);
- if (serverCode > clientCode) {// 服务器大于本地 就要更新
- onAttendOrNotListener welCome = new onAttendOrNotListener() {
- @SuppressLint("NewApi")
- @Override
- public void AttendOrNot() {
- MessageBox.show(dialog, "", "正在下载最新版本,请稍后...");
- String url = handler.tempMap.get("url").toString();
- DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
- DownloadManager.Request request = new DownloadManager.Request(
- Uri.parse(url));
- request.setDestinationInExternalPublicDir("/cardvalue",
- "cardvalue.apk");
- request.setVisibleInDownloadsUi(true);
- request.setTitle("卡得万利");
- downloadManager.enqueue(request);
- }
- };
- onCancelListener onCancel = new onCancelListener() {
- @Override
- public void Cancel() {
- if (isForceUpdate.equals("1")) {
- mwelComeDialog.cancel();
- WelcomeActivity.this.finish();
- } else {
- handler.sendEmptyMessage(NORMAL_MSG_START);
- mwelComeDialog.cancel();
- }
- }
- };
- mwelComeDialog.setOnAttendOrNotListener(welCome);
- mwelComeDialog.setCancelListener(onCancel);
- mwelComeDialog.show();
- } else {
- handler.sendEmptyMessage(NORMAL_MSG_START);
- }
- }
- /**
- * 开始正常的流程
- */
- @FCallHandler(id = NORMAL_MSG_START)
- public void startProcess() {
- Utiltools.printE("开始正常的流程=====" + Convert.convertMap(active).size());
- if (Convert.convertMap(active).size() == 0) {
- handler.sendEmptyMessageDelayed(NORMAL_MSG_LOGIN, 3000); // 5秒以后进入登录页
- return;
- }
- bg1.setVisibility(View.GONE); // 设置背景1层消失
- wLayout.setVisibility(View.VISIBLE); // 设置背景层显示
- bg2.setVisibility(View.VISIBLE); // 设置背景2层的图片显示
- button.setVisibility(View.VISIBLE); // 设置背景2层的按钮显示
- handler.sendEmptyMessageDelayed(NORMAL_MSG_LOGIN, 5000); // 5秒以后进入登录页
- }
- @FCallHandler(id = NORMAL_MSG_HOME)
- public void home() {
- startActivity(new Intent(WelcomeActivity.this, Home.class));
- WelcomeActivity.this.finish();
- }
- /**
- * 开始登陆操作
- */
- @FCallHandler(id = NORMAL_MSG_LOGIN)
- public void login() {
- Utiltools.printE("LOGIN====LOGIN");
- String username = MyApplication.getApplication().getLocalCache()
- .getString("username"); // 获取用户名
- String password = MyApplication.getApplication().getLocalCache()
- .getString("password"); // 获取密码
- if (username.equals("") || password.equals("")) {
- startActivity(new Intent(WelcomeActivity.this, Home.class));
- WelcomeActivity.this.finish();
- return;
- }
- String pushId = JPushInterface.getRegistrationID(this);
- long data = System.currentTimeMillis() / 1000;
- String pass1 = MD5Util.MD5(MD5Util.MD5(password) + "cvbaoli" + data)
- + "|" + data;
- try {
- userService.setValue(WelcomeActivity.this, handler,
- CMessage.NET_MSG_LOGIN);
- userService.login(username, URLEncoder.encode(pass1, "utf8"),
- "mj_"+pushId, null);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- /**
- * 登陆成功后的操作
- */
- @FCallHandler(id = CMessage.NET_MSG_LOGIN)
- public void loginSuccess() {
- dialog.cancel();
- MyApplication.getApplication().setLogin(true);
- MyApplication.getApplication().getLocalCache()
- .putString("exirDate", String.valueOf(new Date().getTime()));
- startActivity(new Intent(WelcomeActivity.this, Home.class));
- WelcomeActivity.this.finish();
- }
- /**
- * 下载完成后广播接收类
- */
- class DownloadCompleteReceiver extends BroadcastReceiver {
- @SuppressLint("NewApi")
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
- DownloadManager downloadManager = (DownloadManager) context
- .getSystemService(Context.DOWNLOAD_SERVICE);
- DownloadManager.Query query = new DownloadManager.Query();
- query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);
- Cursor c = downloadManager.query(query);
- // 获取文件名并开始安装
- if (c.moveToFirst()) {
- String fileName = c.getString(c
- .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
- fileName = fileName.replace("file://", "");
- File file = new File(fileName);
- Utiltools.print("weiweina", "file = " + fileName);
- Intent intent1 = new Intent(Intent.ACTION_VIEW);
- intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent1.setDataAndType(Uri.fromFile(file),
- "application/vnd.android.package-archive");
- startActivity(intent1);
- WelcomeActivity.this.finish();
- }
- }
- }
- }
- // 注册广播
- public DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
- @Override
- protected void onResume() {
- registerReceiver(receiver, new IntentFilter(
- DownloadManager.ACTION_DOWNLOAD_COMPLETE));
- super.onResume();
- }
- @Override
- protected void onDestroy() {
- if (receiver != null)
- unregisterReceiver(receiver);
- super.onDestroy();
- }
- /****************************************************************************************************************************************
- * 自定义消息
- ****************************************************************************************************************************************/
- private static final int NORMAL_MSG_START = 1; // 进入正常流程消息
- public static final int NORMAL_MSG_LOGIN = 2; // 开始进行登陆操作
- public static final int NORMAL_MSG_HOME = 3; // 延迟3秒到首页
- public static final int MSG_SET_ALIAS = 10001;
- public static final String MESSAGE_RECEIVED_ACTION = "com.cardvlaue.sys.MESSAGE_RECEIVED_ACTION";
- public static final String KEY_TITLE = "title";
- public static final String KEY_MESSAGE = "message";
- public static final String KEY_EXTRAS = "extras";
- private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
- @Override
- public void gotResult(int code, String alias, Set<String> tags) {
- switch (code) {
- case 6002:
- if (isConnected(getApplicationContext())) {
- handler.sendMessageDelayed(
- handler.obtainMessage(MSG_SET_ALIAS, alias),
- 1000 * 60);
- }
- break;
- }
- }
- };
- public static boolean isConnected(Context context) {
- ConnectivityManager conn = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo info = conn.getActiveNetworkInfo();
- return (info != null && info.isConnected());
- }
- @FCallHandler(id = MSG_SET_ALIAS)
- public void setAlias() {
- Utiltools.print("极光调用了......................");
- JPushInterface.setAliasAndTags(getApplicationContext(),
- (String) handler.msg.obj, null, mAliasCallback);
- }
- /**
- * 判断网络是否连接
- */
- private boolean hasNetworkAvailable() {
- ConnectivityManager cm = (ConnectivityManager) this
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- if (cm == null) {
- return false;
- } else {
- NetworkInfo[] info = cm.getAllNetworkInfo();
- if (info != null) {
- for (int i = 0; i < info.length; i++) {
- if (info[i].getState() == NetworkInfo.State.CONNECTED) {
- return true;
- }
- }
- }
- }
- return false;
- }
- }
Android 下载App的更多相关文章
- 分享我开发的网络电话Android手机APP正式版,图文详解及下载
分享我开发的网络电话Android手机APP正式版,图文详解及下载 分享我开发的网络电话Android手机APP正式版 实时语音通讯,可广域网实时通讯,音质清晰流畅! 安装之后的运行效果: 第一次安装 ...
- 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)
在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就没有一个可以用的.安卓端可以给人一种定制和精美的感觉,这是网页所做不到 ...
- 推荐下载App,如果本地安装则直接打开本地App(Android/IOS)
推荐下载App,如果本地安装则直接打开本地App(Android/IOS) - 纵观现在每家移动网站,打开首页的时候,都有各种各样的形式来提示你下载自身的移动App(Android/IOS),这是做移 ...
- 通过扫码打开IOS的App Store下载APP(Android版暂时没找到解决方法)
项目需求:扫码根据不同平台下载不同版本的APP.主要是ios和Android. 网上找了很多,前面判断平台的代码很容易找到,但是后面的就有些坑了.有的人的是根本跑不通.有的是代码补全. 下面是 微信扫 ...
- Cordova 打包 Android release app 过程详解
Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...
- Android 下载文件及写入SD卡
Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- 手机扫描二维码下载APP,根据操作系统不同自动下载
Android和IOS手机扫描二维码下载APP,根据OS不同,自动处理相应下载操作.IOS自动跳转至AppStore应用下载页,Android自动下载应用的apk包. <script type= ...
- Android 下载模块分析(DownloadManager和DownloadProvider)
Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvid ...
- 微信扫码下载APP
前段时间开发过程中,要实现一个扫描二维码下载APP的功能,但是苹果系统中,微信不可以直接跳转苹果商店,需要先下载应用宝,显然太麻烦... 这样我们可以做个中间页,用中间页面生成二维码链接,在中间页代码 ...
随机推荐
- 分布式架构的基石.简单的 RPC 框架实现(JAVA)
前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...
- 二、xadmin----简单使用
1.中文设置: settings.py中直接配置: LANGUAGE_CODE = "zh-hans" TIME_ZONG = "Asia/Shanghai" ...
- long double
long double 输入输出 scanf("%Lf",&a); printf("%.20Lf\n",a);
- IP核引发的关于定,浮点数的认识
上面是一段关于CORDIC_IP测试文件,用于计算给定角度的sin值和cos值,关于数值表示规则在此不再重复,仅仅说明以下3点: 1 数采用原码,反码,补码,本身并没有正确与否之分(这一点很重要,我 ...
- Python删除list里面的重复元素的俩种方法
1.使用set函数 In [116]: a=[1,2,3,2,1,3,4,5,6,5] In [117]: set(a) Out[117]: {1, 2, 3, 4, 5, 6} 2.使用字典函数 ...
- Python_阻塞IO、非阻塞IO、IO多路复用
0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...
- asp.net mvc Areas 母版页动态获取数据进行渲染
经常需要将一些通用的页面元素抽离出来制作成母版页,但是这里的元素一般都是些基本元素,即不需要 进行后台数据交换的基本数据,但是对于一些需要通过后台查询的数据,我们应该怎么传递给前台的母版页呢 这里描述 ...
- 通过arcmap发布缓存服务,无法选择自定义方案
出现该问题是因为缓存目录有该缓存信息,清楚掉之后就可以选择自定义方案了
- LLVM的安装
1. 官网下载 llvm 2. 官网下载cmake 3. configure 执行 llvm 发现报错 4. 解压缩 cmake 5.将cmake 下面的bin 目录放到环境变量里面去 6. 创建一个 ...
- for循环游标