- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在 ASUS MemoPad HD (4.2.2) 和 LG P769 (4.1.2) 上进行测试。我写了一个简单的程序来说明我的问题:
package wat.bluetoothtester;
import java.util.*;
import java.io.*;
import android.app.Activity;
import android.os.Bundle;
import android.bluetooth.*;
import android.view.*;
import android.util.*;
public class BluetoothTester extends Activity
{
private final String ADDR = "00:02:72:C6:C2:3C";
private final UUID _UUID = UUID.fromString("ca444490-3569-4c82-b505-defbc71e9868");
private BluetoothSocket _socket;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void send(View v){
try {
this._socket.getOutputStream().write('x');
}
catch (IOException e){
Log.e("", e.toString());
}
}
public void connect(View v){
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(ADDR);
try {
this._socket = device.createInsecureRfcommSocketToServiceRecord(_UUID);
this._socket.connect();
}
catch (IOException e){
Log.e("", e.toString());
}
}
public void disconnect(View v){
try {
this._socket.close();
}
catch (IOException e){
Log.e("", e.toString());
}
}
}
我知道它会阻塞,但这不是问题所在。得到了一个带有 3 个按钮的简单布局,正如您可以从代码中猜到的那样。如有必要,我会发帖。我的计算机上还运行着一个简单的 Python 服务器,它只会吐出它接收到的任何数据,而不会发送任何数据。
无论如何,我第一次在我的 4.2.2 设备上运行它时,它运行良好。我可以随意连接和断开,发送数据,没问题。现在,由于我正在开发应用程序,所以我必须经常将新的 APK 推送到设备。一旦我这样做,无论我是否断开连接,写入都会开始失败。最奇怪的是,服务器实际上接收到数据并打印出来,但是 write() 调用仍然阻塞:
11-19 12:34:30.127: E/(3484): java.io.IOException: [JSR82] write: write() failed.
11-19 12:34:30.127: E/(3484): at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:702)
11-19 12:34:30.127: E/(3484): at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:56)
11-19 12:34:30.127: E/(3484): at wat.bluetoothtester.BluetoothTester.send(BluetoothTester.java:29)
11-19 12:34:30.127: E/(3484): at java.lang.reflect.Method.invokeNative(Native Method)
11-19 12:34:30.127: E/(3484): at java.lang.reflect.Method.invoke(Method.java:511)
11-19 12:34:30.127: E/(3484): at android.view.View$1.onClick(View.java:3633)
11-19 12:34:30.127: E/(3484): at android.view.View.performClick(View.java:4243)
11-19 12:34:30.127: E/(3484): at android.view.View$PerformClick.run(View.java:17520)
11-19 12:34:30.127: E/(3484): at android.os.Handler.handleCallback(Handler.java:725)
11-19 12:34:30.127: E/(3484): at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 12:34:30.127: E/(3484): at android.os.Looper.loop(Looper.java:153)
11-19 12:34:30.127: E/(3484): at android.app.ActivityThread.main(ActivityThread.java:5299)
11-19 12:34:30.127: E/(3484): at java.lang.reflect.Method.invokeNative(Native Method)
11-19 12:34:30.127: E/(3484): at java.lang.reflect.Method.invoke(Method.java:511)
11-19 12:34:30.127: E/(3484): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
11-19 12:34:30.127: E/(3484): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-19 12:34:30.127: E/(3484): at dalvik.system.NativeStart.main(Native Method)
很明显这会抛出 IOException,即使数据已成功发送。这意味着该程序在技术上可以运行,但是 write() 会阻塞 UI 大约 10-15 秒,直到抛出异常。我试过将 write() 放入它自己的线程中,然后只创建一个它随意清空的 TX 缓冲区。这当然不会导致 UI 阻塞,但我需要等待 write() 超时,所以这对我也没有真正的帮助。在我重新启动设备之前都是这种情况。连接/断开连接仍然可以正常工作。
这在我的 4.1.2 设备上不会发生,无论我上传新 APK 或终止进程多少次。
我在使用 BlueTerm 时也确认了同样的问题,BlueTerm 是一个用于 RFCOMM 串行连接的终端类型应用程序(实际上非常好,而且源代码可用)。
我的两个设备都已经 root 了,我真的不想走这条路,但是有没有办法重新启动蓝牙服务或手动清除连接池,或者其他什么?
最佳答案
JSR82 的 MediaTek JNI 实现对于 Android 来说效果不是很好
它创建一个数组来存储连接上下文:
btmtk_jsr82_mmi_context_struct g_jsr82MMIContext[JSR82_PORT_NUM];
创建新套接字时,它使用第一个上下文位置而不是 inUse,除非您正确关闭套接字(请注意这是一个共享服务),否则 inUse 标志不会被清除。
问题是只有 g_jsr82MMIContext[0] 似乎在 write() 结束时正确接收 EVENT_JSR82_MMI_TX_READY_IND 事件
套接字文件描述符似乎是硬编码的,g_jsr82MMIContext[0] 处的套接字是 0x8000,所以通过反射你可以“伪造”那个套接字并关闭它以清除 g_jsr82MMIContext[0].inUse 标志,所以下次它将可用。
public void connect(View v){
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(ADDR);
try {
BluetoothSocket bs = device.createRfcommSocketToServiceRecord(_UUID);
Field f = bs.getClass().getDeclaredField("mFdHandle");
f.setAccessible(true);
f.set(bs, 0x8000);
bs.close();
Thread.sleep(2000); // Just in case the socket was really connected
} catch (Exception e) {
Log.e(TAG, "Reset Failed", e);
}
try {
this._socket = device.createRfcommSocketToServiceRecord(_UUID);
this._socket.connect();
} catch (IOException e) {
Log.e(TAG, "create() failed", e);
}
}
关于java - Android BluetoothSocket 写入在 4.2.2 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20078457/
我有一个同时运行 3 个线程的应用程序。一个线程用于在手机和另一个蓝牙设备(Arduino)之间建立蓝牙连接。线程 2 通过蓝牙播放从另一部手机传入的音频。线程 3 录制音频并通过蓝牙将音频发送到另一
嗨我正在尝试实现一个蓝牙库,我想在其中连接一次 rfcomm 套接字,然后在所有调用中重用它。我想知道它是否已连接,以便知道我是否应该调用 connect方法。我在蓝牙套接字的源代码中找不到任何东西,
我是 Android 的新手。现在我正在尝试使用蓝牙 API 制作一个两人 Pong 游戏。我或多或少尝试过复制 Android 网站上的 BluetoothChat 教程,但在切换到 Connect
我们的设备通过蓝牙发送数据,在android应用中我们需要读取这些数据。 我能够建立蓝牙连接,接下来我调用线程以使用 BluetoothDevice 建立 BluetoothSocket 连接。此处读
我有一个应用程序,它通过蓝牙连接到 RaspberryPi,并在接收一些数据时将相同的数据循环给它。 我在连接时遇到了一些问题,因此需要使用此解决方法将我的 Android 手机连接到 Raspber
我已经创建了一个 Android 应用程序,如果我的 Android 有一个蓝牙连接到我的电脑并且我关闭了我的电脑,isConnected 仍然返回 true。有人知道这是否可以修复吗? 不知道有没有
我希望在我的 Android 应用程序中通过蓝牙执行设备到设备的文件传输。目前我已经编写了在多个蓝牙设备之间建立连接所需的代码,并且我已经检索到连接的 BluetoothSockets 以进行数据交换
我已经编写了一个用于连接外部配件的蓝牙 API。API 的设计方式是有一堆阻塞调用,例如 getTime、setTime、getVolume、setVolume等这些工作的方式是它们创建一个有效负载来
我以这种方式创建了 gpsSocket: final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
基本上,我一直在研究使用蓝牙或 wifi 的无线鼠标。我已经完成了所有工作,包括阅读和编写消息。但是,通过蓝牙传输数据的速度太慢,无法弥补。我到处都看了看,但我无法弄清楚是什么导致了这种速度。我正在使
我应该在蓝牙输入流的 readLine 上插入超时。 BluetoothDevice device = BluetoothAdapter.getDefaultAdapter()
我遇到了这种罕见的情况,在这种情况下,我尝试将 BluetoothSocket 连接到服务器,但连接方法不会返回。这是我的代码: device = _adapter.getRe
我正在编写一个将从另一台设备接收串行数据的应用程序(不是 Android,如果重要的话它将是 Bluesmirf Silver 模块,但现在我只在我的笔记本电脑蓝牙适配器上尝试)。这是我正在使用的代码
我的程序与充当服务器的嵌入式蓝牙设备连接。我成功找到了附近的蓝牙设备,但是当我尝试连接到新设备时,我的程序因调用 BluetoothSocket.connect() 时出现 IO 异常而崩溃。我无法弄
我无法启动 Java 服务器(在 Windows 7 x64 上使用 bluecove 2.1.1,外部蓝牙加密狗)和 Android 客户端(操作系统版本 2.3。 6). 设备发现工作正常,但我无
是否有机会为设置超时 BluetoothSocket.connect(); 以便该方法在一定时间后取消? 谢谢! 最佳答案 如果你想在设备在一定时间内没有连接时取消连接尝试,那么运行一个线程。 run
我使用修改后的Google Bluetooth Chat应用程序在两个 Android 设备(Android 5 和 Android 6)之间进行客户端-服务器蓝牙 RFCOMM 通信。 我的客户端应
我正在查看 Bluetooth Chat sample application来自 Google,他们在 UI 线程上写入 BluetoothSocket 的 OutputStream。那是对的吗?通
我正在尝试连接到配对的蓝牙 设备(baracoda d-fly 条形码阅读器)。我尝试了市场上的程序 GetBlueDemo,它成功地从它的套接字中读取。 我写了自己的概念证明,但当我尝试连接到设备时
连接到蓝牙后,我需要 child 通过那个套接字发送数据。但是如何将套接字转移到 childActivity? 最佳答案 不确定它是否是最好的设计,但我在这里所做的并且它在我的简单应用程序上工作是将蓝
我是一名优秀的程序员,十分优秀!