通过包名查找进入手机自带应用市场下载页
最近因为友盟提供的自动更新功能要下架了,于是乎自己查资料写了一个通过应用市场强制升级的功能。第一次写博客,感觉有点方,哈哈,重在知识积累,分享大众。言归正传,我把操作步骤以及重要代码贴出来希望对大家有用。
- 获取版本信息
- 运行MainActivity进行版本检测
- 更新方案
> 首先进行从APP的application获取版本信息(本地版本号以及服务器版本号)
主要代码如下
首先新建一个类存放本地版本号以及服务器版本号,方便调用(若是直接从服务器下载APK,也可配置一个存放路径),直接贴代码:
public class Config {
//版本信息
public static int localVersion = 0;
public static int serverVersion = 0;
/* 下载包安装路径 */
public static final String savePath = "/sdcard/test/";
public static final String saveFileName = savePath + "test.apk";
}
这里是我在我的全局application的oncreate方法中定义的一个版本检测方法,如下:
public void initGlobal() {
try {
Config.localVersion = getPackageManager().getPackageInfo(
getPackageName(), 0).versionCode; // 设置本地版本号
HttpRequest.VersionUpdate(mHandler, 1, getApplicationContext());//获取服务器版本号
} catch (Exception ex) {
ex.printStackTrace();
}
}
第二步的思路就是我们希望一旦运行APP,进入到MainActivity中会进行一个版本对比,之后发现新版本弹出一个对话框提示我们升级(也分为强制升级以及自动更新,这个视情况而定),直接上代码:
/**
* 检查更新版本
*/
public void checkVersion() {//此方法在MainActivity的oncreate方法中执行
if (Config.localVersion < Config.serverVersion) {
Log.i("hgncxzy", "==============================");
// 发现新版本,提示用户更新
Intent intent = new Intent(MainActivity.this, DownloadAPKActivity.class);
startActivity(intent);//弹出升级对话框,我这里直接弹出一个Dialog样式的Activity
} else {
// 清理工作,略去
// cheanUpdateFile()
}
}
最后就是我的实现方案,跳转到应用市场让用户自行下载,也可以直接从服务器下载APK,但是因为公司服务器没完全搭建起来,成本较大,于是乎今天着重讲解跳转到手机自带应用市场下载页面,也就是上一步跳转的DownloadAPKActivity,“确认升级”按钮点击事件代码如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.begin:
Uri uriObj;
Intent appStartIntent = new Intent(Intent.ACTION_VIEW);
uriObj = Uri.parse("market://details?id=你的包名");//从手机自带市场搜索你的APP包名
try{
appStartIntent.setData(uriObj);
startActivity(appStartIntent);//搜到包名之后会直接跳转到相应市场你的APP下载页面,如有多个手机市场,之前会让你选择市场(很人性化)
}catch (ActivityNotFoundException e){
uriObj = Uri.parse("http://a.app.qq.com/o/simple.jsp?pkgname=你的包名");//捕获异常,手机没有市场的情况下跳转到应用宝下载页面
appStartIntent.setData(uriObj);
startActivity(appStartIntent);
}
break;
default:
break;
}
}
附录,还有同学所在公司服务器比较牛逼点的可以直接从服务器下载APK的,我这里也提供一个下载方案,可以进行版本检查之后在MainActivity中调用此类的异步下载方法,仅供参考,亲测有效:
public class DownloadAPK {
private static final String TAG = "DownloadAPK";
private static final boolean DEBUG = true;
private static DownloadAPK mInstance;
private ProgressDialog downloadProDialog;
private String appname = "名字.apk";
public DownloadAPK(){}
public static DownloadAPK getInstance(){
if(mInstance == null){
mInstance = new DownloadAPK();
}
return mInstance;
}
public void download(final Context context){//下载异步线程
if (DEBUG) Log.i(TAG, "start downloadApkFile");
downloadProgress(context);
new Download(context).execute();
}
public class Download extends AsyncTask<Void, Integer, Void> {
private Context mContext;
public Download(Context context){
mContext = context;
}
@Override
protected Void doInBackground(Void... params) {
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ appname;
String serverFilePath = "http://softfile.3g.qq.com:8080/msoft/179/1105/10753/MobileQQ1.0(Android)_Build0198.apk";//这里我模拟下载一个qq老版本APK,相当于从服务器获取
try {
URL serverURL = new URL(serverFilePath);
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
File apkfile = new File(savePath);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));
int n;
byte[] buffer = new byte[1024];
while((n=bis.read(buffer, 0, buffer.length))!=-1){
bos.write(buffer, 0, n);
}
bis.close();
bos.close();
connect.disconnect();
} catch (Exception e) {
e.printStackTrace();
if (DEBUG) Log.e(TAG, "downloadFile exception !" + e);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
install(mContext);
downloadProDialog.dismiss();
}
}
public void downloadProgress(Context context){//自己定义的一个下载的进度条
downloadProDialog = new ProgressDialog(context);
downloadProDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
downloadProDialog.setTitle("正在下载");
downloadProDialog.setMessage("下载中,请等待...");
downloadProDialog.setMax(100);
downloadProDialog.setProgress(0);
downloadProDialog.setSecondaryProgress(0);
downloadProDialog.setIndeterminate(false);
downloadProDialog.setCancelable(false);
downloadProDialog.show();
}
private void install(Context context){
String fileName = Environment.getExternalStorageDirectory() +"/"+ appname;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
context.startActivity(intent);
}
}
温馨提示:这是我的第一篇博客,发现只要懂得分享积累才能不断的提升自己,之后我会把我在项目中遇到的一些坑分享出来,一方面提升自我,其二也帮助其他奋斗在Android事业上的艰苦大众。然后,大家有什么问题欢迎前来留言骚扰,最后,祝大家事业顺心,每天进步。