2016-10-10 21 views
0

私の電話からメッセージAPIを介してandroidWearにメッセージを送信しようとしました。これまでのところ動作していないし、なぜ私は考えが不足している。Phone to Wearメッセージ(メッセージAPI経由)が受信されませんでした

私がメッセージを送信する携帯電話で簡単なアプリを持って、ここにコードがある:私は、送信ボタンをクリックすると

public class MainActivity extends Activity 
implements GoogleApiClient.ConnectionCallbacks { 

private static final String START_ACTIVITY = "/start_activity"; 
private static final String WEAR_MESSAGE_PATH = "/message"; 

private GoogleApiClient mApiClient; 

private ArrayAdapter<String> mAdapter; 

private ListView mListView; 
private EditText mEditText; 
private Button mSendButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    init(); 
    initGoogleApiClient(); 
} 

private void initGoogleApiClient() { 
    mApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addApi(Wearable.API) 
      .build(); 

    mApiClient.connect(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mApiClient.disconnect(); 
} 

private void init() { 
    mListView = (ListView) findViewById(R.id.list_view); 
    mEditText = (EditText) findViewById(R.id.input); 
    mSendButton = (Button) findViewById(R.id.btn_send); 

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 
    mListView.setAdapter(mAdapter); 

    mSendButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String text = mEditText.getText().toString(); 
      if (!TextUtils.isEmpty(text)) { 
       mAdapter.add(text); 
       mAdapter.notifyDataSetChanged(); 

       sendMessage(WEAR_MESSAGE_PATH, text); 
      } 
     } 
    }); 
} 

private void sendMessage(final String path, final String text) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      PutDataMapRequest pdmr = PutDataMapRequest.create(WEAR_MESSAGE_PATH); 
      pdmr.getDataMap().putString("message", text); 
      PutDataRequest dataRequest = pdmr.asPutDataRequest(); 
      dataRequest.setUrgent(); 
      PendingResult<DataApi.DataItemResult> result = Wearable.DataApi.putDataItem(mApiClient, dataRequest); 

      result.setResultCallback(new ResultCallback<DataApi.DataItemResult>() { 
       @Override 
       public void onResult(@NonNull DataApi.DataItemResult dataItemResult) { 
        if(dataItemResult.getStatus().isSuccess()){ 
         Log.v("MESSAGE APP", "MESSAGE SENT"); 
        } 
       } 
      }); 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mEditText.setText(""); 
       } 
      }); 
     } 
    }).start(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    sendMessage(START_ACTIVITY, ""); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 
} 

、それはメッセージを送信し、私はそれをデバッグするとき、私はそれを見つけた見ることができます私の摩耗(ノード)とメッセージを送信します(コールバックは成功を返します)。

しかし、摩耗は何も受信しない: アクティビティコード:

public class MainActivity extends Activity 
implements MessageApi.MessageListener, GoogleApiClient.ConnectionCallbacks { 

private static final String WEAR_MESSAGE_PATH = "/message"; 
private GoogleApiClient mApiClient; 
private ArrayAdapter<String> mAdapter; 

private ListView mListView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mListView = (ListView) findViewById(R.id.list); 

    mAdapter = new ArrayAdapter<String>(this, R.layout.list_item); 
    mListView.setAdapter(mAdapter); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    initGoogleApiClient(); 
} 

private void initGoogleApiClient() { 
    mApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Wearable.API) 
      .addConnectionCallbacks(this) 
      .build(); 

    if(mApiClient != null && !(mApiClient.isConnected() || mApiClient.isConnecting())) 
     mApiClient.connect(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(mApiClient != null && !(mApiClient.isConnected() || mApiClient.isConnecting())) 
     mApiClient.connect(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
} 

@Override 
public void onDataChanged(DataEventBuffer dataEventBuffer) { 
    Log.v("WEAR MESSAGE", "Data changed"); 

    for (DataEvent event : dataEventBuffer) { 
     if (event.getType() == DataEvent.TYPE_CHANGED) { 
      // DataItem changed 
      DataItem item = event.getDataItem(); 
      if (item.getUri().getPath().compareTo(WEAR_MESSAGE_PATH) == 0) { 
       DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap(); 
       final String msg = dataMap.getString("message"); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         mAdapter.add(msg); 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 
      } 
     } else if (event.getType() == DataEvent.TYPE_DELETED) { 
      // DataItem deleted 
     } 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    Wearable.DataApi.addListener(mApiClient, this); 
    startService(new Intent(this, WearMessageListenerService.class)); 
} 

@Override 
protected void onStop() { 
    if (mApiClient != null) { 
     Wearable.DataApi.removeListener(mApiClient, this); 
     if (mApiClient.isConnected()) { 
      mApiClient.disconnect(); 
     } 
    } 
    super.onStop(); 
} 

@Override 
protected void onDestroy() { 
    if(mApiClient != null) 
     mApiClient.unregisterConnectionCallbacks(this); 
    super.onDestroy(); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.d("MESSAGE APP", "Connection suspended"); 
} 
} 

とマニフェスト(私は問題はここから来ていると思います):私は=」パスで試してみた

<uses-feature android:name="android.hardware.type.watch" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@android:style/Theme.DeviceDefault"> 
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter> 
      <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> 
      <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> 
      <data android:scheme="wear" android:host="*" 
       android:pathPattern=".*" /> 
     </intent-filter> 

    </activity> 
</application> 

</manifest> 

を/ message "のいずれかであり、動作しません。

その仕事

UPDATE作り方任意のアイデア:メッセージのAPIを使用してsuccesfullの応答メッセージは、実際に私がDataApiを使用するeveryhingを変更し、摩耗に達したという意味ではありませんことを見た後 を。 (私は上記のコードを変更しました)。

私は何かを試しましたが、私は何かを試しました。私は電話アクティビティにDataApiリスナーを置き、それが何か間違っているかどうかを判断するのに役立ちます。電話のアクティビティではデータチェンジが表示されますが、摩耗は表示されません。 これは実際にハードウェアを正しくセットアップしなかったと思います。

+0

1.「pathPattern」を削除2.サービスを自分で起動する必要はなく、ライフサイクルはAndroid Wearによって管理されます –

+0

はいテスト用にこの行を追加しました申し訳ありませんが、コードにはありません。 pathPatternを削除しても問題ありません。 –

答えて

5

はそれを見つけたのに役立ちます

・ホープ(すなわちIntent.FLAG_ACTIVITY_NEW_TASK付き)あなたのサービスからあなたの活動を開始します:両方のアプリ(ウェアと携帯)に同じApplicationId(packageName)が必要です。 ありがとうございます。

0

私はここにデザインの問題があると思います。データレイヤイベントに応答してアクティビティを開始し、このアクティビティ内でこのイベントに応答しようとしています。これは実際にデータAPIがどのように使用されるように設計されているのではありません。

いくつかの選択肢があります。あなたはすでにあなたは既に実行中のアクティビティを持っていない、とあなたはを通して、あなたのデータイベントやメッセージを受信Wearable.DataApi.addListenerWearable.MessageApi.addListenerなど

  • を経由してそれが受信して処理するデータレイヤイベントを実行している活性を有する

    1. WearableListenerServiceとなり、このサービスから新しいアクティビティが開始されます。このサービスは、興味深い着用可能なイベント(データ、メッセージ、ノードの変更など)があるときはいつでも、システムによって開始されます。適切なマニフェストエントリを含めて、イベントの種類ごとにサービスを目覚めさせる必要があります。上記のリンク先のドキュメントの「マニフェストエントリの例」のセクションを参照してください。

    WearableListenerServiceのマニュアルを参照してください。基本的に、あなたはちょうどあなたがデータイベントまたはメッセージイベントを処理するかどうかに応じて、onDataChanged(DataEventBuffer)またはonMessageReceived(MessageEvent)をオーバーライドする必要があり、その後、これは

  • +0

    アクティビティの開始に関するコードはテストでしたが、実際にはこのイベントをリッスンしてFLAG_ACTIVITY_NEW_TASKでアクティビティを開始するWearableListenerServiceがあります。私は送信したメッセージを受信するはずのアクティビティを実行していますが、送信しません。摩耗しているソフトウェアのバージョンで問題になることはありますか? –

    +0

    両方のデバイスで大幅に異なるプレイサービスバージョンを使用している場合、プレイサービスはこの種のIPCを容易にするものであるため、問題が発生する可能性があります。最近の生産用デバイスで作業することはまずありません.gms出力をlogcatで調べると、そのような非互換性に関する警告が表示されるはずです。 WearableListenerService実装と、メッセージをアクティビティに転送する方法を確認すると便利です。 –

    関連する問題