天天看点

通过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 程序自动更新​​