`
aspoems
  • 浏览: 26562 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

phonegap 自动更新android app

阅读更多
       最近在做一个html5 的移动开发,用的是jqm和phonegap,用dw开发环境,并在新浪云上进行app的打包。但是现在由于需要做android安装程序自动下载更新,发现phonegap有下载的功能,但是没有自动安装的功能,所以只能想到用phonegap插件。用phonegap插件必须要在eclipse的开发环境下开发,搭建参考地址如下:
http://www.phonegapcn.com/developers/get-started-13/get-started搭建完毕后将phonegap.jar放到src的包下面。
        下面解决两个问题,一个是下载android安装程序,利用phonegap里api,FileTransfer。注意download 只能在英文官网里找到。下载js代码如下:
// JavaScript Document
$('#login').live("pageinit", function () {		
	document.addEventListener("deviceready", onDeviceReady, false);//phonegap绑定backbutton和获取终端信
	var sourcedir1="app";//下载一级目录
	var sourcedir2="update";//下载二级目录息
	//客户端下载地址
	var url="http://192.168.103.58:8080/mobile/test.apk";
	var source="test.apk";
	function onDeviceReady() {	
	window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){     
					fileSystem.root.getDirectory(
						sourcedir1,
						{create:true,exclusive:false},
						function(entrydir){ 
							entrydir.getDirectory(
								sourcedir2,
								{create:true,exclusive:false},
								function(entrydir){
									entrydir.getFile(
										source,
										{create:true,exclusive:false}, 
									function(parent){
									var fileTransfer = new FileTransfer(); 
										var uri = encodeURI(url);
										fileTransfer.onprogress = function(progressEvent) {
										if (progressEvent.lengthComputable) {
									var percentLoaded = Math.round(100 * (progressEvent.loaded / progressEvent.total));
									var progressbarWidth = percentLoaded/2 + "%";
										//下载进度显示,可自己定义
						$.mobile.showPageLoadingMsg('a', "正在下载......  "+progressbarWidth,true);
										if(progressbarWidth=100){
											//设置延时
								setTimeout("$.mobile.hidePageLoadingMsg()",3000);
										}

										} else {
										loadingStatus.increment();
									}
								};
																						
									fileTransfer.download(
									uri,
									parent.fullPath,
									function(entry){ 
									//调用自动安装的插件	
		window.plugins.update.openFile(entry.fullPath,null,null);											
									},
									function(error) {alert("下载失败")}
								);
							},
						function(){alert("文件下载失败")}
					);
				},
			function(){alert("创建二级栏目失败")}
		);
},
function(){alert("创建一级目录失败");}
		); 
	}, function(evt){  
		console.log("加载文件系统出现错误");  
});
		  
}
		
	
 }); //pageshow
 
	  
   
  

        其中window.plugins.update.openFile(entry.fullPath,null,null);为调用phonegap插件js的代码,,下面解决第二个问题,即自动安装插件,该插件phonegap.jar1.9以上支持。插件js代码如下:
var Update = function(){};

Update.prototype.openFile = function(fullPath,onSuccess, onFail){
    cordova.exec(onSuccess, onFail, 'Update', 'openFile', [fullPath]);
};
Update.prototype.openApp = function(packageName,onSuccess, onFail){
    cordova.exec(onSuccess, onFail, 'Update', 'openApp', [packageName]);
};
if(!window.plugins) {
    window.plugins = {};
}
if (!window.plugins.update) {
    window.plugins.update = new Update();
}

       插件的java代码如下:
import java.io.File;
import java.util.List;

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;

import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.net.Uri;


public class Update extends Plugin {
	
	@Override
	public PluginResult execute(String action, JSONArray args, String callbackId) {
		PluginResult.Status status = PluginResult.Status.OK;
		if (action.equals("openFile")) {
			try {
				openFile(new File(args.getString(0).replaceAll("file://", "")));
			} catch(Exception e){
				return new PluginResult(PluginResult.Status.ERROR, "打开错误");
			}
		}
		else if(action.equals("openApp")){
			try
				{
				if(checkApp(args.getString(0))){
					openApp(args.getString(0));
				}
			else{
				//Log.d("openApp", "没有应用");
				return new PluginResult(PluginResult.Status.ERROR, "没有应用");
			}
				}
			catch(Exception e){
				//Log.d("openApp", "打开错误");
				return new PluginResult(PluginResult.Status.ERROR, "错误");
			}
		}
		return new PluginResult(status, "成功");
	}
	
	private void openApp(String packageName) throws NameNotFoundException {
		PackageManager pm=this.cordova.getActivity().getPackageManager();
		PackageInfo pi = pm.getPackageInfo(packageName, 0);

		Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
		resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
		resolveIntent.setPackage(pi.packageName);

		List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);

		ResolveInfo ri = apps.iterator().next();
		if (ri != null ) {
		String packageName1 = ri.activityInfo.packageName;
		String className = ri.activityInfo.name;

		Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);

		ComponentName cn = new ComponentName(packageName1, className);

		intent.setComponent(cn);
		this.cordova.getActivity().startActivity(intent);
			}
		}
	
	private boolean checkApp(String packageName) {   
	    if (packageName == null || "".equals(packageName))   
	        return false;   
	    try {   
	        ApplicationInfo info = this.cordova.getActivity().getPackageManager().getApplicationInfo(   
	                packageName, PackageManager.GET_UNINSTALLED_PACKAGES);   
	        return true;   
	    } catch (NameNotFoundException e) {   
	        return false;   
	    }   
	} 

	private void openFile(File f) {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

		/* 调用getMIMEType()来取得MimeType */
		String type = getMIMEType(f);
		/* 设置intent的file与MimeType */
		intent.setDataAndType(Uri.fromFile(f), type);
		this.cordova.getActivity().startActivity(intent);
	}

	/* 判断文件MimeType的method */
	private String getMIMEType(File f) {
		String type = "";
		String fName = f.getName();
		/* 取得扩展名 */
		String end = fName
				.substring(fName.lastIndexOf(".") + 1, fName.length())
				.toLowerCase();

		/* 依扩展名的类型决定MimeType */
		if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
				|| end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
			type = "audio";
		} else if (end.equals("3gp") || end.equals("mp4")) {
			type = "video";
		} else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
				|| end.equals("jpeg") || end.equals("bmp")) {
			type = "image";
		} else if (end.equals("apk")) {
			/* android.permission.INSTALL_PACKAGES */
			type = "application/vnd.android.package-archive";
		} else {
			type = "*";
		}
		/* 如果无法直接打开,就跳出软件列表给用户选择 */
		if (end.equals("apk")) {
		} else {
			type += "/*";
		}
		return type;
	}

}


       另外还需在工程根目录res->xml中的config.xml里面配置插件信息<plugin name="Update" value="your package.Update"/>。
        代码测试通过,如有疑问,欢迎大家留言指正交流。
分享到:
评论
2 楼 bingyingu 2013-11-04  
厉害!
1 楼 peijian708 2013-09-30  
ios的如何实现更新安装

相关推荐

    Phonegap 自动更新 updateApp Android

    一、PhoneGap自动更新机制概述 PhoneGap的自动更新功能主要应用于在线更新,即用户无需通过应用商店手动下载新版本,而是由应用在后台检测到新版本后,自动下载并安装。这种机制对于开发者来说,能够方便地推送修复...

    phonegap4.1+android

    PhoneGap 4.1 版本针对 Android 平台的环境配置主要包括以下几个步骤: 1. **环境准备**: - **ANT (Apache Ant)**:ANT 是一个 Java 库和命令行工具,用于自动化构建过程。下载 ANT 的最新版本,如 1.9.4,并将其...

    PhoneGap Developer App.zip

    使用PhoneGap Developer App,开发者可以快速地在物理设备上查看应用效果,而无需通过Xcode或Android Studio进行繁琐的构建流程。只需将应用的URL输入到App中,就能实时看到更新,这对于快速迭代和调试非常有帮助。 ...

    IONIC+PhoneGap项目源码

    1. **跨平台**:PhoneGap支持Android、iOS、Windows Phone等多个主流移动操作系统。 2. **本地API访问**:通过Cordova插件,PhoneGap可以访问设备的摄像头、GPS、联系人列表等硬件功能。 3. **轻松打包**:开发者...

    phoneGap-Android开发环境搭建

    在开发过程中,记得经常使用`phonegap build android`命令更新应用,并通过Android Studio的AVD或物理设备进行测试,确保应用在不同设备上的兼容性和性能。同时,别忘了利用PhoneGap的插件系统,这些插件可以让你...

    构建跨平台appHtml5+phonegap开发

    PhoneGap会自动生成相应的项目结构,包括配置文件(config.xml)和www目录,后者用于存放应用的HTML、CSS和JavaScript代码。 在www目录中,开发者可以使用HTML5的最新特性来设计和构建应用的用户界面,同时结合CSS3...

    Android_App:使用 phonegap 和 android studio 为 android 开发的第一个应用程序

    在Android应用开发的世界里,PhoneGap和Android Studio是两种截然不同的工具,它们结合使用可以让你快速构建跨平台的应用程序。PhoneGap是一个基于HTML、CSS和JavaScript的开放源代码框架,它允许开发者利用Web技术...

    PhoneGap-TestApp-源码.rar

    - 每个平台子目录都包含了对应操作系统原生代码,如`platforms/android`或`platforms/ios`,这些代码由PhoneGap自动生成,可以直接在相应的IDE中编辑和调试。 7. **插件系统**: - PhoneGap通过插件提供对设备API...

    phonegap 桌面版6.3.0

    1. **跨平台开发**:PhoneGap支持Android、iOS、Windows Phone、BlackBerry等多个主流移动操作系统,使得开发者只需编写一次代码,就能在多个平台上运行。 2. **访问设备API**:PhoneGap提供了一系列API接口,...

    android结合PhoneGap之基础:整合篇

    - 使用CLI创建一个新项目,然后将其复制到Android项目的`app/src/main/assets`目录下,作为应用的Web内容。 4. **修改Android工程**: - 配置`build.gradle`文件,添加PhoneGap库和其他必要的依赖。 - 修改`...

    PhoneGap Build的使用

    1. **上传源代码**:登录到PhoneGap Build后,选择“Create App”,按照指引上传你的项目文件。通常情况下,你需要将项目的`www`目录压缩成ZIP格式后上传。 2. **配置应用信息**:在PhoneGap Build中配置应用的基本...

    phonegap-app:启动Android App Works,进行研发

    在“phonegap-app:启动Android App Works,进行研发”这个主题中,我们将深入探讨如何使用PhoneGap来创建和运行一个Android应用。首先,你需要确保你的开发环境已经配置好,包括安装Node.js、Java Development Kit ...

    phonegap 百度云推送、扫描二维码、自动更新插件

    本项目涉及PhoneGap与百度云推送的集成,以及二维码扫描和自动更新功能的实现。 首先,关于“百度云推送”,它是百度提供的一种针对移动应用的消息推送服务。通过集成百度云推送SDK,开发者可以向Android和iOS设备...

    android PhoneGap 入门

    1. **初始化项目**:使用 `phonegap create &lt;app-name&gt;` 命令创建一个新的 PhoneGap 项目,例如 `phonegap create HelloWorld`。 2. **进入项目目录**:`cd HelloWorld`。 3. **添加平台**:使用 `phonegap platform...

    PhoneGap 视频教程+源码+课件

    不搭建andrid 环境 不配置android sdk 或者不搭建xcode环境,或者不安装 node.js npm 的情况下就可以创建phoengap应用 ...电脑敲代码 手机上的phonegap app实时自动更新显示 视频教程+源码+课件

    android PhoneGap JQuery Mobile Demo

    此外,可以使用PhoneGap Developer App或构建并安装到实际设备上进行真机测试。 7. **构建与打包**: 当开发完成,可以使用PhoneGap Build服务或本地命令行工具将应用打包成APK,然后通过Google Play或其他分发...

    PhoneGap简单示例

    5. 构建环境:PhoneGap Desktop App或PhoneGap CLI(命令行工具)是开发者常用的构建工具,用于创建、安装和调试PhoneGap应用。它们可以连接到PhoneGap Build服务,自动编译并推送应用到各个目标平台。 6. 跨平台...

    PhoneGap-2.9.0

    1. **跨平台开发**:PhoneGap 2.9.0支持多种操作系统,包括iOS、Android、BlackBerry、Windows Phone、WebOS等。这使得开发者可以用同一套代码库创建能在不同平台上运行的应用,减少了重复工作和学习成本。 2. **...

    Android应用源码安卓源码(172个合集).zip

    Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip BTAndroidWebViewSelection(webview...

    cordova扫码插件phonegap-plugin-barcodescanner,修复了在ios10上面的内存泄漏导致的闪退bug

    这个插件的主要作用是在iOS和Android等平台上实现条形码和二维码的扫描功能。开发者可以通过调用插件提供的API,轻松地在他们的PhoneGap应用中集成扫码功能,无需深入了解原生平台的扫码实现细节。 在iOS 10上,...

Global site tag (gtag.js) - Google Analytics