package com.club.test;
import org.apache.cordova.DroidGap;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class Club16Activity extends DroidGap {
/** Called when the activity is first created. */
String newVerName = "";//版本名称
int newVerCode = -1;//版本号
ProgressDialog pd = null;
String UPDATE_SERVERAPK = "Club16.apk";
String downUrl="http://114.112.41.50:8006/android/Club16.apk";
String serverurl="http://114.112.41.50:8006/android/version.js";
boolean result=false; //更新标识
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//super.setBooleanProperty("keepRunning", false);
super.setIntegerProperty("loadUrlTimeoutValue",60000);
updateVersion();//启动时就检查 或者 在菜单中调用
if(!result){
super.loadUrl("file:///android_asset/www/index.html");}
}
public void updateVersion(){
if(getServerVer()){
int verCode = this.getVerCode(this);
if(newVerCode>verCode){
doNewVersionUpdate();//更新版本
}
// else{
// //alert("")
// notNewVersionUpdate();//提示已是最新版本
// }
}
}
/**
* 获得版本号
*/
public int getVerCode(Context context){
int verCode = -1;
try {
String packName = context.getPackageName();
verCode = context.getPackageManager().getPackageInfo(packName, 0).versionCode;
System.out.println("当前版本号:"+ verCode);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Log.e("版本号获取异常", e.getMessage());
}
return verCode;
}
/**
* 获得版本名称
*/
public String getVerName(Context context){
String verName = "";
try {
String packName = context.getPackageName();
verName = context.getPackageManager().getPackageInfo(packName, 0).versionName;
} catch (NameNotFoundException e) {
Log.e("版本名称获取异常", e.getMessage());
}
return verName;
}
/**
* 从服务器端获得版本号与版本名称
* @return
*/
public boolean getServerVer(){
try {
URL url = new URL(serverurl);
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
httpConnection.setRequestMethod("GET");
httpConnection.connect();
InputStreamReader reader = new InputStreamReader(httpConnection.getInputStream());
BufferedReader bReader = new BufferedReader(reader);
String json = bReader.readLine();
JSONArray array = new JSONArray(json);
JSONObject jsonObj = array.getJSONObject(0);
newVerCode = Integer.parseInt(jsonObj.getString("verCode"));
newVerName = jsonObj.getString("verName");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return true;//如果这里改为false 则不更新会退出程序
}
return true;
}
/**
* 不更新版本
*/
public void notNewVersionUpdate(){
int verCode = this.getVerCode(this);
String verName = this.getVerName(this);
StringBuffer sb = new StringBuffer();
sb.append("当前版本名称:");
sb.append(verName);
sb.append(" 当前版本号:");
sb.append(verCode);
sb.append("\n已是最新版本,无需更新");
Dialog dialog = new AlertDialog.Builder(this)
.setTitle("软件更新")
.setMessage(sb.toString())
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
finish();
}
}).create();
dialog.show();
}
/**
* 更新版本
*/
public void doNewVersionUpdate(){
int verCode = this.getVerCode(this);
String verName = this.getVerName(this);
StringBuffer sb = new StringBuffer();
sb.append("当前版本名称:");
sb.append(verName);
sb.append("当前版本号:");
sb.append(verCode);
sb.append(",发现版本名称:");
sb.append(newVerName);
sb.append(" 版本号:");
sb.append(newVerCode);
sb.append(",是否更新");
Dialog dialog = new AlertDialog.Builder(this)
.setTitle("软件更新")
.setMessage(sb.toString())
.setPositiveButton("更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
pd = new ProgressDialog(Club16Activity.this);
pd.setTitle("正在下载");
pd.setMessage("请稍后。。。");
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
result=true;
System.out.println("result 下载"+result);
downFile(downUrl);
}
})
.setNegativeButton("暂不更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//finish();
}
}).create();
//显示更新框
dialog.show();
}
/**
* 下载apk
*/
public void downFile(final String url){
pd.show();
new Thread(){
public void run(){
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
FileOutputStream fileOutputStream = null;
if(is != null){
File file = new File(Environment.getExternalStorageDirectory(),UPDATE_SERVERAPK);
fileOutputStream = new FileOutputStream(file);
byte[] b = new byte[1024];
int charb = -1;
int count = 0;
while((charb = is.read(b))!=-1){
fileOutputStream.write(b, 0, charb);
count += charb;
}
}
fileOutputStream.flush();
if(fileOutputStream!=null){
fileOutputStream.close();
}
down();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
pd.cancel();
update();
}
};
/**
* 下载完成,通过handler将下载对话框取消
*/
public void down(){
new Thread(){
public void run(){
Message message = handler.obtainMessage();
handler.sendMessage(message);
}
}.start();
}
/**
* 安装应用
*/
public void update(){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),UPDATE_SERVERAPK))
, "application/vnd.android.package-archive");
startActivity(intent);
}
}
服务器上version.js 文件格式 [{"verName":"app","verCode":2}]
参考 http://www.cnblogs.com/henshui/articles/2475533.html
分享到:
相关推荐
本插件专注于PhoneGap在Android平台上的在线更新功能,旨在解决一个特定的问题:即在Android 7.0及以上版本中,通过下载安装APK更新时可能出现的应用闪退现象。 在Android系统中,特别是从7.0版开始,谷歌引入了更...
这个“phonegap之android示例”项目,显然是一个基于PhoneGap技术,专为Android平台设计的示例应用。通过这个项目,我们可以深入理解PhoneGap如何与Android原生环境相结合,以及如何利用JavaScript进行移动应用开发...
在这个“phonegap android 录音照相录像 demo”项目中,我们将会探讨如何使用PhoneGap在Android平台上实现录音、照相和录像功能。 1. PhoneGap基础知识: PhoneGap的核心是基于Apache Cordova,它提供了一个...
PhoneGap Android is an Android application library that allows for PhoneGap-based projects to be built for the Android Platform. PhoneGap-based applications are, at the core, an application written in...
PhoneGap Android Demo是一个基于PhoneGap框架的Android应用示例,旨在帮助开发者理解如何在Android平台上使用PhoneGap技术来构建跨平台的移动应用。PhoneGap是一个开源的开发框架,它允许开发者使用HTML、CSS和...
在Android平台上,PhoneGap的应用程序可以通过更新插件进行版本更新,以保持应用的最新状态,提高用户体验。本文将详细介绍PhoneGap的自动更新机制,特别是针对Android平台的`updateApp`插件的使用。 一、PhoneGap...
PhoneGap的核心理念是通过Web技术实现与移动设备硬件的交互,让开发者能够利用熟悉的Web开发技能开发出能在iOS、Android、Windows Phone等多平台运行的应用。 在"android之PhoneGap入门实例"中,我们首先需要了解...
总之,搭建Android+PhoneGap开发环境涉及安装JDK、Android Studio、Node.js和PhoneGap CLI,配置Android SDK,以及创建和运行第一个PhoneGap项目。掌握这个过程后,开发者就可以利用Web技术开发出能在Android平台上...
在Android平台上,PhoneGap提供了一个便捷的方式来整合设备的功能,比如摄像头和图库,使得Web开发者能够轻松地实现拍照和选择图库图片的操作。 1. PhoneGap基础: PhoneGap的核心是Cordova,一个开源的移动设备...
Android的Toast插件是PhoneGap生态中的一个重要组件,用于在Android设备上显示短暂的通知信息,类似于原生Android开发中的Toast功能。 首先,`ToastPlugin.java`是这个插件的核心Java代码,它负责与PhoneGap的...
- 开发PhoneGap应用时,需要配置Android开发环境,包括安装Android Studio、Java Development Kit (JDK)和Android SDK。 - 创建PhoneGap项目时,首先需要在命令行中使用PhoneGap或Cordova CLI初始化一个新的项目...
在这个“Phonegap Android 系统推送例子”中,我们将深入探讨如何在Android平台上使用PhoneGap实现系统推送功能,这涉及到Java语言的运用以及与PhoneGap框架的集成。 首先,我们需要理解什么是系统推送。在移动应用...
在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...
【标题】:“Android + PhoneGap + jQuery Mobile” 这个项目标题揭示了一个使用三种技术栈构建的移动应用程序:Android、PhoneGap和jQuery Mobile。Android是Google主导的开源操作系统,主要用于智能手机和平板...
在Android平台上,PhoneGap通过一个叫做Cordova的内核与设备的API进行交互,使得Web应用可以访问设备的功能,如摄像头、联系人、GPS等。在本例中,我们关注的是如何在PhoneGap应用中调用Android的`Toast`和`...
在本教程中,我们将探讨如何使用PhoneGap调用Android插件来实现GPS实时定位。 一、PhoneGap与Android插件 PhoneGap的插件系统是连接Web层和原生层的关键。当在JavaScript中调用一个PhoneGap API时,实际上是在调用...
在移动应用开发领域,PhoneGap和Android是两种广泛使用的平台。PhoneGap是一种基于HTML5、CSS3和JavaScript的跨平台框架,它允许开发者使用Web技术创建原生移动应用。而Android则是Google主导的开源操作系统,提供了...
- 使用Chrome开发者工具的Remote Debugging功能,可以在浏览器中实时查看和调试运行在Android设备上的PhoneGap应用。 - 使用PhoneGap Build服务,可以远程编译和分发应用到不同平台,而无需在每个平台上单独构建。...
### PhoneGap Android:指南针插件详解 #### 引言 在移动应用开发领域,PhoneGap作为一款跨平台的应用框架,让开发者能够使用HTML、CSS和JavaScript等Web技术来构建原生应用程序,大大提升了开发效率。其中,指南...
在这个“phoneGap实现android平台登录例子”中,我们将探讨如何利用PhoneGap在Android平台上创建一个简单的登录功能,这对于初学者来说是一个很好的入门实践。 首先,我们需要了解PhoneGap的基础知识。PhoneGap是...