发布一款 Android 文本阅读器:TxtReader

几年前玩 Android 练手的时候开发了一款文本阅读器,主要是因为那个时候好用的文本阅读器几乎没有,仅有的几个要么是内嵌广告,要么就是臃肿肥,那个时候 Android 硬件配置不高,开一个臃肿肥的 app 看一个 10MB 左右的文本文件经常会程序崩溃(一些 app 没有考虑大文件情况,企图打开文件的时候一次性把内容读出来)。总之吧,当时的情况是本人需要一款轻量级、支持大文件的简单、好用的文本阅读器,顺便找个机会学一下 Android 编程~

后来放到 Android Market(现在叫 Google Play)后就没怎么管,默默的、无任何宣传的情况下今天惊讶的发现居然有 5000-10000 的装机量。这里顺便广告一下:

TxtReader 是一款轻量级的免费文本阅读器,只支持 txt 格式。简单介绍一下特点:

  • 支持自动识别编码(中文简体、中文繁体、英文、日文、韩文),不需要手动设置;
  • 支持自动书签,能自动记住阅读位置,启动软件后能自动从上次关闭的地方开始阅读;
  • 支持大文本文件阅读,不会出现文件太大打不开的情况;
  • 支持多语言菜单设置,可选中文、英文、日文;
  • 免费、绿色、小巧、简单,不侵犯隐私,没有垃圾广告,不打扰别人

TxtReader for Android

vpsee.com + android = vpseedroid

周六在朋友家烧烤,给正在打算换手机的朋友猛推了一把 Android,Android 上开发程序非常容易,并且能联机 debug,模拟器都不需要,实在是太方便了,在 Symbian 上做过开发的朋友一定能爱上 Android 的开发环境,Eclipse + Android SDK + Android for Eclipse 插件,集成开发环境全部搞定,更妙的是支持 Mac OS X 作为开发平台。昨天下午写了一个简单的看 vpsee.com 博客的小应用,功能很简单,就是列出 vpsee.com 上最新的10篇文章的标题,如果想看内容可以点击相应标题就会启动浏览器。现在这个 app 功能单一,纯粹为了好玩。有时间了会慢慢增加一些小功能,比如留言、翻页、新博客提示等等,好奇的朋友可以点击 vpseedroid.apk 下载。界面如下:

vpseedroid

利用 Android 和 Wi-Fi 做间谍相机

现在 iPhone 和 Android 上的应用程序如此丰富不是偶然的,在 iPhone 和 Android 上开发应用实在是太简单了,开发人员很容易就能上手。VPSee 花了两天的时间完成了一个 Android 上的中、日、英文本阅读器,还包括自动识别文本编码(不用自己调编码设定),触摸放大、翻页等功能,这在 Nokia Symbian 上是不可能的(至少两天内不可能完成),如果有人也有过痛苦的 Symbian 开发经历就会明白 VPSee 在说什么。现在 Android 在 Scripting Layer for Android (SL4A) 项目的帮助下能支持 Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl 等脚本语言,我们安装 SL4A 后可以在 Android 上直接运行这些脚本,使得 Android 能支持更多编程语言、更加强大了。

利用 Android 和 Wi-Fi 做间谍相机的想法是这样的,在 Android 上装一个 web server 并用 Ruby 写个小小的 web app,通过浏览器和 wifi 访问这个 web server 和 web app,每次访问 web app 都会拍一张照片并更新 web server 上的照片。这样我们只需要把 Android 手机藏在某个地方,然后在电脑上就可以 “看” 到 Android 拍到的照片了~~(请保留邪恶的想法:D),以下操作在 VPSee 的 HTC Desire (Android 2.1) 上测试通过:

安装 SL4A 和 JRuby

首先到 SL4A 官方网站下载 sl4a_r2.apk 安装到 Android 上,然后点击 “menu” -> “View” -> “Interpreters”,然后再点击 “menu” -> “Add” -> “JRuby-1.4” 就会安装 JRuby for Android,安装成功后打开 SL4A 就会看到 hello_world.rb 和 toggle_airplane.rb 连个例子脚本,点击 “menu” -> “Add” 就会看到多了一个 “JRuby-1.4” 选项。

Ruby web app

接下来在自己电脑上写个 web app,并把 web app 拷贝到 Android 上,用 Ruby 写 web app 当然最好是用 Ruby on Rails 了,这里的应用没那么复杂,使用另一个轻量级 Ruby web 框架 Sinatra 就可以了。在桌面上创建一个 spycam 项目、创建相关目录、安装 sinatra:

$ cd /Users/vpsee/Desktop/
$ mkdir spycam
$ cd spycam
$ mkdir public
$ mkdir vendor
$ mkdir vendor/gems

$ gem install --http-proxy http://192.168.0.1:3128 sinatra
$ gem unpack sinatra --target=vendor/gems
Unpacked gem: '/Users/vpsee/Desktop/spycam/vendor/gems/sinatra-1.0'
$ gem unpack rack --target=vendor/gems
Unpacked gem: '/Users/vpsee/Desktop/spycam/vendor/gems/rack-1.1.0'

创建一个 spycam.rb 文件,并把以下内容拷贝过去(代码来自这篇文章):

$ vi spycam.rb

APP_DIR = File.expand_path File.dirname(__FILE__)
GEM_DIR = File.join(APP_DIR, 'vendor', 'gems')
PUBLIC_DIR = File.join(APP_DIR, 'public')

Dir.entries(GEM_DIR).each do |dir|
  $LOAD_PATH << File.join(GEM_DIR, dir, 'lib')
end

require "rack"
require "sinatra/base"
require "android"
DROID = Android.new

TEMPLATE = <<HTML
<!DOCTYPE html>
<html>
<head>
<title>Spy Camera - vpsee.com</title>
</head>
<body>
<a href="/"><img src="latest.png"></a>
</body>
</html>
HTML
class SpyCam < Sinatra::Base set :public, File.join(APP_DIR, 'public') get "/" do snapshot_path = File.join PUBLIC_DIR, 'latest.png' DROID.cameraCapturePicture snapshot_path TEMPLATE end end SpyCam.run!

运行

测试一下上面的 web app 和远程 WiFi 相机是否能拍照。用电脑通过 USB 连上 Android,拷贝上面的 spycam 下的 spycam.rb, public, vendor 到 Android 下的 sl4a/scripts,然后断开 Android USB 连接,运行 SL4A 执行 spycam.rb 脚本就会自动启动 WEBrick server 和运行 spycam.rb,WEBrick 是个提供 HTTP web services 的 Ruby 库,集成在 RoR 开发环境里用来测试程序,也是一个简单的 HTTP server,成功运行后显示应该如下:

Android WEBrick

在任何一台使用相同网络的电脑上打开浏览器访问 http://192.168.1.115:4567(Android 当前使用的 IP 地址是 192.168.1.115)就可以看到 Android 拍照了,每点击一次照片就会更新。

Android Spy Camera

Android 设置代理的问题

上周给 MM 弄了个 HTC Desire,Android 2.1 平台,比两年前的 Android 有了很大改进,平台的成熟度、可用性、用户界面和体验有了极大的提高,但是有个问题依然没有得到解决,就是设置代理的问题。两年前玩 Android SDK 移植一些 SIP 库的时候就知道 Android 的模拟器要使用代理服务器上网的话需要很变态的设置(见下面)。没想到两年后的今天,Android 2.1 版本上这个代理问题还没有解决,在 Android 官方讨论组上这篇 Issue 1273: IP Proxy Settings for Wifi Network 被回复了约5000次,接近900人盯着这个问题。Google/HTC/Sony/Motorola 这么多大厂商在开发 Android 手机,Android 又是开源的,不明白为什么就没人站出来解决这个问题。我还听到一个说法就是最初版本的 Android 是支持代理的,后来因为安全之类的原因在 Android 1.5 版本以后就取消了,不知道是不是这样,Google 官方也没有出来说明一下,如果是这样的话为什么 iPhone 和 Nokia 一开始就支持代理呢?

htc desire and android

在 Android 模拟器上可以这样设置代理:

> adb shell
# sqlite3 /data/data/com.google.android.providers.settings/databases/settings.db
sqlite> INSERT INTO system VALUES(99,’http_proxy', 'proxy:port');
sqlite>.exit

但是上面的方法在 HTC Desire 实物上却行不通,根本就没有 system 这个表。VPSee 周末花了一晚上都没有找到正确设置代理的方法。还有一个办法就是下载和安装 ProxySetting 这个第三方软件,不过 VPSee 试了也行不通。

前几天 Google I/O 大会还发布了 Android 2.2 版本,并且目标直指 Apple:

Google did not act we faced a Draconian future, a future where one man, one company, one device, one carrier would be our only choice.

现在 Apple 比较像当年的 Microsoft(更新:今年5月26日 Apple 正式超过 Microsoft 成为美国市值第二大公司,现在国内还有人蒙在鼓里、还在犹豫苹果是小众产品、还在怀疑这张图片是 PS 出来的,呵呵。现在的 Microsoft 比较像当年的 IBM 了,老成,没有任何新意的产品,让人都提不起精神来。可惜当年的 Windows Mobile 选择 copy Symbian,如果当时 Micorsoft 等一等,等到现在 copy iPhone 可能还会有点希望。Nokia 的日子也不好过,去年第三季度巨额亏损,自己不擅长软件,Symbian 平台烂透了,开发工具不好用、平台不开放、开发复杂、对程序员不友好,这么多年的 Symbian 没有几个像样的应用,所有加起来的应用程序还没有 iPhone/Android 一年开发的多。现在又是在一个淘汰老科技的时代,像 Nokia 这种吃老本的公司到现在都还没有拿出一个和 iPhone/Android 抗衡的产品,不知道基于 Linux 的 Maemo 能不能扛上拯救 Nokia 智能手机的重任,别以为把 Syimbian 开放源代码就完事,用户和开发人员真的不在乎平台的源代码,没有人看也没有人愿意去看源代码,用户体验才是王道。