PhoneGap是很棒的一个跨平台移动开发解决方案。该方案提供了一系列主流平台的底层封装,使得我们可以使用简单的HTML5 + javascript开展跨平台的移动应用开发,从而重用了我们传统应用开发的技能。
目前该团队已经被Adobe收购,并贡献给了Apache,重新命名为Apache Callback(这烂名字怎么来的,怎么就让人感觉不到其价值呢)。目前还在孵化器。
Apache链接:http://incubator.apache.org/projects/callback.html
Github:https://github.com/callback/
在初步的使用过程中发现一个比较严重的问题,是这样的。
我们加载图片经常使用的Android SDK API是:BitmapFactory.decodeStream。
其思路是先decode为bitmap然后简单设置ImageView的src即可,简单方便。
然而大家也都知道,现在的摄像机像素,简直是朝着存储不要钱,逼真不要命的方向发展,其图片小则几m大则几十m。
问题就这样来了,decodeSteam的时候,动不动就会抛出OutOfMemory的异常,然后force close。
怎么解决呢,查了一些资料,最终得到近乎完美的解决。
首先我们要明确我们输出的宽度或高度。如果我们不进行合理的缩放,倔强地要一股脑儿加载到JVM(哦,GOOGLE不喜欢这名字,改名叫Dalvik VM)的话,没辙,还是必死无疑,毕竟房子就这么大,非要挤进去,爆棚是必须的了。所以指定合理的高度或者宽度,是必须的——其实几十m的图片挤在一个几英寸的屏幕,压根也不会显得更好看些。
然后要进行合理sacle比例的计算,确定接近大小的scaled图片。
最后再encodeStream,转换为Bitmap。
当然了,如果要resize的更精准,也是可以的,这一步可选了。
下面是safeDecodeStream,用以替代默认的BitmapFactory.decodeStream。
/**
* A safer decodeStream method
* rather than the one of {@link BitmapFactory}
* which will be easy to get OutOfMemory Exception
* while loading a big image file.
*
* @param uri
* @param width
* @param height
* @return
* @throws FileNotFoundException
*/
protected Bitmap safeDecodeStream(Uri uri, int width, int height)
throws FileNotFoundException{
int scale = 1;
BitmapFactory.Options options = new BitmapFactory.Options();
android.content.ContentResolver resolver = this.ctx.getContentResolver();
if(width>0 || height>0){
// Decode image size without loading all data into memory
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(
new BufferedInputStream(resolver.openInputStream(uri), 16*1024),
null,
options);
int w = options.outWidth;
int h = options.outHeight;
while (true) {
if ((width>0 && w/2 < width)
|| (height>0 && h/2 < height)){
break;
}
w /= 2;
h /= 2;
scale *= 2;
}
}
// Decode with inSampleSize option
options.inJustDecodeBounds = false;
options.inSampleSize = scale;
return BitmapFactory.decodeStream(
new BufferedInputStream(resolver.openInputStream(uri), 16*1024),
null,
options);
}
对了,我提了一个enhancement给Apache Callback.
链接:https://issues.apache.org/jira/browse/CB-14
需要指出的是,这里的参数Uri如果你觉得不方面,完成可以提供系列可选参数,比如
1. String fileName - 指定文件路径
2. URL
3. InputStream
4. etc.
仅供参考。谢谢!
分享到:
相关推荐
在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...
这个PhoneGap插件的目的是提供一种解决方案,确保用户可以顺利地进行在线更新,而不会遇到应用闪退的错误。 首先,我们需要理解PhoneGap的插件机制。PhoneGap插件是连接JavaScript代码和原生平台API的关键桥梁。...
在这个“PhoneGap Camera插件调用 Demo”中,我们将探讨如何实现拍照和从图库选择图片的功能。 首先,我们需要理解PhoneGap的工作原理。PhoneGap通过WebView将Web应用与设备的原生API连接起来,使得JavaScript可以...
在Android平台上,PhoneGap提供了一个便捷的方式来整合设备的功能,比如摄像头和图库,使得Web开发者能够轻松地实现拍照和选择图库图片的操作。 1. PhoneGap基础: PhoneGap的核心是Cordova,一个开源的移动设备...
5. **Android SDK依赖**:Android插件可能需要访问Android SDK中的特定库或服务,因此在开发过程中,你需要确保项目正确引用了这些依赖。这可以通过修改`build.gradle`文件来实现,添加所需的依赖库。 6. **测试与...
Android的Toast插件是PhoneGap生态中的一个重要组件,用于在Android设备上显示短暂的通知信息,类似于原生Android开发中的Toast功能。 首先,`ToastPlugin.java`是这个插件的核心Java代码,它负责与PhoneGap的...
使用指南:PhoneGap的CordovaWebView组件在Android原生项目中使用. 1.下载phonegap2.0, 1.1 从解压文件中“phonegap-phonegap-2dbbdab\lib\android”中可以看到以下文件: cordova-2.0.0.jar、cordova-2.0.0.js和...
2. 安装与设置PhoneGap: 在开始之前,你需要安装Node.js,然后使用npm(Node Package Manager)全局安装PhoneGap。接着,使用`phonegap create`命令创建一个新的项目,指定项目名称和ID。在项目目录中,你可以看到...
在"PhoneGap拍照,图片保存应用"这个主题中,我们将探讨如何利用PhoneGap API调用Android设备的摄像头功能,并将拍摄的照片保存到应用内部。以下是一些关键的知识点: 1. **PhoneGap安装与配置**:首先,你需要在...
在本教程中,我们将探讨如何使用PhoneGap调用Android插件来实现GPS实时定位。 一、PhoneGap与Android插件 PhoneGap的插件系统是连接Web层和原生层的关键。当在JavaScript中调用一个PhoneGap API时,实际上是在调用...
PhoneGap Android Demo是一个基于PhoneGap框架的Android应用示例,旨在帮助开发者理解如何在Android平台上使用PhoneGap技术来构建跨平台的移动应用。PhoneGap是一个开源的开发框架,它允许开发者使用HTML、CSS和...
3. 安装PhoneGap:同样在命令行中输入`npm install -g phonegap`全局安装PhoneGap。 四、创建PhoneGap项目 1. 创建一个新的Android项目:运行`cordova create project_name com.example.project_name ProjectName`...
这个“phonegap之android示例”项目,显然是一个基于PhoneGap技术,专为Android平台设计的示例应用。通过这个项目,我们可以深入理解PhoneGap如何与Android原生环境相结合,以及如何利用JavaScript进行移动应用开发...
PhoneGap项目可以通过Android Studio导入,并使用Gradle构建系统进行管理。 5. **PhoneGap CLI**:开发者通常会使用PhoneGap命令行接口(CLI)来初始化项目、安装插件和构建应用。CLI简化了多平台开发,允许开发者...
在Android平台上,如果需要集成支付宝支付功能,就需要用到特定的插件,这就是我们讨论的“PhoneGap/Cordova的支付宝Android插件”。 支付宝是中国最大的第三方支付平台,广泛应用于电子商务、线上支付等多个领域。...
在"PhoneGap常用插件"这个主题中,我们将探讨PhoneGap生态系统中的一些重要插件,这些插件极大地扩展了PhoneGap的功能,使开发者能够更好地与设备的硬件功能进行交互。 1. **拨打电话插件**:这种插件允许用户通过...
1. 设备功能插件:如Camera插件,允许用户在应用内拍照或从相册选择图片;Geolocation插件,用于获取设备的地理位置信息;Accelerometer插件,用于读取设备的运动数据。 2. 用户界面插件:例如Toast插件,可以显示...
这个项目标题揭示了一个使用三种技术栈构建的移动应用程序:Android、PhoneGap和jQuery Mobile。Android是Google主导的开源操作系统,主要用于智能手机和平板电脑;PhoneGap是一个开放源代码框架,允许开发者使用...
1. 安装 PhoneGap:下载并安装 PhoneGap 的开发环境。 2. 创建项目:使用 PhoneGap 创建一个新的项目。 3. 编写代码:使用 HTML、CSS 和 JS 语言编写应用程序的代码。 4. 配置项目:配置项目的文件和设置。 5. 运行...
这个"phonegap开发插件合集"是一个包含了多种PhoneGap插件的资源包,覆盖了Android和iOS等多个平台,为开发者提供更丰富的功能扩展。 首先,我们来看看"短信收发插件"。在移动应用中,发送和接收短信是一项常见的...