我正在尝试将 java 应用程序重新制作为 android 应用程序,但我无法使其工作。该应用程序旨在与使用 OBEX Push 的设备通信。该设备不能接受任何传入连接,并且它没有用户界面,但有一些 LED。
我试图重新制作的 java 代码片段如下:
LocalDevice local;
local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.LIAC);
String sConnectionURL = "btspp://localhost:" + myUUID + ";name=" + obexName;
this.server = (StreamConnectionNotifier) Connector.open(sConnectionURL);
我不是 java 专家,但据我所知,这个片段应该注册一个名为 obexName 的 SPP 服务,并开始通过 UUID myUUID 监听传入连接。这按预期工作。
当设备与运行 java midlet 的手机配对时,它将设置一个位以发送到带有手机上 UUID 的 SPP 或根本不发送。如果在配对过程中找不到任何具有 UUID 的 SPP,它将尝试使用普通的 OBEX 连接到手机。
这是我无法在 2.1-update1 版本的 HTC Hero 和 HTC Desire 的 android 手机上使用的技术。无论我如何尝试,手机都只是连接到手机,而不是根据需要连接到应用程序。
我创建了一个类似于 developer.android.com 上的示例的类:
private class AcceptThread extends Thread
{
private final BluetoothServerSocket __serverSocket;
public AcceptThread()
{
BluetoothServerSocket tmpSocket = null;
trace("Creating AcceptThread");
try
{
trace("Starting to listen");
tmpSocket = _bluetoothAdapter.listenUsingRfcommWithServiceRecord(obexName, myUUID);
trace("Listening successful");
}
catch (Exception e)
{
trace("Listening NOT successful");
// TODO: handle exception
}
__serverSocket = tmpSocket;
trace("AcceptThread created");
}
public void run()
{
BluetoothSocket socket = null;
trace("AcceptThread started");
while(true)
{
try
{
trace("Waiting for socket acceptance");
socket = __serverSocket.accept();
trace( "Socket accepted");
}
catch (Exception e)
{
trace("Error when accepting socket: " + e.getLocalizedMessage());
break;
// TODO: handle exception
}
if (socket != null)
{
synchronized (BTTransfer.this)
{
trace("Socket exists");
try
{
__serverSocket.close();
trace("Socket successfully closed");
}
catch (Exception e) {}
break;
}
}
trace("Socket does not exist");
}
}
public void cancel()
{
try
{
__serverSocket.close();
}
catch (Exception e) {}
trace("AcceptThread cancelled and Socket successfully closed");
}
}
代码注释:
trace 函数是一个同步函数,将文本提供给 Handler 对象,提供 UI 信息。
应用程序除了在连接成功后关闭连接之外,没有做任何事情。
应用程序达到“等待套接字接受”,但此后再也没有跟踪。
我有一个可以将自己伪装成设备的 PC .NET 应用程序,并且通过使用正确的 UUID 它可以完美运行,但是 PC 已经与手机配对,并且没有说它应该通过正常的 OBEX 发送它找不到指定的。
我已经为此工作了几天,但无法提出解决方案。有没有人有任何想法?
提前致谢,
/Trygg
对于第二条消息,我的意思是:
当设备联系电话时,下拉菜单中会显示通知,告知设备正在联系。几秒钟后(取决于文件大小)文件被传输,并且有第二个通知告诉文件被传输。这是第二个“信息”。
由于我监听与设备的断开连接,然后客户通过我的程序已经知道文件已传输,因此第二个通知完全没用。尽管如此,每次设备将文件发送到手机时,它都会出现。
不过,在我们对 Legend 和 Hero 的测试中,我们从未收到过第二次通知。这就是那些手机失败的地方。第一个通知来了,然后什么也没有,几秒钟后设备返回一个错误。
希望这有助于澄清我的意思。
/Trygg
我没有得到这个工作,但做了一种解决方法。我在事件 BluetoothDevice.ACTION_ACL_DISCONNECTED 上注册了一个 BroadcastReceiver,然后检查了哪些设备已断开连接。如果是“我的”,我会在蓝牙收件箱中搜索文件。
我从设备制造商那里收到一条消息,说它还不能工作,但他们正在开发新的固件。这就是为什么我没有在这里活跃,也没有为更好的解决方案工作。