Android RFComm与OBEX推送无法正常工作

时间:2010-09-02 09:56:27

标签: android bluetooth obex

我正在尝试将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连接到手机。

这是我无法在Android手机上工作的技术,无论是HTC Hero还是HTC Desire,都是2.1-update1版本。无论我如何尝试,手机只能连接到手机,而不是根据需要连接到应用程序。

我创建了一个类似于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,然后检查了哪些设备已断开连接。如果它是“我的”,我搜索了蓝牙收件箱中的文件。

我收到设备制造商发来的消息称它无法正常工作,但他们正在开发新固件。这就是为什么我没有在这里活跃,也没有为更好的解决方案而努力。

1 个答案:

答案 0 :(得分:0)

可以肯定的是,您是否在Android清单中设置了正确的权限?