0

我正在尝试将 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,然后检查了哪些设备已断开连接。如果是“我的”,我会在蓝牙收件箱中搜索文件。

我从设备制造商那里收到一条消息,说它还不能工作,但他们正在开发新的固件。这就是为什么我没有在这里活跃,也没有为更好的解决方案工作。

4

1 回答 1

0

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

于 2010-09-02T10:05:22.537 回答