Android下载并安装APK

通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可用在软件更新等场合。

添加权限

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

Activity源码

[java]  view plain  copy
  1. package com.example.administrator.downloadtest;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.DownloadManager;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.IntentFilter;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.webkit.MimeTypeMap;  
  13. import android.widget.Button;  
  14.   
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         Button btDownload = (Button) findViewById(R.id.bt_download);  
  24.         btDownload.setOnClickListener(new View.OnClickListener() {  
  25.             @Override  
  26.             public void onClick(View v) {  
  27.                 downloadApk();  
  28.             }  
  29.         });  
  30.         /**注册下载完成广播**/  
  31.         registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));  
  32.     }  
  33.     /**下载APK**/  
  34.     private void downloadApk() {  
  35.         String apkUrl = "http://192.168.1.1/downloadtest.apk";  
  36.         Uri uri = Uri.parse(apkUrl);  
  37.         DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);  
  38.         DownloadManager.Request request = new DownloadManager.Request(uri);  
  39.         // 设置允许使用的网络类型,这里是移动网络和wifi都可以  
  40.         request.setAllowedNetworkTypes(request.NETWORK_MOBILE| request.NETWORK_WIFI);  
  41.         //设置是否允许漫游  
  42.         request.setAllowedOverRoaming(false);  
  43.         //设置文件类型  
  44.         MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();  
  45.         String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(apkUrl));  
  46.         request.setMimeType(mimeString);  
  47.         //在通知栏中显示  
  48.         request.setNotificationVisibility(request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);  
  49.         request.setTitle("download...");  
  50.         request.setVisibleInDownloadsUi(true);  
  51.         //sdcard目录下的download文件夹  
  52.         request.setDestinationInExternalPublicDir("/download""downloadtest.apk");  
  53.         // 将下载请求放入队列  
  54.          downloadManager.enqueue(request);  
  55.     }  
  56.   
  57.     private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {  
  58.         @Override  
  59.         public void onReceive(Context context, Intent intent) {  
  60.             /**下载完成后安装APK**/  
  61.             installApk();  
  62.         }  
  63.     };  
  64.   
  65.     private void installApk() {  
  66.         Intent i = new Intent(Intent.ACTION_VIEW);  
  67.         String filePath = "/sdcard/download/downloadtest.apk";  
  68.         i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");  
  69.         startActivity(i);  
  70.     }  
  71. }  


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;
	}
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值