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的功能,但是苹果系统中,微信不可以直接跳转苹果商店,需要先下载应用宝,显然太麻烦... 这样我们可以做个中间页,用中间页面生成二维码链接,在中间页代码 ...
随机推荐
- Linux iptables 命令
iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具.iptables 工具运行在用户态,主要是设置各种规则.而 netfilter 则运行在内核态,执行 ...
- 【开源】Westore Cloud 发布- 没后端没SQL没DBA,只需 javascript 开发云端小程序
Westore Cloud - 隐形云,NoBackEnd,NoSql,HiddenDB 好的设计便是感觉不到设计的存在 开发小程序,但是:没有后端!没有运维!没有 DBA!没有域名!没有证书!没有钱 ...
- Codeforces Round #486 (Div. 3)-C. Equal Sums
C. Equal Sums time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- Java Core - 序列化和反序列化
把对象转换为字节序列的过程称为对象的序列化 把字节序列恢复成对象的过程称为对象的反序列化 一.对象的序列化的应用: 1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中. 2.在网络上传送对象 ...
- Linux系统mysql使用(二)
一.查看某数据库的表 # 假设此时数据库名为hiveuse hive; show tables;
- Azure系列2.1 —— com.microsoft.azure.storage.blob
网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...
- Effective C++目录
条款1:视C++为一个语言联邦 条款2:尽量以const.enum.inline替换#define 条款3:尽可能使用const 条款4:确定对象使用前已先被初始化 条款5:了解C++默认编写并调用哪 ...
- jq简单仿上传文件
html: <div> <input id="lefile" type="file" style="display:none&quo ...
- MySQL5.5 安装配置方法教程
MySQL下载地址:http://dev.mysql.com/downloads/installer/ 1.首先进入的是安装引导界面 2.然后进入的是类型选择界面,这里有3个类型:Typical(典型 ...
- 搞了一下午时间全浪费在这了,其实是自己拷贝了patch文件,导致tab变成了空格的错
很老实的基于最新的kernel,源文件,修改了代码.通过diff -uNr --show-c-function dir1 dir2 > ipv6.patch制作了patch文件,准备代码上库构建 ...