0

JavaアプリケーションをAndroidアプリケーションに作り直そうとしていますが、動作させることができません。このアプリケーションは、OBEXプッシュを使用するデバイスと通信することを目的としています。デバイスは着信接続を取得できず、ユーザーインターフェイスはありませんが、いくつかの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サービスを登録し、UUIDmyUUIDを介して着信接続のリッスンを開始する必要があります。これは意図したとおりに機能します。

デバイスがJavaミッドレットを実行している電話とペアリングしている場合、電話の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


2番目のメッセージでは、次のことを意味します。

デバイスが電話に接続すると、ドロップダウンメニューにデバイスが接続していることを通知する通知が表示されます。数秒後(ファイルサイズによって異なります)、ファイルが転送され、ファイルが送信されたことを通知する2番目の通知があります。これが2番目の「メッセージ」です。

私はデバイスからの切断をリッスンし、顧客は私のプログラムを通じてファイルが送信されていることをすでに知っているので、この2番目の通知はまったく役に立たない。それでも、デバイスが電話にファイルを送信するたびに表示されます。

ただし、LegendとHeroのテストでは、2回目の通知に到達することはありません。これはそれらの電話が失敗するところです。最初の通知が届き、その後何も表示されず、デバイスは数秒後にエラーを返します。

これが私が何を意味したのかを明確にするのに役立つことを願っています。

/ Trygg


私はこれを機能させませんでしたが、ある種の回避策を作成しました。イベントBluetoothDevice.ACTION_ACL_DISCONNECTEDにBroadcastReceiverを登録し、切断されたデバイスを確認しました。「私のもの」の場合は、Bluetoothの受信トレイでファイルを検索しました。

デバイスの製造元から、まだ動作しないというメッセージが表示されましたが、新しいファームウェアで動作しています。これが、私がここで活動しておらず、より良い解決策に取り組んでいない理由です。

4

1 に答える 1

0

念のため、Android マニフェストで適切なアクセス許可を設定しましたか?

于 2010-09-02T10:05:22.537 に答える