二维码/条形码扫描工具zxing

第一次开发安卓app,需要在app里面扫描二维码。google一下,发现安卓里面用得比较多的是zxing。实际上,zxing并不只是用于安卓。其核心代码主要就是两个功能,一个是将条码、二维码等decode成文字;再就是将文字encode生成一张二维码图片。在这个核心代码基础之上,才是面向用户的各种应用程序,比如:

  • 安卓应用程序,能够用智能手机的摄像头拍摄二维码图片,包括自动对焦;然后调用核心代码将拍摄的图片decode成文字
  • javase桌面应用,直接将一张二维码图片文件的路径作为参数传递,由核心代码将其decode成文字。
  • web应用,用浏览器将二维码图片传递到服务器,由服务器调用核心代码将其decode之后返回给用户

在zxing项目的README页面可以看到,它主要由以下几个模块组成。
阅读全文

GT-N7100刷机再探

变砖故障一:开不了机

症状:可以进入odin模式(可能又叫刷机模式、挖煤模式,通过开机的时候按音量减+HOME+电源键进入),但是不能开机,开机过程中显示固件已经损坏,并且提示可以尝试用KIES修复。不过,在这种状态下KIES是连接不上手机的,因此无能为力

解决方法:使用Odin工具刷N7100固件

刷固件步骤描述如下:

  1. 下载Odin3 v3.10原版.exe,并运行。
  2. 下载固件压缩包,KIES_HOME_N7100ZCALK5_N7100CHNALK5.zip,并解压。
  3. 手机开机,在卡住(提示固件损坏)的状态下,对运行的Odin进行如下设置:
    Odin-刷固件
    也就是说,确保”Auto Reboot”和”F. Reset Time”已经勾选,点击AP选择前面解压的固件zip中的KIES_HOME_N7100ZCALK5_N7100CHNALK5_447762_REV04_user_low_ship.tar.md5文件。然后点击”Start”开始刷固件。刷的过程在Odin上和手机上都能看到进度。固件版本应该是有要求的,我下载的是KIES_HOME_N7100ZCALK5_N7100CHNALK5.zip,这个固件刷了两次都能成功,只不过有几次是刷的过程中卡住(用电脑A),后面两次刷成功是用了另一台电脑;如果你出现刷的时候卡住,可以试着重新刷。

固件刷完后,手机就可以正常开机了。

故障二:未在网络上注册

 解决方法:

步骤:

  1. 刷cwm-root-note2.tar
  2. 刷ZCDMB1_xydd_meihua.zip
  3. 恢复EFS

git submodule

更新一个submodule的url

用例:

方法:

  1. 更新.gitmodules文件,修改对应submodule的url。

    这个文件中的submodule信息,是在git submodule add的时候写入的,并且在git submodule init的时候会读取这个文件并写入到.git/config文件中。之后的git submodule update命令从.git/config文件中读取信息以便从git服务器拉取更新。

  2. 运行git submodule sync,这会更新.git/config文件。

 

linux(ubuntu 14.04)下编译linphone-android

首先下载源代码

linphone-android实际上很多submodules,只不过,国内访问linphone.org不太稳定,所以这里不用–recursive选项同时下载submodules。linphone-android主项目代码下载完成之后,可以用git submodule status和git submodule update来查看有哪些submodules并更新,git submodule update会(重新)下载没有下载成功、或者没有下载过的submodule,尽管不稳定,尽管会经历多次连接失败,磕磕绊绊地也能慢慢全部下载完成。

代码下载完成之后,根目录下的README文件列出了编译该项目需要安装的东西:

  1. Android sdk
    下载并解压Android sdk,然后使用SDK Manager下载最新的platform-tools和tools,以及其他安卓开发需要的组件。参考搭建linux(ubuntu 14.04)下的android开发环境
    将platform-tools和tools子文件夹目录添加到PATH环境变量中,假设Android sdk解压到/home/yanzs/android/android-sdk-linux,那么PATH的配置为在~/.bashrc末尾添加下面几行:
  2. 安装几个工具

    确保系统中有这几个工具:autoconf, automake, aclocal, libtoolize, pkgconfig(README文件的说法,应该是ubuntu系统里的pkg-config)。没有的话找到相应的软件包进行安装,我的系统里面这些工具都有了,所以也不知道是哪个软件包带的。
  3. (仅针对64位操作系统)安装ia32-libs,参考 http://stackoverflow.com/a/23194339/1033539


    README里面提到安装下列软件包,不懂是作为ia32-libs的安装方法,还是另外的需要,我也一并装了
  4. 下载Android NDK(要求r10c版本),如果你的系统时64位的,这一步得在上面第三步之后进行,因为下载的64位Android NDK其实包含32位的程序。可以从Android NDK页面下载最新版本,这个页面也有安装方法说明。除此之外 AndroidDevTools 也提供了几个版本的Android NDK的百度网盘下载地址。将Android NDK解压,并按照上述同样的方法将解压后的路径添加到PATH环境变量中。

至此,准备工作完毕,可以直接运行make命令进行编译,保险起见make之前先clean一下

编译需要一会儿,编译成功treminal的输出是这样的

linphone-android-make-successful

所以,如果你在最后看到error,但是不相信命运往回找successful时,也许你能找到,但你只要告诉自己不能哭就行了。编译成功的话,生成的apk文件存放在bin目录下

将安卓手机用usb线连接电脑,运行make install就可以将前面编译好的apk文件安装在手机上了。

============================================================================

以上是采用命令行编译的方式,我们还可以使用Android开发工具来编译源代码。

需要注意的是,使用Android开发工具之前也得先用命令行编译一遍,这可能是因为命令行编译会同时编译C语言源代码部分。如果在命令行编译之前直接用开发工具编译,linphone安装在手机上的时候会不能启动。

我这边采用Android Studio来编译。在我下载的版本里面,linphone源代码应该是用Eclipse创建的,因此Android Studio不能直接打开,得按下图导入:

Screenshot from 2015-04-08 19:58:56

 

导入Android Studio之后的编译就比较简单了。

============================================================================

PS: 本文编译的linphone-android代码版本截图如下,如果你编译其他版本的代码不成功,也有可能是该版本源代码的bug,可以试试这个版本,如果编译成功,也能让自己斗志昂扬

linphone-android-gitk-revision

搭建linux(ubuntu 14.04)下的android开发环境

对于刚开始学习android开发的人来说,android开发环境的搭建还是比较复杂的,不仅在于需要理解各种概念、工具的作用,他们的关系;更是由于这些工具的开发者,google,的网站在国内是访问不了的。本文就来介绍一下如何从零开始搭建android开发环境,创建一个hello world手机app,并运行于AVM和智能手机上。

一、安装JDK

首先,安卓app使用java语言开发,因此编译app程序少不了JDK。而且,后面会提到的SDK Manager,以及Android Studio的运行也需要安装JDK(要求JDK7及以上的版本)才能启动。 虽然ubuntu的软件库里面有openjdk-7-jdk,可以很方便的安装,但android推荐使用oracle提供的JDK。Oracle版本的JDK8可以从官方页面下载,或者使用我的百度网盘分享。如果使用Oracle版本,记得把openjdk卸载掉。 下载之后解压,假设解压到/home/yanzs/java/jdk1.8.0_40。然后需要设置JAVA_HOME和PATH环境变量,方法是在~/.bashrc文件末尾添加:

这个设置对之后打开的terminal有效,要使其现有terminal有效,在对应的terminal窗口执行”source ~/.bashrc”命令(不包括引号)。 设置JAVA_HOME环境变量之后,Android Studio会自动使用这个版本的JDK。

二、安装SDK tools(不区分32位与64位)

SDK tools

开发安卓应用程序,涉及到对硬件的访问,以及界面设计中使用的控件等,这些功能都由Android API提供,并且有不同的版本。SDK tools提供了一系列工具,其中包括SDK Manager。SDK Manager可以下载、升级各个版本的Android API;并且管理一些工具,比如Platform-tools,Build-tools(有多个版本),甚至SDK tools本身。另外,SDK tools还提供了AVM(安卓设备模拟器)管理工具。 以上所说的,Android API,SDK tools,Platform-tools,Build-tools还有一些其他扩展接口,统称为Android SDK。不像其他框架的SDK,Android SDK分成各个组件,要通过SDK Manager来下载,所有没有一个下载Android SDK的页面、地址,只有SDK tools的下载地址。这也是会给初学者造成很大困扰的原因。 只不过,下载了SDK tools之后,其中的SDK manager以及通过SDK manager下载的其他组件都在SDK tools文件夹之下,可以真个拷贝到其他开发机子上,方便共享,这就是在网上能够找到的所谓”非官方版”或者”完整版”,”更新到XXX的版本”。 我们这里下载官方的SDK tools,下载地址见Android SDK下载页面末尾,SDK Tools Only部分。选择对应操作系统的版本,我这里下载linux版本,下载后解压,假设解压到/home/yanzs/android/android-sdk-linux目录。

使用SDK manager安装Android API

运行SDK tools目录下的tools/android打开SDK manager

SDK-Manager-without-proxy-setting-use-https SDK Manager每次运行的时候,都会连接服务器,获取最新的组件列表,对比当前已经安装了的组件,以便用户进行安装、升级。从上图可以看到,SDK Manager获取组件列表的时候出错了,这很可能是因为它用https协议访问服务器,而JDK里面又没有安装对应的证书,参考http://www.java-samples.com/showtutorial.php?tutorialid=210。不过,我们这里不通过给JDK安装证书来解决问题,直接设置SDK Manager,使其强制使用http协议就行了。 通过菜单”Tools/Options…”打开配置窗口。 SDK-Manager-options 勾选”Force https://… sources to be fetched using http://…”,我这里同时设置了HTTP Proxy Server和HTTP Proxy Port,这是设置SDK Manager通过代理下载组件列表,以及下载组件本身。如果没有设置代理,会出现部分组件列表加载不了的情况,如下图。 SDK-Manager-without-proxy-setting 关于代理的设置参考AndroidDevTools,这个网站整理了很多安卓开发工具(包括本文提到要下载的所有软件包),并用百度网盘分享,值得拥有。经过这些设置之后, 就可以正常加载组件列表并下载组件了。 SDK-Manager-initially-opened 可以看到,Android SDK Tools已经安装了,这是理所当然的,因为我们下载的就是SDK Tools。 另外,可以看到SDK Manager自动帮我们勾选了一下tools和API,这些都推荐安装。需要注意的是,默认SDK Manager只会勾选最新版本的Android API,后面创建的安卓应用程序尽管是使用这个版本的API,但只要不调用新版本才提供的接口,就仍然可以在低版本的安卓手机及AVM上运行。除了默认勾选的组件之外,参考下面的两个页面,可以选择安装其他一些组件。如果有些组件没有安装,可能连Hello World程序都编译不过:

选择好后,点击”Install XX packages”按钮开始下载安装,文件比较大,看一部电影再回来。

一般的Android开发就这样下载好Android SDK和各组件,然后在下面说到的Android Studio里面配置Android SDK根路径就行了。但是有些开源项目会要求你设置ANDROID_HOME环境变量,或者将SDK根目录以及tools、platform-tools子目录添加到PATH中。这里都提前设置好:

三、安装Android Studio(不区分32位与64位)

Android Studio可以从Android SDK下载页面下载,从说明中可以看到,这个Android Studio集成了SDK Tools等一些组件。问题是,Android Studio运行的时候会自动下载一些SDK组件,而且在组件成功下载之前你还不能打开SDK Manager进行前面说过的https和代理设置,因此不能成功下载组件。。。这就是为什么我们前面单独下载SDK Tools Only的原因。 假设Android Studio解压到/home/yanzs/android/android-studio。运行之前,需要进行设置,使其跳过前面说过会导致问题的自动下载SDK组件这一步骤。打开bin/idea.properties文件,在末尾添加一行:

然后可以运行bin/studio.sh打开Android Studio。在创建/打开安卓项目之前,需要先配置Android SDK路径,以及JDK路径。 android-studio-configure android-studio-project-defaults android-studio-project-structure android-studio-sdk-location Android Studio的设置可以参考Android studio 1.1.0 Hello world!。 至此,开发环境算是设置完了。 接下来就可以创建Hello World了。

四、Hello World!

在初次运行Android Studio打开的”Welcome to Android Studio”窗口,点击Start a new Android Studio project按钮创建项目,向导会指引你选择模板,选Blank Activity就可以了。创建好之后会进入Android Studio IDE,之后每次打开Android Studio也会直接进入IDE。 这样创建的App就是一个Hello World程序。 android-hello-world-run 点击工具栏的运行按钮开始执行,如果必要的组件都有安装,编译成功之后会让你选择一个AVM或者连接的Android手机进行测试,过程就不细说了。如果编译失败,返回前面使用SDK manager安装Android API一节,确保安装了需要的组件。

制作各操作系统的U盘安装盘

windows底下,可以用UltraISO工具

  1. 运行UltraISO,打开操作系统ISO文件
  2. 接入U盘
  3. 在UltraISO中,选择菜单”启动/写入硬盘映像…”
  4. “硬盘驱动器”一项选择需要制作成启动盘的U盘
  5. “写入方式”选择USB-HDD,这种方式兼容性更好,有时候选择其他方式制作的启动盘无法启动,而使用这种方式重新制作之后就可以启动了
  6. 点击”写入”按钮

UltraISO可以制作Ubuntu 14.04系统

linux底下,可以使用Startup Disk Creator(terminal命令是usb-creator-gtk,安装usb-creator-gtk软件包)工具制作启动盘

  1. Source disk image中选择操作系统ISO文件
  2. Disk to use中选择目标U盘
  3. 点击Erase Disk清空U盘现有文件,也可以用分区工具(比如GParted)先将U盘格式化。即便制作的是linux系统,也可以将U盘格式化为FAT32格式。

Startup Disk Creator可以制作Windows 7 ultimate,以及Ubuntu 14.04系统

linux下用c语言实现UPnP设备检测

UPnP 是一个用于查找、控制网络设备的协议,一般的IP设备,比如打印机、网络摄像机都有支持UPnP协议。当一个支持UPnP协议的设备添加到网络中的时候,它会像网络通知它的存在。我们也可以在应用程序主动搜索当前网络中的UPnP设备。UPnP协议的说明可以参考 UPnP Device Architecture 1.0 

pupnp 项目是linux下对UPnP协议(V1.0)的一个实现,它提供了一个C语言的API。由于我只是想查找局域网内的网络摄像机,而pupnp没有提供一个工具让我测试一下它是否能够帮我找到,所以我没有去研究。

相反的,gupnp 项目提供了一个gssdp-discover命令行工具(安装gupnp-tools),可以搜索局域网内的upnp网络设备()。并且,gupnp的API文档看起来不会那个吓人,研究了一两个小时也写出了一个类似于gssdp-discover的工具,能够搜索到局域网的打印机和IP摄像机。我的C语言水平,只限于学过语法,还有就是前几个星期研究过一个星期左右GStreamer开发,与gupnp类似,GStreamer也是使用gnome的GObject, GLib,所以多少有些相似之处。

首先来看看gssdp-discover的运行情况:

我的局域网内有一台打印机和一个网络摄像机,gssdp-discover搜出了5个设备和服务,其中网络摄像机占4个,应该是包含了内嵌的设备和服务。使用upnp搜索设备的时候,可以指定需要搜索哪些类型的设备,下面列出的代码中可以看到这个参数。

下面是我使用gupnp API写的类似与gssdp-discover功能的一个C程序。

假设这个程序保存为文件detect.c,那么可以使用如下命令进行编译:

可以看到,这个程序依赖两个库,gssdp-1.0和gtk+-3.0,因此需要先安装这两个程序库。gssdh-1.0是gupdp项目的一部分,包含在软件包libgssdp-1.0-dev中。gtk+-3.0不记得是在哪个软件包中的了,后面我会在一个新的系统中试一下。

关于这个程序的几点说明:

  1. 第1行, 引用”libgssdp/gssdp.h”头文件,这个是 gssdp-1.0的一部分,包含GSSDPClient,GSSDPResourceBrowser等类型的定义。因此编译的时候需要指定”gssdp-1.0″库,其官方网站及API文档见https://developer.gnome.org/gssdp/unstable/
  2. 第24行,第二个参数NULL,表示自动检测该使用哪个网络接口。使用的网络接口可以用gssdp_client_get_interface函数获取。
  3. 第30行,criteria参数指定需要搜索哪些设备,API 文档中有关于这个参数的说明。
  4. 第32行,监听GSSDPResourceBrowser上的resource-avaiable信号,gssdp会为每个找到的upnp设备触发这个信号。监听信号的方法是GObject开发中通用的,即采用g_signal_connect方法实现监听,调用这个方法需要在编译的时候引用”gtk+-3.0″库。
  5. 第35-36行,创建并执行GLib主循环。很多GNome项目的程序都得通过GLib主循环来执行,比如这里的gssdp,还有我前段时间研究过的GStreamer。

 

 

 

vim用法

plugin

filetype

vim自带了一些filetype plugin,你可以在$VIMTUNTIME/../ftplugin/中找到。VIMTUNTIME环境变量只有在vim编辑器中才有设置,要查看它的值,先打开vim,命令模式下输入:e $VIMRUNTIME/,然后按tab键就可以看到了。

需要安装某个文件类型的plugin,只需要将上面目录中对应的文件拷贝到~/.vim/ftplugin/中

linux下制作debian usb安装盘

一般说来,在linux下制作linux系统的usb安装盘,可以直接用”bootable usb creator”。比如我在ubuntu上就用这个工具成功制作过ubuntu和debian的usb安装盘。

可这个工具虽然方便,但由于整个过程全自动,除了问题也不懂怎么解决。比如我的一个u盘制作了多次安装盘之后就不能用bootable usb creator制作新的usb安装盘了,写入的时候报一个类似“invalid version number”的错误。

这里就介绍一种比较复杂的,手动步骤比较多的制作debian usb安装盘的方法。

partition

如果你的u盘比较大,整个u盘用来制作安装盘有点浪费,因此可以先将U盘分区,一个分区用于制作安装盘,另一个分区存储其他数据。如果之后需要制作其他启动盘,还可以再分区。

linux下可以用GParted来分区,Debian系统iso文件只有600多M,因此分1G就够用了。下面假设将U盘分成两个fat32分区,并将第一个作为debian启动盘。分区的时候为启动盘分区设置boot属性(同样可以再GParted里面设置)。

detec usb device name

在linux下运行fmesg命令检测连接的各磁盘名称,如果你只有一块硬盘,U盘一般会被命名为sdb。下面假设U盘名称就是sdb,我们要将系统文件安装在它的第一分区,也就是sdb1,如果你的U盘不是这个名称,请对应修改。

install MBR on the USB device

将sdX替换为你的U盘的设备名,比如sdb。

install-mbr来源于mbr 包,如果找不到该命令,请安装mbr。

create filesystem on the partition

将sdX替换为你要安装启动盘的U盘分区名,比如sdb1。

mkdosfs来源于dosfstools 包。

install a bootloader on the partition

我们使用syslinux bootloader,先确保你的系统安装了syslinux 和mtools 

安装bootloader之前确保该分区已经unmount,可以再GParted里面做这个操作。

将sdX替换为你要安装启动盘的U盘分区名,比如sdb1。

”This procedure writes a boot sector to the partition and creates the file ldlinux.sys which contains the boot loader code.“

add installer image to the partition

首先确保已经mount该分区(mount /dev/sdX1 /mnt)。

从 http://http.us.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/ 下载两个文件:vmlinuz和initrd.gz。如果使用直接在这个目录下这两个文件,那么制作的debian安装盘是用键盘操作的,不识别鼠标。如果要用鼠标操作,改用gtk子目录下的两个同名文件。

下载后将这两个文件放在分区根目录下

create a syslinux.cfg configuration file on the partition

在分区根目录下创建一个名为syslinux.cfg的文件,至少包含以下两行:

如果上一步下载的installer image是gtk目录下的文件,那么上面第二行最后要添加“ vga=788”(不包括引号)。

如果要在U盘启动的时候等待按回车键继续,在文件末尾添加一行:

 copy the ISO file of a Debian ISO image to the partition

接下来就可以将Debian系统文件(iso格式)拷贝到分区根目录下了。

Debian cd文件有好几个,一般命名为XXXcd1.iso, XXXcd2.iso 之类的,我们安装系统只要下载第一个就可以了,其他的估计是一些软件包,我们可以根据需要直接在系统里面联网安装就行了。

完成之后unmount分区,usb系统安装盘就制作完成了。