Android检测版本更新 实现逻辑,UI成效自己处理

Android检测版本更新 实现逻辑,UI效果自己处理

Android检测版本更新 实现逻辑,UI成效自己处理


一个版本更新类:



import java.io.File;

import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.view.View;
import android.webkit.MimeTypeMap;

/**
 * app版本更新类 需要以下权限 <br>
 * <uses-permission
 * android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /><br>
 * <uses-permission android:name="android.permission.INTERNET" /><br>
 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><br>
 * 
 * @author Administrator
 *
 */
public class VersionManager {

	private Context context;
	private AppVersion appVersion;
	private DownloadManager downloadManager;
	private SharedPreferences prefs;
	private static final String DL_ID = "update_app_id";
	// 文件在sd卡的真实目录
	private String apkAbsolutePath;

	public void setOnUpdateListener(OnUpdateListener listener) {
		this.listener = listener;
	}

	private OnUpdateListener listener;

	public void setAppVersion(AppVersion appVersion) {
		this.appVersion = appVersion;
	}

	private static VersionManager instance = null;

	public static VersionManager getInstance(Context context,
			AppVersion appVersion) {
		if (instance == null) {
			instance = new VersionManager(context, appVersion);
		}
		return instance;
	}

	private VersionManager(Context context, AppVersion appVersion) {
		this.appVersion = appVersion;
		this.context = context;
		apkAbsolutePath = getSDPath() + appVersion.getFilePath() + "/"
				+ appVersion.getFileName();
		downloadManager = (DownloadManager) context
				.getSystemService(Context.DOWNLOAD_SERVICE);
		prefs = PreferenceManager.getDefaultSharedPreferences(context);
	}

	public void checkUpdateInfo() {

		String localVersion = getVersionCode(context) + "";
		// 这里只要两个版本不一致就更新,不考虑版本降级的情况...
		if (!localVersion.equals(appVersion.getVersionCode())) {
			listener.hasNewVersion(true);
		} else {
			listener.hasNewVersion(false);
		}
	}

	/**
	 * 获取版本号(内部识别号)
	 * 
	 * @param context
	 * @return
	 */
	private int getVersionCode(Context context) {
		try {
			PackageInfo pi = context.getPackageManager().getPackageInfo(
					context.getPackageName(), 0);
			return pi.versionCode;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
			return -1;
		}
	}

	/**
	 * 下载文件
	 */
	public void downLoad() {
		if (!isSdCardExist()) {
			listener.onError("文件无法下载请检测您的sd卡");
			return;
		}
		if (isFileExist(apkAbsolutePath)) {
			// 如果文件已经存在则安装app
			installApk();
			return;
		}
		// 开始下载
		Uri resource = Uri.parse(appVersion.getApkUrl());
		DownloadManager.Request request = new DownloadManager.Request(resource);
		request.setAllowedNetworkTypes(Request.NETWORK_MOBILE
				| Request.NETWORK_WIFI);
		request.setAllowedOverRoaming(false);
		// 设置文件类型
		MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
		String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap
				.getFileExtensionFromUrl(appVersion.getApkUrl()));
		request.setMimeType(mimeString);
		// 在通知栏中显示
		request.setNotificationVisibility(View.VISIBLE);
		request.setVisibleInDownloadsUi(true);
		request.setDestinationInExternalPublicDir(
				"/" + appVersion.getFilePath() + "/", appVersion.getFileName());
		request.setTitle("版本更新...");
		long id = downloadManager.enqueue(request);
		// 保存id
		prefs.edit().putLong(DL_ID, id).commit();
		// 注册广播监听下载
		context.registerReceiver(receiver, new IntentFilter(
				DownloadManager.ACTION_DOWNLOAD_COMPLETE));
	}

	private void installApk() {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(new File(apkAbsolutePath)),
				"application/vnd.android.package-archive");
		context.startActivity(intent);
	}

	private boolean isSdCardExist() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

	private String getSDPath() {
		if (isSdCardExist()) {
			return Environment.getExternalStorageDirectory() + "/";
		}
		return null;
	}

	private boolean isFileExist(String path) {
		return new File(path).exists();
	}

	private BroadcastReceiver receiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			DownloadManager.Query query = new DownloadManager.Query();
			query.setFilterById(prefs.getLong(DL_ID, 0));
			Cursor c = downloadManager.query(query);
			if (c.moveToFirst()) {
				int status = c.getInt(c
						.getColumnIndex(DownloadManager.COLUMN_STATUS));
				switch (status) {
				case DownloadManager.STATUS_RUNNING:
					// 正在下载,不做任何事情
					listener.onDownloading();
					break;
				case DownloadManager.STATUS_SUCCESSFUL:
					// 下载完成首先取消注册广播,然后安装app
					listener.onSuccess();
					context.unregisterReceiver(receiver);
					installApk();
					break;
				case DownloadManager.STATUS_FAILED:
					// 下载失败 清除已下载的内容,重新下载
					context.unregisterReceiver(receiver);
					listener.onError("下载失败,请重试");
					downloadManager.remove(prefs.getLong(DL_ID, 0));
					prefs.edit().clear().commit();
					break;
				}
			}
		}
	};

	/**
	 * app版本信息
	 * 
	 * @author sunger
	 *
	 */
	public static class AppVersion {
		// apk下载url
		private String apkUrl;
		// apk最新版本
		private String versionCode;

		public String getVersionCode() {
			return versionCode;
		}

		public void setVersionCode(String versionCode) {
			this.versionCode = versionCode;
		}

		public String getFileName() {
			return fileName;
		}

		public void setFileName(String fileName) {
			this.fileName = fileName;
		}

		private String fileName;

		public String getFilePath() {
			return filePath;
		}

		public void setFilePath(String filePath) {
			this.filePath = filePath;
		}

		/**
		 * 文件在sd卡的相对路径
		 */
		private String filePath;

		public String getApkUrl() {
			return apkUrl;
		}

		public void setApkUrl(String apkUrl) {
			this.apkUrl = apkUrl;
		}

	}

	public interface OnUpdateListener {
		/**
		 * 是否有新版本更新,如果为true这里开始调用
		 * 
		 * @param has
		 */
		public void hasNewVersion(boolean has);

		/**
		 * 正在开始下载
		 */
		public void onDownloading();

		/**
		 * 下载完成,并且安装成功
		 */
		public void onSuccess();

		/**
		 * 更新失败
		 * 
		 * @param msg
		 *            失败的消息
		 */
		public void onError(String msg);

	}

}


1.首先需要加入权限:

    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.使用,注意这里的AppVersion 信息是调用服务器接口获取的,然后设置进对象。表哥表示不喜欢配置服务器xml的方法,直接用接口返回数据,

自己去解析。。。


import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import com.sunger.versionupdate.VersionManager.AppVersion;
import com.sunger.versionupdate.VersionManager.OnUpdateListener;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		AppVersion version = new AppVersion();
		// 设置文件url
		version.setApkUrl("http://222.73.3.43/sqdd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk?mkey=5523a9bb6eb200cf&f=188a&p=.apk");
		// 设置文件名
		version.setFileName("手机QQ");
		// 设置文件在sd卡的目录
		version.setFilePath("update");
		// 设置app当前版本号
		version.setVersionCode(2 + "");
		final VersionManager manager = VersionManager
				.getInstance(this, version);
		manager.setOnUpdateListener(new OnUpdateListener() {

			@Override
			public void onSuccess() {
				Toast.makeText(MainActivity.this, "下载成功等待安装", Toast.LENGTH_LONG)
						.show();
			}

			@Override
			public void onError(String msg) {
				Toast.makeText(MainActivity.this, "更新失败" + msg,
						Toast.LENGTH_LONG).show();
			}

			@Override
			public void onDownloading() {
				Toast.makeText(MainActivity.this, "正在下载...", Toast.LENGTH_LONG)
						.show();
			}

			@Override
			public void hasNewVersion(boolean has) {
				if (has) {
					Toast.makeText(MainActivity.this, "检测到有新版本",
							Toast.LENGTH_LONG).show();
					manager.downLoad();
				}
			}
		});
		manager.checkUpdateInfo();

	}

完了表哥是不是好流弊...Android检测版本更新 实现逻辑,UI成效自己处理Android检测版本更新 实现逻辑,UI成效自己处理
源码下载