最近在做一个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"/>。
代码测试通过,如有疑问,欢迎大家留言指正交流。
分享到:
相关推荐
一、PhoneGap自动更新机制概述 PhoneGap的自动更新功能主要应用于在线更新,即用户无需通过应用商店手动下载新版本,而是由应用在后台检测到新版本后,自动下载并安装。这种机制对于开发者来说,能够方便地推送修复...
PhoneGap 4.1 版本针对 Android 平台的环境配置主要包括以下几个步骤: 1. **环境准备**: - **ANT (Apache Ant)**:ANT 是一个 Java 库和命令行工具,用于自动化构建过程。下载 ANT 的最新版本,如 1.9.4,并将其...
使用PhoneGap Developer App,开发者可以快速地在物理设备上查看应用效果,而无需通过Xcode或Android Studio进行繁琐的构建流程。只需将应用的URL输入到App中,就能实时看到更新,这对于快速迭代和调试非常有帮助。 ...
1. **跨平台**:PhoneGap支持Android、iOS、Windows Phone等多个主流移动操作系统。 2. **本地API访问**:通过Cordova插件,PhoneGap可以访问设备的摄像头、GPS、联系人列表等硬件功能。 3. **轻松打包**:开发者...
在开发过程中,记得经常使用`phonegap build android`命令更新应用,并通过Android Studio的AVD或物理设备进行测试,确保应用在不同设备上的兼容性和性能。同时,别忘了利用PhoneGap的插件系统,这些插件可以让你...
PhoneGap会自动生成相应的项目结构,包括配置文件(config.xml)和www目录,后者用于存放应用的HTML、CSS和JavaScript代码。 在www目录中,开发者可以使用HTML5的最新特性来设计和构建应用的用户界面,同时结合CSS3...
在Android应用开发的世界里,PhoneGap和Android Studio是两种截然不同的工具,它们结合使用可以让你快速构建跨平台的应用程序。PhoneGap是一个基于HTML、CSS和JavaScript的开放源代码框架,它允许开发者利用Web技术...
- 每个平台子目录都包含了对应操作系统原生代码,如`platforms/android`或`platforms/ios`,这些代码由PhoneGap自动生成,可以直接在相应的IDE中编辑和调试。 7. **插件系统**: - PhoneGap通过插件提供对设备API...
1. **跨平台开发**:PhoneGap支持Android、iOS、Windows Phone、BlackBerry等多个主流移动操作系统,使得开发者只需编写一次代码,就能在多个平台上运行。 2. **访问设备API**:PhoneGap提供了一系列API接口,...
- 使用CLI创建一个新项目,然后将其复制到Android项目的`app/src/main/assets`目录下,作为应用的Web内容。 4. **修改Android工程**: - 配置`build.gradle`文件,添加PhoneGap库和其他必要的依赖。 - 修改`...
1. **上传源代码**:登录到PhoneGap Build后,选择“Create App”,按照指引上传你的项目文件。通常情况下,你需要将项目的`www`目录压缩成ZIP格式后上传。 2. **配置应用信息**:在PhoneGap Build中配置应用的基本...
在“phonegap-app:启动Android App Works,进行研发”这个主题中,我们将深入探讨如何使用PhoneGap来创建和运行一个Android应用。首先,你需要确保你的开发环境已经配置好,包括安装Node.js、Java Development Kit ...
本项目涉及PhoneGap与百度云推送的集成,以及二维码扫描和自动更新功能的实现。 首先,关于“百度云推送”,它是百度提供的一种针对移动应用的消息推送服务。通过集成百度云推送SDK,开发者可以向Android和iOS设备...
1. **初始化项目**:使用 `phonegap create <app-name>` 命令创建一个新的 PhoneGap 项目,例如 `phonegap create HelloWorld`。 2. **进入项目目录**:`cd HelloWorld`。 3. **添加平台**:使用 `phonegap platform...
不搭建andrid 环境 不配置android sdk 或者不搭建xcode环境,或者不安装 node.js npm 的情况下就可以创建phoengap应用 ...电脑敲代码 手机上的phonegap app实时自动更新显示 视频教程+源码+课件
此外,可以使用PhoneGap Developer App或构建并安装到实际设备上进行真机测试。 7. **构建与打包**: 当开发完成,可以使用PhoneGap Build服务或本地命令行工具将应用打包成APK,然后通过Google Play或其他分发...
5. 构建环境:PhoneGap Desktop App或PhoneGap CLI(命令行工具)是开发者常用的构建工具,用于创建、安装和调试PhoneGap应用。它们可以连接到PhoneGap Build服务,自动编译并推送应用到各个目标平台。 6. 跨平台...
1. **跨平台开发**:PhoneGap 2.9.0支持多种操作系统,包括iOS、Android、BlackBerry、Windows Phone、WebOS等。这使得开发者可以用同一套代码库创建能在不同平台上运行的应用,减少了重复工作和学习成本。 2. **...
Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip BTAndroidWebViewSelection(webview...
这个插件的主要作用是在iOS和Android等平台上实现条形码和二维码的扫描功能。开发者可以通过调用插件提供的API,轻松地在他们的PhoneGap应用中集成扫码功能,无需深入了解原生平台的扫码实现细节。 在iOS 10上,...