2013-2-21 15:03:43
sendURCNative 为什么超过10s 没有返回?
#00 pc 0000c978 /system/lib/libc.so (write+12)
#01 pc 00079e15 /system/lib/libandroid_runtime.so
#02 pc 0001f330 /system/lib/libdvm.so (dvmPlatformInvoke+112)
#03 pc 0004e079 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+360)
#04 pc 000287e0 /system/lib/libdvm.so
#05 pc 0002cfa8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
#06 pc 0005f93f /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
#07 pc 000668e5 /system/lib/libdvm.so
#08 pc 000287e0 /system/lib/libdvm.so
#09 pc 0002cfa8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
#10 pc 0005f695 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
#11 pc 0004a6a7 /system/lib/libdvm.so
#12 pc 00048bfd /system/lib/libandroid_runtime.so
#13 pc 00049619 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+368)
#14 pc 00000dcf /system/bin/app_process
#15 pc 00017113 /system/lib/libc.so (__libc_init+38)
#16 pc 00000b34 /system/bin/app_process
502static jboolean sendURCNative(JNIEnv *env, jobject obj, jstring urc) {
503#ifdef HAVE_BLUETOOTH
504 native_data_t *nat = get_native_data(env, obj);
505 if (nat->rfcomm_connected) {
506 const char *c_urc = env->GetStringUTFChars(urc, NULL);
507 jboolean ret = send_line(nat->rfcomm_sock, c_urc) == 0 ? JNI_TRUE : JNI_FALSE;
508 if (ret == JNI_TRUE) pretty_log_urc(c_urc);
509 env->ReleaseStringUTFChars(urc, c_urc);
510 return ret;
511 }
512#endif
513 return JNI_FALSE;
514}
按line进行发送
也是属于网络的一种
kernel/net/bluetooth/af_bluetooth.c
------ SYSTEM LOG (logcat -v threadtime -d *:v) ------
--------- beginning of /dev/log/system
02-14 15:47:42.140 726 22837 E Bluetooth HS/HF: BluetoothSocket could not connect
02-14 15:47:52.770 440 455 W BroadcastQueue: Timeout of broadcast BroadcastRecord{41c03c70 android.intent.action.SCREEN_OFF} - receiver=android.os.BinderProxy@41ac3420, started 10000ms ago
02-14 15:47:52.770 440 455 W BroadcastQueue: Receiver during timeout: BroadcastFilter{41ac36d0 ReceiverList{41ac3630 726 com.android.phone/1001 remote:41ac3420}}
02-14 15:47:52.810 726 726 E BT HSHFP: write_error_check: write() failed: Interrupted system call (4)
BT 断了之后就不应该继续向下写
phone 还有个蓝牙耳机的问题
搜索设备后匹配
"BT EventLoop" prio=5 tid=57 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x419aaab0 self=0x51a8f9d8
| sysTid=633 nice=0 sched=0/0 cgrp=apps handle=1339766944
| schedstat=( 0 0 0 ) utm=9 stm=3 core=0
#00 pc 0000dae8 /system/lib/libc.so (poll+12)
#01 pc 00081abd /system/lib/libandroid_runtime.so
#02 pc 00012df0 /system/lib/libc.so (__thread_entry+48)
#03 pc 00012548 /system/lib/libc.so (pthread_create+172)
at dalvik.system.NativeStart.run(Native Method)
at android.bluetooth.HeadsetBase.sendURCNative(Native Method)
at android.bluetooth.HeadsetBase.sendURC(HeadsetBase.java:272)
at com.android.phone.BluetoothHandsfree.sendURC(BluetoothHandsfree.java:1937)
at com.android.phone.BluetoothHandsfree.access$1900(BluetoothHandsfree.java:68)
at com.android.phone.BluetoothHandsfree$BluetoothPhoneState.handlePreciseCallStateChange(BluetoothHandsfree.java:1468)
at com.android.phone.BluetoothHandsfree$BluetoothPhoneState.access$2200(BluetoothHandsfree.java:779)
at com.android.phone.BluetoothHandsfree$BluetoothPhoneState$1.handleMessage(BluetoothHandsfree.java:858)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4792)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)
at dalvik.system.NativeStart.main(Native Method)
Unsolicited Result Code URC 是主动返回码
phone 在主动发送URC 的时候被阻塞住了,call 状态发生了什么变化
以AT指令的形式来挂断BT 耳机
修改音量也是用同样的方式
修改xml来控制共享的文件类型
HFP 使用bt设备来控制手机
hsp bt设置作为耳机的模式存在
双工的串口需要3根数据线
A2DP 可以使用蓝牙支持立体声
org.bluez.intent.action.DISCOVERY_STARTED 开始探测
org.bluez.intent.action.REMOTE_DEVICE_FOUND 远程设备找到
org.bluez.intent.action.REMOTE_NAME_UPDATED获取远程设备名称
org.bluez.intent.action.DISCOVERY_COMPLETED完成SDP
获取server 适配器之后就可以开始扫描探测了
bluez 通过dbus 通知,system server 中有一个线程监听bt 事件,收到事件之后,接着广播各种intent ,本质上也就是一种回调