4

アプリのホーム画面の起動時に(ハンドヘルドにある)データベースからデータを取得する摩耗アプリを作成しています。そのため、ホームページのアクティビティが起動すると、 Wearable.MessageApi.sendMessage 関数を使用して Android ウェアからハンドヘルドにメッセージを送信します。ハンドヘルドには、 onMessageReceived 関数でこのメッセージを受信し、データベースを読み取る WearableListenerService があります。データベースを読み取った後、putDatamapRequest をウェアに送信します。

摩耗側では、別の WearableListenerService があります。このサービスでは、onDataChanged() 関数は呼び出されません。時々実行されますが、これまでに2〜3回実行されましたが、それ以外は実行されません。それは非常にランダムです。また、データが Wear 側で受信されたら、Activity でデータを表示するために使用する静的な Arraylist を設定します。ただし、onDataChanged 関数は常に呼び出されるとは限らないため、空の配列リストが返されます。

サービスを宣言した Wear アプリの AndroidManifest ファイルを次に示します。

   <service
        android:name="com.example.deals.DataListenerService"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>

ウェアからハンドヘルドにメッセージを送信するコードは次のとおりです。

mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {

        @Override
        public void onConnected(Bundle bundle) {
                                    Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
                        @Override
                        public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
                            if(!getConnectedNodesResult.getNodes().isEmpty())
                            {
                                node = getConnectedNodesResult.getNodes().get(0);
                                System.out.println("Connected: "+ node.getId());
                                Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), FETCH_ALL_DEALS, null).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
                                    @Override
                                    public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                                        if (!sendMessageResult.getStatus().isSuccess()) {
                                            Log.e("Wear:", "ERROR: failed to send Message: " + sendMessageResult.getStatus());
                                        }
                                        else
                                            System.out.println("success");
                                    }
                                });

                            }
                            else
                                System.out.println("Wear not connected to Phone");
                        }
                    });

        }

            @Override
            public void onConnectionSuspended(int i) {

            }



        })
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult result) {
                Log.v("Phone to wear connection failed", "onConnectionFailed: " + result);
            }
        })
        .addApi(Wearable.API)
        .build();
        mGoogleApiClient.connect();

ハンドヘルドでの onMessageReceive のコードは次のとおりです。

 public void onMessageReceived(MessageEvent messageEvent) {
    System.out.println("Message Received on Phone on launch of wear homepage");
    if(messageEvent.getPath().equals(FETCH_ALL_DEALS)) {
        sendSavedDeals(); //fetch from db and make a datamap object using PutDataRequest
        System.out.println("Message Received on Phone on launch of wear homepage");
    }
    else {
        System.out.println("Unable to recognise action for "+messageEvent.getPath());
    }

}

私の摩耗側では、WearableListenerService がありますが、onDataChanged メソッドが呼び出されることはありません。それを手伝ってくれませんか。

4

3 に答える 3

1

ウェアのWearabaleListenerServiceonDataChangedへのコールバックを取得するには、データを変更または削除する必要があります。変更を加えたい場合は、設定から APP-info を開き、データを消去してから強制停止します。最後にスマートフォンでアプリを起動します。ただし、ウェアラブル リスナー サービスがすでにウェアで開始されていることを確認してください。

于 2015-01-22T10:28:13.030 に答える
0

が呼び出されていない場合onDataChanged():

まず、ハンドヘルド アクティビティが開始時に API に接続していることを確認します。

    @オーバーライド
    保護されたボイド onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

それ以外の場合は、暗黙のうちに失敗します。

それでもうまくいかない場合は、デバッグを容易にするために、このオーバーライド メソッドとこのクラスをハンドヘルド アクティビティに追加して、5 秒ごとにデータを生成します。

    @オーバーライド
    public void onResume() {
        super.onResume();
        mDataItemGeneratorFuture = mGeneratorExecutor.scheduleWithFixedDelay(
            新しい DataItemGenerator()、1、5、TimeUnit.SECONDS
        );
    }

    /** 増分カウントに基づいて DataItem を生成します。*/
    プライベート クラス DataItemGenerator は Runnable を実装します {
        プライベート int カウント = 0;

        @オーバーライド
        public void run() {
        PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(COUNT_PATH);
        putDataMapRequest.getDataMap().putInt(COUNT_KEY, count++);
        PutDataRequest リクエスト = putDataMapRequest.asPutDataRequest();

        Log.d("yourApp", "DataItem の生成: " + request);
        if (!mGoogleApiClient.isConnected()) {
            戻る;
        }
        Wearable.DataApi.putDataItem(mGoogleApiClient, リクエスト)
            .setResultCallback(新しい ResultCallback() {

                @オーバーライド
                public void onResult(DataItemResult dataItemResult) {
                    if (!dataItemResult.getStatus().isSuccess()) {
                        Log.e("YourApp", "エラー: putDataItem に失敗しました。ステータス コード: "
                            + dataItemResult.getStatus().getStatusCode());
                    }
                }
            });
        }
    }

于 2015-01-14T23:25:32.717 に答える