通过U盘更新程序

流程:监听U盘插拔事件,弹出对话框询问是否升级,如果升级则调用升级模块。

 

 

package com.updatedemo;

import java.io.File;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager.NameNotFoundException;
import android.text.style.UpdateAppearance;
import android.text.style.UpdateLayout;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {



	private String TAG = "UdiskUpdateDemo";
	private String path = "/mnt/usbhost0/123.apk";
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		udiskPluggedin(); // 监听U盘热插拔模块启动
		Log.i(TAG, "VesionName: " + getVesionName(this));
		Log.i(TAG, "VesionCode: " + getVersionCode(this));
		Log.i(TAG, "getPackageName: " + this.getPackageName());

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	/******************************
	 * 模块1:检测U盘热插拔事件
	 * 
	 * 使用IntentFilter来选择接收广播的类型
	 * 注册一个广播接收者来处理接收到广播的事件
	 * 
	 *****************************/

	/* 监听U盘插拔 */
	private void udiskPluggedin() {

		IntentFilter filter = new IntentFilter();
		filter.addAction("android.hardware.usb.action.USB_STATE");
		filter.addAction("android.hardware.action.USB_DISCONNECTED");
		filter.addAction("android.hardware.action.USB_CONNECTED");

		filter.addAction("android.intent.action.UMS_CONNECTED");
		filter.addAction("android.intent.action.UMS_DISCONNECTED");
		// filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
		// filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
		// filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
		// filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
		filter.addAction(Intent.ACTION_MEDIA_CHECKING);
		filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
		filter.addAction(Intent.ACTION_MEDIA_EJECT);
		filter.addAction(Intent.ACTION_MEDIA_REMOVED);
		filter.addDataScheme("file");// 系统中每个组件,如果想收取隐式事件(未指定接收者),则必须声明自己的IntentFilter(自我介绍,我对什么样的信件感兴趣)。
		UdiskReceiver mReceiver = new UdiskReceiver();
		registerReceiver(mReceiver, filter);

	}

	private class UdiskReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context arg0, Intent arg1) {

			String action = arg1.getAction();
			Log.v(TAG, "action = " + action);
			if (action.equals(Intent.ACTION_MEDIA_CHECKING)) {
				// Toast.makeText(getApplicationContext(), "正在挂载U盘",
				// Toast.LENGTH_SHORT).show();
				Log.i(TAG, "正在挂载U盘");
			} else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
				Toast.makeText(getApplicationContext(), "U盘挂载成功",
						Toast.LENGTH_SHORT).show();
				Log.i(TAG, "U盘挂载成功");

				// 显示是否更新对话框
				try {
					showUpdateDialog();
				} catch (NameNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				/*
				 * Intent intent = new Intent();
				 * intent.setClassName("com.serviatech.test",
				 * "com.serviatech.test.activity.UpdateActivity");
				 * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//
				 * Intent.FLAG_ACTIVITY_CLEAR_TOP | startActivity(intent);
				 */
			} else if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
				Toast.makeText(getApplicationContext(), "U盘已移除",
						Toast.LENGTH_SHORT).show();
			}
		}

	}

	/******************************
	 * 模块2:获取apk版本信息
	 * 
	 * AndroidManifest.xml中定义的
	 * android:versionName 和 VersionCode 信息。	 * 
	 * 
	 *****************************/
	/*
	 * 功能:获取apk的VesionName,即AndroidManifest.xml中定义的android:versionName
	 */
	public String getVesionName(Context context) {
		String versionName = null;
		try {
			versionName = context.getPackageManager().getPackageInfo(
					context.getPackageName(), 0).versionName;
		} catch (NameNotFoundException e) {
			Log.e(TAG, e.getMessage());
		}

		return versionName;
	}

	// 功能:获取apk的versionCode,即AndroidManifest.xml中定义的android:versionCode

	public int getVersionCode(Context context) {
		int versionCode = 0;
		try {
			versionCode = context.getPackageManager().getPackageInfo(
					context.getPackageName(), 0).versionCode;
		} catch (NameNotFoundException e) {
			Log.e(TAG, e.getMessage());
		}

		return versionCode;
	}

	
	
	/********************
	 * 模块3:弹出是否更新对话框   
	 * 
	 * *****************/

	private void showUpdateDialog() throws NameNotFoundException {

		StringBuffer sb = new StringBuffer();
		sb.append("当前版本:");
		sb.append(getVesionName(this));
		sb.append("     VerCode:");
		sb.append(getVersionCode(this));
		sb.append("\n是否更新?");
		Dialog dialog = new AlertDialog.Builder(MainActivity.this)
				.setTitle("软件更新")
				.setMessage(sb.toString())
				// 设置内容
				.setPositiveButton("更新", // 设置确定按钮
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								// TODO Auto-generated method stub

								/**************
								 * 更新核心代码
								 * 
								 * ***********/
								String fileName = path;
								Uri uri = Uri.fromFile(new File(fileName));

								Intent intent = new Intent(Intent.ACTION_VIEW);
								intent.setDataAndType(uri,
										"application/vnd.android.package-archive");
								startActivity(intent);
							}
						})
				.setNegativeButton("暂不更新",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int whichButton) {
								// 点击"取消"按钮之后退出程序
								finish();
							}
						}).create();// 创建

		dialog.show();
	}
}

 

附:

		// 在最新的Android版本中,android.hardware.USB是一个新增类
		filter.addAction("android.hardware.usb.action.USB_STATE");
		filter.addAction("android.hardware.action.USB_DISCONNECTED");
		filter.addAction("android.hardware.action.USB_CONNECTED");
		// 设备进入 USB 大容量存储模式
		filter.addAction("android.intent.action.UMS_CONNECTED");
		// 设备从 USB 大容量存储模式退出
		filter.addAction("android.intent.action.UMS_DISCONNECTED");
		// 插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播?
		filter.addAction(Intent.ACTION_MEDIA_CHECKING);
		// 插入SD卡并且已正确安装(识别)时发出的广播
		filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
		// 已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播
		filter.addAction(Intent.ACTION_MEDIA_EJECT);
		// 广播:扩展介质被移除。
		filter.addAction(Intent.ACTION_MEDIA_REMOVED);


 


 

 相关文章:

            Android 程序自动更新

            Android应用开发笔记(12):Android应用的自动升级、更新模块的实现

            apk在线升级

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值