Menu Home

Android增加Happy Touch触摸屏支持

1、在hid-ids.h中加入vid pid #define USB_VENDOR_ID_HAPPYTOUCH 0x0416 #define USB_DEVICE_ID_HAPPYTOUCH_SCREEN 0x5030 2、在hid-multitouch.c->mt_devices[] 中加入 { .driver_data = MT_CLS_DEFAULT, HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH, USB_DEVICE_ID_HAPPYTOUCH_SCREEN) } 3、在hid-core.c->hid_have_special_driver[]中加入HID_USB_DEVICE(VID,PID) { HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH,USB_DEVICE_ID_HAPPYTOUCH_SCREEN)} 4、设置kernel编译变量 $ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eabi- 5、在内核的config文件中,确认驱动中是否添加了hid-multitouch模块 运行make menuconfig后,将HID Multitouch panels选上。 $ make clear $ make mrproper $ make menuconfig Device Drivers —> HID Devices —> […]

sqlite的基本用法

介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。 数据库操作 查询已有数据库 $ sqlite > .databases 创建数据库 $ sqlite test.db 如果数据库已经存在了,则打开数据库。 创建表 sqlite> create table mytable(id integer primary key, value text); sqlite>为sqlite的命令行提示符 查看数据库中存在的表 $ sqlite .tables 往表中插入数据 sqlite> insert into mytable(id, value) values(1, ‘Micheal’); sqlite> insert into mytable(id, value) values(2, ‘Jenny’); sqlite> insert into […]

为Android app添加最终用户许可协议(EULA)

对一个android app来说,加入EULA已经是一个必不可少的内容了。下面将演示如何创建一个通用的Eula类。任何一个app都可以使用Eula.show()来显示自己的EULA,也可以通过实现Eula.OnEulaAgreedTo接口做进一步处理。 Eula.java /** 最终用户协议文件名由ASSERT_EULA定义,存放位置为项目的assets目录 */ public class Eula { private static final String ASSERT_EULA = “EULA”; private static final String PREFERENCE_EULA_ACCEPTED = “eula.accepted”; private static final String PREFERENCE_EULA = “eula”; /** 当用户选择同意后的回调函数。 */ static interface OnEulaAgreedTo { void onEulaAgreedTo(); } private static void accept(SharedPreferences preferences) { preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).commit(); } […]

Android音频之SoundPool

Android提供了两种不同的框架来处理音频,分别是: MediaPlayer / MediaRecoder:处理音频的标准方法,但数据源必须是文件或者基于流的数据。使用这个类处理音频文件的时候须有创建自己的线程运行。本文要说的SoundPool类就是使用了这个框架。   AudioTrack / AudioRecoder:该框架支持直接访问原始音频文件。用于在内存中处理音频文件,或者开始播放音频的同时写入缓冲区,或者在其他不需要文件和数据流的场合中使用。运行过程中不需要创建新线程。 SoundPool 和MediaPlayer主要用来播放一些长音频不同,SoundPool一般用来处理一些短的但是带有重叠,回放等特效的音频。这是因为SoundPool带有一个音频缓冲区,可以很方便的支持音频的回放、快放和慢放。 使用SoundPool的基本步骤 初始化 加载资源 播放 释放资源 测试SoundPool 我在测试过程中发现不能播放大于1M的音频文件,所以这里使用一个900K的sound.wav做测试。在点击Play后,音乐将重复播放5次(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第5个参数指定),每重复点击Play按钮,音乐会降低一半速率播放(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第6个参数指定)。测试程序同时最大可以叠加10个音频(SoundPool(10, AudioManager.STREAM_MUSIC, 0)中的第1个参数指定)。 public class AudioExamplesSP extends Activity { static float rate = 2f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playButton […]

ubuntu下编译ImageMagick使支持JPEG

OS : ubuntu 12.04 (32bit) ImageMagick ver : 6.8.4 ubuntu 12.04默认使用的是JPEG-8,但是ImageMagick-6.8.4需要JPEG-9。使用默认configure编译ImageMagick后,每当需要处理jpeg文件时,IMageMagick报错: Magick: Wrong JPEG library version: library is 80, caller expects 90 解决方法如下: 下载编译安装JPEG-9,下载地址http://www.ijg.org/ 。编译并安装到默认位置:/usr/local/ 使用下面的配置,重新编译ImageMagick-6.8.4,并且安装 $ ./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib –disable-static –with-quantum-depth=8 进入/usr/local/lib/下,查看一下libMagickCore-6.Q8.so的依赖库: $ ldd libMagickCore-6.Q8.so | grep -i jpeg 输出: libjpeg.so.9 => /usr/local/lib/libjpeg.so.9 (0xb711f000) libjpeg.so.8 => /usr/lib/i386-linux-gnu/libjpeg.so.8 (0xb67cb000) 结果显示ImageMagick已经正确连接到jpeg-9。 […]

Android使用多点触摸(一)

Android触摸事件分类 事件名 动作 ACTION_DOWN 按下第一个点 ACTION_POINTER_DOWN 按下第二个点 ACTION_MOVE 手势发生移动 ACTION_POINTER_UP 释放第二个点 ACTION_UP 释放第一个点 简单示例 activity_multitouch.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.Multitouch” > <ImageView android:id=”@+id/imageView” android:contentDescription=”@string/DESC” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:src=”@drawable/aywdhz8u” android:scaleType=”matrix” > </ImageView> </RelativeLayout> Multitouch.java public class Multitouch extends Activity implements OnTouchListener{ Matrix matrix = new Matrix(); Matrix […]

mac os下编译android源代码

Mac OS: 10.7.5 在MacOS上编译android源码的前提是你所使用的文件系统必须是 大小写敏感 的。下面的内容旨在说明如何在不破坏原有文件系统的基础上建立一个供编译android使用的文件系统。 检查你现有的文件系统 依次打开 GO —-> Utilities —-> Disk Utility.app查看当前磁盘的格式,如下图: 在左侧栏中选中你希望在上面编译android的那块磁盘,查看右侧栏中的“Format”一项,如果format格式中带有“Case-sensitive”字样,那么恭喜你,你不需要再做任何操作即可开始编译android源码了,否则,继续往下操作。 确定磁盘空间 当然最方便的方法是把整个磁盘都重新格式成大小写敏感的文件系统,然后重新安装系统。但那样做的成本比较高并且很浪费时间。这里要谈的是不破坏原有系统的前提下,创建一块只供编译android的文件系统。首先需要确保你磁盘的剩余空间在30G以上,编译整个android大概会使用掉25G空间(Google官方显示至少25G)。 创建磁盘镜像 打开一个Terminal,输入如下命令: $ hdiutil create -type SPARSE -fs ‘Case-sensitive Journaled HFS+’ -size 60g YOU_FOLDER/android.dmg 这条命令在你所指定的文件夹中(YOU_FOLDER)创建了一个大小写敏感的可以自增长的最大为60GB的镜像。查看你的文件夹出现了新文件android.img.sparseimage。接下来把这个镜像挂载到系统: $ hdiutil attach ./android.dmg.sparseimage -mountpoint /Volumes/android 这条命令把上一步中创建的android.dmg挂载到了/Volumes/android下,以后这里就是我们编译android的地方。如果你希望每次开机的时候系统自动挂载这个镜像,你可以把下面的命令放到你的~/.profile中。 $ hdiutil attach YOU_FOLDER/android.dmg.sparseimage -mountpoint /Volumes/android 接下来就是把down下来的android源码拷贝到/Volumes/android目录下进行编译。

Android 使用CountDownTimer

在onResume()方法中构造CountDownTimer的好处是,onResume()是在onRestoreInstanceState()之后执行的, 这样就可以在onRestoreInstanceState()中恢复上次倒计时后的剩余时间,这样在手机屏幕旋转后,倒计时不会重置。关于详细的Activity方法调用时序,请 点击这里。 MainActivity.java package com.example.countdowntimeexample; import android.os.Bundle; import android.os.CountDownTimer; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { private TextView mTimeLabel; CountDownTimer myTimer; long myTime = 30000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTimeLabel = (TextView) findViewById(R.id.text); } @Override protected void onResume() […]

Java线程同步方法

CountDownLatch CountDownLatch主要用来等待一系列线程都完成后,再继续下一步的执行,类似于C++中的join。 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchExample { public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); final CountDownLatch doneLatch = new CountDownLatch(10); for(int i = 0; i < 10; i++) { Runnable runnable = new Runnable() { @Override public void run() { try { […]

Android activity生命周期

Activity生命周期转换图 onCreate(Bundle): Activity生成时调用。如果存在使用OnSaveInstanceState方法保存的信息,将把保存的信息传递给OnCreate的Bundle参数。 onStart(): 在Activity即将显示的时候调用。 onResume(): 当Activity可以接受用户输入的时候调用。它是开始播放媒体文件的一个很好的时间点。 onPause(): Activity转入后台时调用。如果在调用这个方法之后,系统内存不足,这个Activity进程可能被终止掉。 onStop(): 暂时不使用Activity时调用这个方法(可能时因为其他Activity启动或者程序即将结束时)。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onRestart(): 调用onStop后,再次显示这个Activity时调用。 onDestroy(): Activity即将终止时调用。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onSaveInstanceState(Bundle): 保存实例的状态时调用。这里使用Bundle参数来保存值。当因为内存不足等原因而造成程序终止时,这个函数所保存的值能继续作为参数传递给onCreate()和onRestoreInstanceState(),因此,再次启动程序时就能利用这个传递给Bundle的值恢复之前的状态。 onRestoreInstanceState(Bundle): 在恢复实例的状态时调用。通过参数Bundle,可以获取通过onSaveInstanceState()保存的值,这个值与传递给onCreate()的内容相同。虽然采取任何一种方法进行恢复处理都没有问题,但是onRestoreInstanceState的处理方式跟自然。 Activity方法调用时序              ref: http://developer.android.com/guide/components/activities.html ref:《Android开发秘籍》 顺便推荐一款好用的在线UML工具: http://www.websequencediagrams.com/

Java语言中的静态类

在写Android程序的时候,系统会自动生成一个R.java,这个类中使用了大量的静态类,对一个C++程序员来说,这是个新鲜事物,下面来看看这个神奇的玩意。 静态内部类的语法 public class ExternalClass { public static final class InnerClass { //… } } 静态内部类的作用 一般情况很少会用到静态类,但它也并不是一无是处,不然Java也就不会引入这个语法了。静态内部类的一个最大的用处出现在对Java类的测试中,例如: public class Test { public static void main(String[] args) { Other.Test.printx(); } } class Other{ static class Test { Other o = new Other(); o.printx(); } public void printx() { System.out.println(“Other class”); } […]

Java语言中的异常处理

java异常分类 异常类层次 Throwable Java中所以的异常都是有Throwable继承而来。 Error Error类层次结构描述了JAVA运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的错误对象。如果程序出现了这样的内部错误,除了通告给用户,并尽力使程序安全终止之外,再无能为力。这种情况很少出现。 Exception 在设计JAVA程序时,需要关注Exception层次结构。这个层次结构又分为两个分支: Runtime Exception 由程序错误导致的异常属于Runtime Exception,相当于C++中的logic_error类。如果出现“Runtime Exception”异常,那么就一定是你的问题。应该通过检测数组下表是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生。派生于Runtime Exception的异常包含下面几种情况: 错误的类型转换 数组访问越界 访问空指针     IOException 派生于IOException的异常包含下面几种情况: 试图在文件尾部后面读取数据 试图打开一个错误格式的URL 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在 未检查异常和已检查异常     未检查异常 Java语言规范将派生于Error类或RuntimeException类的所以异常称为“未检查异常(unchecked exception)”。     已检查异常 除上面所述的未检查异常外的所以异常都称为“已检查异常(checked exception)”。编译器将核查是否为所有的已检查异常提供了异常处理器。 声明异常 方法应该在其首部使用throws关键字声明所有可能抛出的异常。例如: public FileInputStream(String name) throws FileNotFoundException 当一个方法有可能抛出多个已检查异常时,那么必须在方法的首部列出所有的异常类。例如: class MyClass { public void MyMethod(String s) throws EOFException, IOException { //… … […]

nvidia显卡的xorg配置

生成xorg配置 如果发现系统/etc/X11/xorg.conf文件丢失,你可以使用下面的命令生成一个新的xorg.conf文件 $ X –configure 新生成的xorg.conf.new一般在用户目录下,具体路径请查看输出结果,得到xorg.conf.new文件后需要把它拷贝到/etc/X11/下,并且更改文件名为xorg.conf。如果这个自动生成的文件不符合需求就需要根据具体情况做相应的修改。当然,更方便的方法就使从别的机器上拷贝/etc/X11/xorg.conf到你的系统中,针对Nvidia显卡的xorg配置都使通用的,然后再做相应的修改。 单屏xorg的配置 xorg.conf内容 # nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 260.19.44 ([email protected]) Sun Feb 27 21:50:39 PST 2011 Section “ServerLayout” InputDevice “irtouch” “SendCoreEvents” Identifier “Layout0” Screen 0 “Screen0” InputDevice “Keyboard0” “CoreKeyboard” InputDevice “Mouse0” “CorePointer” Option “Xinerama” “0” EndSection Section “Files” EndSection […]

android程序调用JNI

OS: MAC OS 10.7.5 Android: 4.3 NDK: android-ndk-r7c java: 1.6.0_51 使用JNI 在Eclipse中新建一个Android工程,假设项目目录为project,修改activity_main.xml 如下: <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <TextView android:id=”@+id/showText” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </RelativeLayout> MainActivity.java: package net.lnmcc.usejni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { // 加载JNI库 static […]

使用命令行工具构建android apk

新建工程 查看构建目标 输入下面的命令查看所以可构建目标: $android list targets 可能的输出: Available Android targets: ———- id: 1 or “android-3” Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P ABIs : armeabi ———- id: 2 or “Google Inc.:Google APIs:3” Name: Google APIs Type: Add-On Vendor: Google Inc. […]

WordPress twentytwelve主题:修改页面宽度

WordPress twentytwelve主题:修改页面宽度 Wordpress twentytwelve theme以简洁取胜,但是这个主题是固定页面宽度的(默认值为960),如果网站上放置的东西多一点就会显得拥挤不堪,破坏了其整体整洁性,下面介绍的方法可以很方便的更改这个主题的宽度: 打开主题的style.css文件(可以使用WP后台编辑也可以直接进主机目录修改 一个可能的路径 /var/www/wordpress/wp-content/themes/twentytwelve 查找下面的内容(在我的主机上是在655行) /* Footer */ footer[role=”contentinfo”] { border-top: 1px solid #ededed; clear: both; font-size: 12px; font-size: 0.857142857rem; line-height: 2; max-width: 960px; max-width: 68.571428571rem; margin-top: 24px; margin-top: 1.714285714rem; margin-left: auto; margin-right: auto; padding: 24px 0; padding: 1.714285714rem 0; } 把其中的max-width修改成符合你要求的数值,px和rem之间的换算关系可以简单的用px / 14来计算,比如1000px / 14 […]

基于QWebView的浏览器Widget (DEMO)

OS : ubuntu 12.04 QT : 4.8.4 //测试时发现QT5的QWebView在加载Flash时会出现黑块,速度也比4.8慢很多。 如果有不能打开网页图片的情况,可能是因为你的QT找不到图片插件,解决方法如下:  导入QT图片插件路径:  export QT_PLUGIN_PATH=/usr/lib/qt4/plugins  拷贝图片插件到工程目录:  cp -av /usr/lib/qt4/plugins/imageformats/ ~/Projects/browser <—-你自己的工程目录 BrowserWidget.pro #只是一个Demo用以测试QWebView QT += core gui webkit webkitwidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = BrowserWidget TEMPLATE = app SOURCES += main.cpp \ MyWebView.cpp \ MyBrowser.cpp HEADERS += \ MyWebView.h \ MyBrowser.h […]

android平台YUV420SP到RGB565的转换

/** * @param yuvDataArray * @param width * @param height * @return int[] : ARGB array * @throws NullPointerException * @throws IllegalArgumentException */ private static int[] decodeYUV(byte[] yuvDataArray, int width, int height) throws NullPointerException, IllegalArgumentException { int size = width * height; if(yuvDataArray == null) throw new NullPointerException(“buffer yuvDataArray is […]

linux串口设备识别和信息收发

OS : ubuntu 12.10 & opensuse 11.4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <asm-generic/ioctls.h> #include <errno.h> #define version “1.0” #define FALSE -1 #define TRUE 0 int speed_attr[] = { B38400, B19200, B115200, B9600, B4800, B1200, B300, B38400, B19200, B9600, B4800, B1200, […]

Linux串口编程详解

串口本身,标准和硬件 串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。 某些计算机使用一个叫做UART的集成电路来作为串口设备。这个集成电路可以进行字符和异步串行通讯序列之间的转换,并且可以自动地处理数据的时序。而某些低端设备则会让CPU直接通过输出针来传送数据,这种技术叫做bit-banging。 因为“串口”,RS-232和UARTs基本上总是在同一个语境中出现,所以这些名词通常会被搞混。下面逐一解释以下一些重要的名词和术语。 什么是串行通信 计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。 当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。每个位可能是on(1)或者off(0)。很多技术术语中经常用mark表示on,而space表示off。 串行数据的速度通常用每秒传输的字节数bits-per-second(bps)或者波特率(baud)表示。这个值表示的是每秒钟被送出的0和1的个数。很久很久以前,300bps就是很快的速度了,而现在的电脑可以处理高达430,800的RS-232速率。表示波特率的单位还有kpbs和Mbps,1kps=1000bps而1Mbps=1000kbps。 一般有人提到串行设备的时候,它通常说可能是某种数据通讯设备-DCE(Data Communications Equipment)或者数据终端设备-DTE(Data Terminal Equipment)。它们之间的区别非常简单,每个信号对,比如传送和接收,它们俩正好是相反的。如果需要将两个DTE或者DCE设备连接起来的话,需要适配器或者交叉线缆将信号对交换。

使用Java 代理(proxy)类

HelloWorld.java package net.lnmcc.www; public interface HelloWorld { public void sayHelloWorld(); public void sayGoodBye(); } HelloWorldHandler.java package net.lnmcc.www; import java.lang.reflect.*; public class HelloWorldHandler implements InvocationHandler { private Object obj; public HelloWorldHandler(Object obj) { super(); this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result […]

Android下编译OTA升级包

ref : http://blog.csdn.net/llping2011/article/details/9471913 概念介绍 我们知道Android系统一般可以通过本地升级和空中升级两种,一般本地升级包括SD卡升级、U盘升级、串口升级等。而所谓的空中升级就是通过网络将升级包下载升级包到本地,进行升级。 而OTA升级作为Android系统提供的标准软件升级方式,同时支持本地升级如SD卡或U盘 和 空中升级如网络。OTA升级一般分为全包升级和差分升级。 全包升级:编译当前系统得到的软件包,不依赖于当前手机里的软件版本 差分升级:对手机两个软件版本做差分,在第一个版本上打patch得到第二个升级包,所以差分升级只能对第一个版本的机器进行升级 编译方法 在源码根目录下执行: make otapackage 注意:执行这句命令之前需要在根目录下make编译整个源码。 在out/target/product/$(PRODUCT_NAME)/$(BUILD_NAME)-target-files-$(BUILD_NUMBER).zip文件,其中$(PRODUCT_NAME)是编译产品名字,$(BUILD_NAME)是编译的版本名字,$(BUILD_NUMBER)一般是编译的版本号。以我的fsl的Qiyi版本为例。 生成文件目录为:out/target/product/sabresd_6dq/Qiyi-target-files-20130725.zip文件 拷贝到U盘下的upgrade目录下即可(有的是直接拷贝到U盘根目录下,各个代码不一样)。