您的位置:首页 > 移动开发

android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新

2017-12-13 11:05 751 查看
对于安卓用户来说,手机应用更新是很频繁的,我们不能在每一次升级版本的时候,都让用户再去应用市场上重新下载一遍,这样是很不友好的。因此,在app里实现自动更新的功能,就显得很有必要了。

今天,就来聊一下,如何使用蒲公英第三方平台和DownLoadManager来实现app自动更新的功能。从以下三个方面来说明:**

app自动更新流程阐述

如何集成第三方平台(蒲公英)

如何使用系统自带类DownloadManager来实现下载

一.app自动更新的流程:



二.如何集成第三方平台(蒲公英)

1.如何创建蒲公英的账号和应用,大家自行去蒲公英的官网操作,在这里就不过多说明。

2.导入依赖

compile 'com.pgyersdk:sdk:2.5.6'


3.添加权限:在AndroidManifest.xml中添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 获取设备信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取MAC地址 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写sdcard,storage等等 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 允许程序录制音频 -->


4.在AndroidManifest.xml中添加蒲公英提供的App key

<meta-data
android:name="PGYER_APPID"
android:value="蒲公英key" >
</meta-data>


5.在蒲公英上传你开发的app,获取你的蒲公英app key,将AndroidManifest.xml中的value值换成自己的蒲公英key



三.如何使用系统自带类DownloadManager来实现下载

1.DownloadManager简单介绍

DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息。

2.新建ApkDownloadReceiver广播类来监听DownloadManager下载任务的状态,通过downloadId来查找下载的任务,如果下载完成,就去安装apk,如果下载失败,则弹出吐司提示。

public class ApkDownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent data) {
//获取下载任务的downloadId
long downloadId = data.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadId == PrefUtils.getApkDownloadId()) {
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
//通过downloadId来查找下载的任务
Cursor query = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));
try {
if (query.moveToFirst()) {
//获取下载任务的状态
int status = query.getInt(query.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
//下载暂停
case DownloadManager.STATUS_PAUSED:
break;
//下载延迟
case DownloadManager.STATUS_PENDING:
break;
//正在下载
case DownloadManager.STATUS_RUNNING:
break;
//下载完成
case DownloadManager.STATUS_SUCCESSFUL:
//下载完成安装APK
installApk(context,query);
break;
//下载失败
case DownloadManager.STATUS_FAILED:
//弹出提示
Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();
break;
}

}
} finally {
query.close();
}
}
}

private void installApk(Context context,Cursor query) {
String apkPath = query.getString(query.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, Uri.fromFile(new File(apkPath)));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}


3.在AndroidManifest.xml监听下载广播完成的动作

<!--下载Apk-->
<receiver android:name="com.example.marvinma.pgyerupdatedemo.ApkDownloadReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</receiver>


4.在MainActivity onStart方法中去注册蒲公英,在onDestroy方法中去反注册。

@Override
protected void onStart() {
super.onStart();
//获取DownloadManager类
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
if (PrefUtils.getApkDownloadId() != -1) {
//通过保存的downloadId来获取索引
Cursor query = downloadManager.query(new DownloadManager.Query().
setFilterById(PrefUtils.getApkDownloadId()));
try {
if (query.moveToFirst()) {
//获取下载任务的状态
int status = query.getInt(query.getColumnIndex(DownloadManager.COLUMN_STATUS));
//如果已经在下载中,就返回,不再去下载
if (status == DownloadManager.STATUS_RUNNING) {
return;
} else {
//如果是其他状态,就将之前的下载记录移除
downloadManager.remove(query.getInt(query.getColumnIndex(DownloadManager.COLUMN_ID)));
PrefUtils.setApkDownloadId(-1);
}
}
} finally {
query.close();
}
}
//蒲公英注册
PgyUpdateManager.register(this,null,new UpdateManagerListener() {
@Override
public void onNoUpdateAvailable() {}
@Override
public void onUpdateAvailable(String s) {
final AppBean appBean = getAppBeanFromString(s);
VersionUtils.showUpdateDialog(MainActivity.this,appBean);
}
}

);
}

@Override
protected void onDestroy() {
super.onDestroy();
//蒲公英反注册
PgyUpdateManager.unregister();
}


5.下载的提示框

public class VersionUtils {

public static void showUpdateDialog(final Context context, final AppBean appBean) {
new AlertDialog.Builder(context)
.setTitle("发现新版本" + appBean.getVersionName())
.setMessage(appBean.getReleaseNote())
.setNegativeButton("暂时忽略", null)
.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
//将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件
long apkDownloadId = downloadManager.enqueue(new DownloadManager.Request(Uri.parse(appBean.getDownloadURL()))
.setVisibleInDownloadsUi(false));
Log.e("apkUrl",appBean.getDownloadURL());
//保存下载的id
PrefUtils.setApkDownloadId(apkDownloadId);
}
})
.show();

}
}


至此,使用DownloadMananger来实现下载的逻辑就完成了。接着,我们修改build.gradle的versionCode和versionName,在蒲公英上传新的app

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.marvinma.pgyerupdatedemo"
minSdkVersion 18
targetSdkVersion 25
versionCode 2
versionName "2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}




效果图:



完整代码地址:http://download.csdn.net/download/maguifen2012/10156755
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 应用