一个版本更新类:
- 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();
- }
完了表哥是不是好流弊...
源码下载