首页 > 系统 > Android > 正文

Android版本更新使用DownloadManager

2019-11-09 16:54:00
字体:
来源:转载
供稿:网友
public class MainActivity extends Activity implements OnClickListener,VersionManager.OnUpdateListener{PRivate Button button;private SharedPreferences prefs;    private  String DL_ID = "update_app_id";    private DownloadManager downloadManager;    private VersionManager manager;            private Handler handler = new Handler() {//用handler处理异步请求后得到的下载链接地址        public void handleMessage(Message msg) {            switch (msg.what) {                case 021:                    String downloadURL = (String) msg.obj;                    Log.d("aa", "downloadURL==" + downloadURL);                    if (downloadURL != null) {                        if (downloadURL.equals("http://222.73.3.43/sqdd.myapp.com/myapp/QQteam/AndroidQQ/mobileqq_android.apk?mkey=5523a9bb6eb200cf&f=188a&p=.apk")) {                        VersionManager.AppVersion version = new VersionManager.AppVersion();                            // 设置文件url                            version.setApkUrl(downloadURL);                            // 设置文件名                            version.setFileName("QQ");                            // 设置文件在sd卡的目录                            version.setFilePath("update");                            // 设置app当前版本号                            version.setVersionCode(getVersionCode(MainActivity.this));//旧版本号                            manager = VersionManager.getInstance(MainActivity.this, version);                            manager.setOnUpdateListener(MainActivity.this);//监听                            manager.checkUpdateInfo();                        } else {                            Toast.makeText(MainActivity.this, "已经是最新版本", Toast.LENGTH_SHORT).show();                        }                    }                    break;                default:                    break;            }            super.handleMessage(msg);        }    };    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)this.findViewById(R.id.button);button.setOnClickListener(this);downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);}@Overridepublic void onClick(View arg0) {int id=arg0.getId();if(id==R.id.button){    int versionCode =getVersionCode(this);//旧版本号           Log.d("aa", "versionCode==" + versionCode);           int status=querydown();//查询下载状态           if(status==DownloadManager.STATUS_RUNNING){            this.onDownloading();           }else if(status==DownloadManager.STATUS_PAUSED){               Toast.makeText(MainActivity.this, "暂停下载中", Toast.LENGTH_SHORT).show();           }           else{               new CheckUpdate(handler, this, versionCode).execute();//请求后台服务器,得到新版本号           }}}    public int querydown(){        DownloadManager.Query query = new DownloadManager.Query();        prefs = PreferenceManager.getDefaultSharedPreferences(this);        query.setFilterById(prefs.getLong(DL_ID, 0));        Log.d("status","downloadManagerId="+Long.toString(prefs.getLong(DL_ID, 0)));        Cursor c = downloadManager.query(query);        if (c.moveToFirst()) {            int status = c.getInt(c                    .getColumnIndex(DownloadManager.COLUMN_STATUS));            return status;        }        return 0;    }    @Override    public void onSuccess() {        Log.d("aa", "onSuccess()");        Toast.makeText(MainActivity.this, "下载成功等待安装", Toast.LENGTH_LONG).show();    }    @Override    public void onError(String msg) {        Log.d("aa", "onError()");        Toast.makeText(MainActivity.this, "更新失败" + msg, Toast.LENGTH_SHORT).show();    }    @Override    public void onDownloading() {        Log.d("aa", "onDownloading()");        Toast.makeText(MainActivity.this, "正在下载...", Toast.LENGTH_LONG)                .show();    }    @Override    public void hasNewVersion(boolean has) {        Log.d("aa", "hasNewVersion()");        if (has) {        new AlertDialog.Builder(MainActivity.this).setTitle("系统提示")//设置对话框标题                        .setMessage("检测到最新版本,是否需要更新!")//设置显示的内容                       .setPositiveButton("确定",new DialogInterface.OnClickListener() {//添加确定按钮           @Override           public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件                          manager.downLoad();                         dialog.dismiss();                         }                       }).setNegativeButton("返回",new DialogInterface.OnClickListener() {//添加返回按钮            @Override           public void onClick(DialogInterface dialog, int which) {//响应事件                      Log.i("alertdialog"," 请保存数据!");                           }                       }).show();//在按键响应事件中显示此对话框                   }    }        /*** 获取版本号VersionCode*/public int getVersionCode(Context context)//获取版本号(内部识别号){try {PackageInfo pi=context.getPackageManager().getPackageInfo(context.getPackageName(), 0);return pi.versionCode;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();return 0;}}

}

public class VersionManager {private Context context;   private AppVersion appVersion;   private DownloadManager downloadManager;   private SharedPreferences prefs;   private static final String DL_ID = "update_app_id";   public  Uri CONTENT_URI = Uri.parse("content://downloads/my_downloads");    // 文件在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=appVersion.getApkUrl();       if(localVersion.equals(appVersion.getApkUrl())){//有新版本           listener.hasNewVersion(true);       }else{//没有新版本           listener.hasNewVersion(false);       }    /*   String localVersion = Utils.getVersionCode(context) + "";       // 这里只要两个版本不一致就更新,不考虑版本降级的情况...       if (!localVersion.equals(appVersion.getVersionCode())) {           listener.hasNewVersion(true);       } else {           listener.hasNewVersion(false);       }*/   }     public void  queryDownloadStatus(){       DownloadManager.Query query = new DownloadManager.Query();       query.setFilterById(prefs.getLong(DL_ID, 0));       Log.d("status","downloadManagerId="+Long.toString(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:                   // 正在下载,不做任何事情                   Log.d("manager","STATUS_RUNNING()");                   listener.onDownloading();                   break;               case DownloadManager.STATUS_SUCCESSFUL:                   Log.d("manager","STATUS_SUCCESSFUL()");                   // 下载完成首先取消注册广播,然后安装app                   listener.onSuccess();                   context.unregisterReceiver(receiver);                   installApk();                   break;               case DownloadManager.STATUS_FAILED:                   Log.d("manager","STATUS_FAILED()");                   // 下载失败 清除已下载的内容,重新下载                   context.unregisterReceiver(receiver);                   listener.onError("下载失败,请重试");                   downloadManager.remove(prefs.getLong(DL_ID, 0));                   prefs.edit().clear().commit();                   break;           }       }   }   /**    * 下载文件    */   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(DownloadManager.Request.NETWORK_MOBILE               | DownloadManager.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("QQ");       long id = downloadManager.enqueue(request);      /* downloadObserver = new DownloadChangeObserver(null);       context.getContentResolver().registerContentObserver(CONTENT_URI, true, downloadObserver);*/       // 保存id       prefs.edit().putLong(DL_ID, id).commit();       // 注册广播监听下载       context.registerReceiver(receiver, new IntentFilter(               DownloadManager.ACTION_DOWNLOAD_COMPLETE));   }   private void installApk() {//安装apk       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) {           queryDownloadStatus();       }   };   /**    * app版本信息    *    * @author sunger    *    */   public static class AppVersion {       // apk下载url       private String apkUrl;       // apk最新版本       private int versionCode;       public int getVersionCode() {           return versionCode;       }       public void setVersionCode(int 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);   }}

/** * Created by Shi on 2017/2/7. * 检查版本更新 */public class CheckUpdate extends AsyncTask<String, Void, String> {    private int versionCode;    private Context context;    private Handler handler;     public  CheckUpdate(Handler handler,Context context, int versionCode){         this.context=context;         this.handler=handler;        this.versionCode=versionCode;    }    @Override    protected String doInBackground(String... strings) {        String result = null;        try {            Log.d("CheckUpdate","versionCode=="+versionCode);//            result = FocusService.getInstance(context).doCheckUpdate(String.valueOf(versionCode));网络请求结果        } catch (Exception e) {            e.printStackTrace();        }        return result;    }    @Override    protected void onPostExecute(String result) {        super.onPostExecute(result);//        if(null !=result){            Log.d("CheckUpdate","result="+result);            Message message=Message.obtain();            message.what=021;//            message.obj=result;            message.obj="http://222.73.3.43/sqdd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk?mkey=5523a9bb6eb200cf&f=188a&p=.apk";//给一个假值            handler.sendMessage(message);//        }//        else{//            Log.d("CheckUpdate","失败");//        }    }}

Demo下载地址:http://download.csdn.net/detail/sinat_28238111/9750008


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表