20160531添加:
Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper。
framework\CCJNIHandler.java
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
一、介绍三个相关的类
1、 Handler主要有两个用途:
首先是可以定时处理或者分发消息,
其次是可以添加一个执行的行为在其它线程中执行,
对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖handleMessage方法,可以根据参数选择对此消息是否需要做出处理,这个和具体的参数有关。例如下代码:
// ===========================================================
// Methods
// ===========================================================
public Handler handler = new Handler() {
public void handleMessage(Message msg) {//覆盖handleMessage方法
switch (msg.what) {//根据收到的消息的what类型处理
case CCJNIHandler.HANDLER_SHOW_MESSAGEBOXYESORNO: {
showDialog(msg);
break;
}
case CCJNIHandler.HANDLER_RUN_DOWNLOAD: {
runDownload(msg);
break;
}
case CCJNIHandler.HANDLER_THREAD_UPDATE: {
UpdateMessage updateMsg = (UpdateMessage) msg.obj;
DecimalFormat df1 = new DecimalFormat("00.00%");
double x = updateMsg.current * 1.0;
double y = updateMsg.max * 1.0;
String ratio = df1.format(x / y);
Log.e("debug", "handleMessage.ratio=" + ratio);
mProgress.setProgress((int) (x / y));
mProgress.setMessage("已经更新:" + getAB(updateMsg.current) + "/"
+ getAB(updateMsg.max) + " (" + ratio + ")");
break;
}
case CCJNIHandler.HANDLER_TENCENT_SHARE:{
TencentShare(msg);
break;
}
}
}
};
20160130-20160206添加:
三星i809 2.2.3实现GSM上网
——关键是得到i809的G网补丁
开始操作,实现G网上网:
A. 首先,下载我提供的“实现G网上网全部文件.rar”压缩包
B. 将压缩包解压,得到telephony.db、twframework-res.apk、framework.jar、services.jar、gsmtelephony_46000.db、gsmtelephony_46002.db、gsmtelephony_4607.db七个文件。
C. 请根据你的手机号前三位,然后选择gsmtelephony_46000.db、gsmtelephony_46002.db、gsmtelephony_4607.db其中的一个文件,并将文件名改为gsmtelephony.db
D. 手机连接USB,将telephony.db、twframework-res.apk、framework.jar、services.jar、gsmtelephony.db五个文件拷贝到手机的sdcard目录下。
接下来用手机操作(i809要先利用百度手机助手下载超级Root大师ROOT),打开RE管理器这个程序,点击【读/写】按钮(ROOT之后才会有这个按钮):
A. 把twframework-res.apk、framework.jar、services.jar复制进/system/framework/,覆盖同名文件,然后重新启动手机。
B. 把telephony.db和gsmtelephony.db复制进/dbdata/databases/com.android.providers.telephony/,覆盖同名文件。
复制覆盖这5个文件后,权限更改为原来的权限。
C. 退出RE管理器,重启手机。
Win8.1/XP下i809 Android2.2.3刷机成2.3.6、2.2.3
工具原料:
0、数据线
1、F:\soft\SAMSUNG_USB_Driver_for_Mobile_Phones\SAMSUNG_USB_Driver_for_Mobile_Phones.exe
2、F:\soft\三星I809_2.3.6_FG05.tar_liqucn.com\NG1128-I809-FG05.tar.md5
3、Odin3 v1.85
<ID:0/003> Added!!
<OSM> Enter CS for MD5..
<OSM> Check MD5.. Do not unplug the cable..
<OSM> Please wait..
<OSM> NG1128-I809-FG05.tar.md5 is valid.
<OSM> Checking MD5 finished Sucessfully..
<OSM> Leave CS..
<ID:0/003> Odin v.3 engine (ID:3)..
<ID:0/003> File analysis..
<ID:0/003> SetupConnection..
<ID:0/003> Initialzation..
<ID:0/003> Get PIT for mapping..
<ID:0/003> Firmware update start..
<ID:0/003> cache.rfs
<ID:0/003> NAND Write Start!!
<ID:0/003> factoryfs.rfs
<ID:0/003> modem_qsc6085.bin
<ID:0/003> Copy modem binary from AP to QSC.
<ID:0/003> Please wait about 3 min.
<ID:0/003> Copy done
<ID:0/003> zImage
<ID:0/003> dbdata.rfs
<ID:0/003> modem.bin
<ID:0/003> Sbl.bin
<ID:0/003> RQT_CLOSE !!
<ID:0/003> RES OK !!
<ID:0/003> Completed..
<OSM> All threads completed. (succeed 1 / failed 0)
<ID:0/003> Removed!!
<ID:0/004> Added!!
不要用3.0.7这个版本
Odin3 v3.07
<ID:0/003> Added!!
<OSM> Enter CS for MD5..
<OSM> Check MD5.. Do not unplug the cable..
<OSM> Please wait..
<OSM> NG1128-I809-FG05.tar.md5 is valid.
<OSM> Checking MD5 finished Sucessfully..
<OSM> Leave CS..
<ID:0/003> Odin v.3 engine (ID:3)..
<ID:0/003> File analysis..
<ID:0/003> SetupConnection..
<ID:0/003> Initialzation..
<ID:0/003> Get PIT for mapping..
<ID:0/003> Firmware update start..
<ID:0/003> cache.rfs
<ID:0/003> NAND Write Start!!
<ID:0/003> factoryfs.rfs
<ID:0/003> modem_qsc6085.bin
三星i809
2011.4上市
4英寸,800*480像素
CPU:单核1GHz
运行内存RAM:512MB【内存管理器中显示147MB/339MB】
机身存储ROM:4GB
ROM容量=系统空间(占用几百MB-2GB)+用户安装程序空间(2GB)+用户存储空间(不到1GB)
20160125添加:
应用宝关于手机
处理器:ARMv7 Processor rev2(v7l)
内存:328M
屏幕分辨率:800*480
手机串号:A0000030D850F9
手机内存:1GB
SD存储卡:2.69GB
手机内存1.00GB,剩余627.11MB
SD卡空间2.69GB,剩余819.25MB
功能:判断Android手机是否Root
测试结果:三星i809和模拟器均显示已Root,小米2S显示未Root
i809恢复出厂设置
为了安全起见,您的手机已设置为禁止安装不是从Android电子市场中获取的应用程序。
【设置】【取消】
在授权管理里面清除Root权限,i809显示未Root
MacAddr:50:CC:F8:7F:CD:9F
AndroidID:9774d56d682e549c(刷成2.3.6后,变为b455b80d14e7f14f)
代码如下:
import java.io.File;
private final static int kSystemRootStateUnknow=-1;
private final static int kSystemRootStateDisable=0;
private final static int kSystemRootStateEnable=1;
private static int systemRootState=kSystemRootStateUnknow;
// 查找是否有su文件来判断一个手机是否Root
public static boolean isRootSystem() {
if (systemRootState == kSystemRootStateEnable) {
return true;
} else if (systemRootState == kSystemRootStateDisable) {
return false;
}
File f = null;
final String kSuSearchPaths[] = { "/system/bin/", "/system/xbin/",
"/system/sbin/", "/sbin/", "/vendor/bin/" };
try {
for (int i = 0; i < kSuSearchPaths.length; i++) {
f = new File(kSuSearchPaths[i] + "su");
if (f != null && f.exists()) {
systemRootState = kSystemRootStateEnable;
return true;
}
}
} catch (Exception e) {
}
systemRootState = kSystemRootStateDisable;
return false;
}
或者
/**
* 判断当前手机是否有ROOT权限
* @return
*/
public boolean isRoot(){
boolean bool = false;
try{
if ((!new File("/system/bin/su").exists()) && (!new File("/system/xbin/su").exists())){
bool = false;
} else {
bool = true;
}
//Log.d(TAG, "bool = " + bool);
} catch (Exception e) {
}
return bool;
}
20151221添加:
用Android SDK Manager下载Documentation for Android SDK,API 19,revison 2、Documentation for Android SDK,API 23,revison 1
F:\adt-bundle-windows-x86_64-20130729\sdk\docs\reference\android\hardware\usb\UsbDevice.html
Android输入事件介绍
http://wenku.baidu.com/link?url=ZNzx2xocQOjOsJU2FaW1rKulZFPchLGPemxVojxO95j_3dhuc00XO961uOC07vGFikIi0KeUZydVvJDECdeAee1RWZKQUS4bEcrrdMSf3hW
输入事件介绍
1.输入
2.读取
3.派发
Key Dispatch
Sensor Dispatch
4.应用
按键、鼠标、触控输入事件的响应
Override以下函数:
onKeyDown
onKeyUp
onKeyLongPress
onKeyMultiple
onGenericMotionEvent
dispatchGenericMotionEvent
dispatchTouchEvent
为控件注册Listener函数:
setOnKeyListener onKey
setOnClickListener onClick
setOnGenericMotionListener onGenericMotion
setOnHoverListener onHover
5.系统键
6.虚拟输入
Android应用程序中事件处理
http://wenku.baidu.com/view/5e567b74f242336c1eb95e80.html?re=view
Android应用程序输入事件处理机制
http://wenku.baidu.com/view/c920ace5b0717fd5370cdc26.html?re=view#
Android事件处理模型
http://wenku.baidu.com/view/b75706808762caaedd33d4e3.html?re=view
Android平台的事件处理机制有两种,一种是基于回调机制的事件处理,一种是基于监听接口的事件处理。
Android事件处理过程剖析
http://wenku.baidu.com/view/96a75e264b35eefdc8d3337f.html?re=view
Android系统中由Window Manager Service来管理不同的View。对于键盘这类事件也是由这个服务来分发给不同的View。这个服务会通过KeyInputQueue.java文件中定义的服务来负责接收来自硬件模拟层的事件。
Key Input Queue负责在Android运行期间检测键盘、触摸屏、轨迹球事件,并将事件发送给应用程序。
键盘等事件检测在KeyInputQueue.java中,启动一个线程通过死循环来不停的以JNI方式调用com_android_server_KeyInputQueue.cpp中的readEvent方法来检测是否有事件发生。
对于这类事件如何分发给不同的应用程序则是由KeyInputQueue的继承类InputDispatcherThread来实现。该类定义在WindowManagerService.java中。
InputDispatcherThread从KeyInputQueue类中读取事件并分发给上层应用程序。键盘事件由dispathKey发送,触摸事件由dispathPointer发送,轨迹球事件由dispathTrackball发送。
在这个过程中对于一些特殊按键的由PhoneWindowManager类来处理,比如关闭系统,声音调节等。
Android usb host读写USB设备
自Android 3.1以后Android增加了操作USB设备的API。
http://www.android100.org/html/201406/06/20142.html
当你的Android设备在USB主机模式中时,它作为USB主机给从属设备供电,并会列举被连接的USB设备。
USB主机模式在Android3.1以后开始被支持。
下表介绍了在Android.hardware.usb包中的USB主机模式API。
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
UsbManager用于列举被连接的USB设备,并跟其通信。
UsbDevice代表了一个被连接的USB设备,并且包含了访问它的识别信息、接口和端点的方法。
UsbInterface代表了USB设备的接口,该接口定义了设备的一组功能。一个设备可以有一个或多个用于通信的接口。
UsbEndpoint代表一个接口端点,它是跟接口通信的通道。一个接口可以有一个或多个端点,通常会有跟设备进行双工通信的输入和输出端点。
UsbDeviceConnection代表一个设备连接,它在端点之上传输数据。这个类用于在连接的两个设备间使用同步或异步的方式来回发送数据。
UsbRequest代表一个通过UsbDeviceConnection对象跟设备通信的异步请求。
UsbConstants定义了Linux内核中linux/usb/ch9.h文件定义对应的USB常量。
Android清单要求(AndroidManifest.xml):
<uses-feature android:name="android.hardware.usb.host" />
把应用程序的最小SDK设置为API level 12或更高的版本。在较早的API版本中不存在USB主机模式API。
Android 2.3.1 'Gingerbread'(API level 9)
Android 3.1 'Honeycomb'(API level 12)
Android 4.1 'Jelly Bean'(API level 16)【小米2S上Android版本4.1.1】
Android 4.2 'Jelly Bean'(API level 17)
Android 4.4 'Kit Kat'(API level 19)【TV上Android版本4.4.2】
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" />
官网地址: http://developer.android.com/guide/topics/connectivity/usb/host.html
读写数据:
UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点
UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);//读数据节点
UsbEndpoint outEndpoint = usbInterface.getEndpoint(1);//写数据节点
UsbDeviceConnection connection = usbManager.openDevice(usbDevice);
connection.claimInterface(usbInterface, true);
//发送数据
byte[] byte2 = new byte[64];
int out = connection.bulkTransfer(outEndpoint, cmd, cmd.length, 3000);
//读取数据1 两种方法读取数据
int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);
Log.e("ret", "ret:"+ret);
for(Byte byte1 : byte2)
{
System.err.println(byte1);
}
//读取数据2【现在的项目采用这种方法,inMax=64】
/*int outMax = outEndpoint.getMaxPacketSize();
int inMax = inEndpoint.getMaxPacketSize();
ByteBuffer byteBuffer = ByteBuffer.allocate(inMax);
UsbRequest usbRequest = new UsbRequest();
usbRequest.initialize(connection, inEndpoint);
usbRequest.queue(byteBuffer, inMax);
if(connection.requestWait() == usbRequest){
byte[] retData = byteBuffer.array();
for(Byte byte1 : retData){
System.err.println(byte1);
}
}*/
}
首先得到可以操作USB设备的节点Endpoint,0为读数据节点,1为写数据节点。【现在的项目只用到了0节点】
然后使用connection.bulkTransfer(endpoint, buffer, length, timeout) 发送数据。
我这里读数据的时候有两种方法,读数据1和读数据2
注意:写数据时传入的是写数据节点OutEndpoint,读数据时传入的是读数据节点InEndpoint。
代码下载: http://download.csdn.net/detail/centralperk/5743323