Android 關於藍牙的局部運用的是BlueZ協定棧。然而直到眼前2.3.3都不曾伸展HID的profile,只是完成了最大致的Handset和d2dp的profile

 
01 一. 當地層

02

03 路徑:framework/base/core/jni/

04

05 比照android_server_BluetoothA2dpService.cpp修建 android_server_bluetoothHidServer.cpp。該類中首要是穿過dbus對bluez協定棧的走訪,dbus 的通用方式都在android_bluetooth_common.cpp中完成,我們做的僅僅是經過dbus_func_args_async調用到 bluez供給的input介面,AS3技術與提醒23-28。

06

07 重要得逞以下兩個方式函數:

08 tatic jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {#ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { const char *c_path = env->GetStringUTFChars(path, Null); bool ret = dbus_func_args_async(env, nat->conn, -1, Null, Null, nat, c_path, "org.bluez.Input", "Connect", DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(path, c_path); return ret ? JNI_TRUE : JNI_FALSE; }#endif return JNI_FALSE;} static jboolean disconnectSinkNative(JNIEnv *env, jobject object, jstring path) {#ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { const char *c_path = env->GetStringUTFChars(font-size: 8pt;">羊毛被</a>, Null); bool ret = dbus_func_args_async(env, nat->conn, -1, Null, Null, nat, c_path, "org.bluez.Input", "Disconnect", DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(path, c_path); return ret ? JNI_TRUE : JNI_FALSE; }#endif return JNI_FALSE;}

09 此地要留神將該檔增加到AndroidRuntime.cpp和Android.mk中,不然不會編譯到動態庫中。

10

11 此局部編譯後最終身成libandroid_runtime.so並輪換到system/libs下

12 二.Framework的java部分

13

14 路徑framework/base/java/android/server/中增加BluetoothHidService.java檔

15

16 路徑framework/base/java/android/bluetooth/中增加BluetoothHid.java和IBluetoothHid.aidl檔。

17 interface IBluetoothHid { boolean connect(in BluetoothDevice device); boolean disconnect(in BluetoothDevice device); int getState(in BluetoothDevice device); boolean setPriority(in BluetoothDevice device, int priority); int getPriority(in BluetoothDevice device);}

18 BluetoothHid.java中重要的兩個措施connect和disconnect間接地穿過aidl探訪BluetoothHidService。此地主要是得逞跨過程並為上層供給可直接走訪的計策。

19

20 由此framework的重要局部打包生成framework.Jar並最後策劃到system/framework裡。

21 三.使用(Settings.apk)

22

23 最終必要修正利用局部,使用部分的更正點對照疏散,GTK+的編譯還真煩瑣,不想框架層那樣整塊類比A2DP的樣子那麼適宜,但也不是說jni局部有多麼輕易。反而對於我這種對C語言不熟知的人來說,批改jni是最頭疼得事了。好在藍牙HID 這局部框架層的改動都是整塊舉行的,領會上還算比價簡單。

24

25 總的來說在Settings.apk中要修正的檔首要是這樣幾個:

26

27 LocalBluetoothProfileManager.java 此地首要供給一個HID的profile以便利用層走訪。建一個HIDProfile的class調用framework中的BluetoothHID。切實上即使穿過bender機制調用了BluetoothHidService。

28

29 CashedBluetoothDevice中添加顯現藍牙鍵盤的圖示,雅漾,BluetoothPairingDialog中則必要添加一段藍牙配對印證解決的代碼,我是比照i9000中先彈出一個亂數,然後在鍵盤中敲入相像的亂數即配對勝利,詳細落實如下:

30 Private view createView(){if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {...... // HID if (isDeviceKeyboard(mDevice)) { String pin = String.format("%06d", Long.valueOf(Math .abs(new Random().nextLong() % 1000000L))); mPairingView.setVisibility(View.GONE); messageView.setText(getString( R.string.bluetooth_enter_keyboard_pin_msg, pin, name)); byte[] bytePin = BluetoothDevice.convertPinToBytes(pin); if (bytePin != null) { mDevice.setPin(bytePin); } }……}

31 以上為android中完成藍牙鍵盤的詳細環節。

32

33 參看博客:Android 上得逞藍牙的一些Profile blog.163.com/hancker_31/blog/static/3558736120113271253306/即使一個大廣度的問題,這時,作為一種組織方式,「物件導向」不能幫我們些什麼嗎?
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()