Phone 未收到 Wear 消息(通过消息 api)
Phone to Wear message (via message api) not received
我一直在尝试通过消息 API 从我的 phone 向我的 androidWear 发送消息。到目前为止它没有用,我 运行 不知道为什么。
我有一个关于 phone 发送消息的简单应用程序,这里是代码:
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) {
}
}
当我点击发送按钮时,它发送消息,当我调试它时我可以看到它找到我的磨损(节点)并发送消息(回调returns成功)。
但是磨损什么也没收到:
Activity代码:
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>
我试过使用 path="/message" 也没有用。
知道如何让它发挥作用
更新:
在看到使用消息 API 的成功响应并不意味着消息实际到达磨损后,我改变了一切以使用 DataApi。 (我相应地更改了上面的代码)。
仍然没有磨损....但我尝试了一些东西,我在我的 phone activity 上放了一个 DataApi 侦听器,它看到了变化(如果这有助于找出问题所在) .所以 phone activity 看到 DataCHange 而不是磨损 ...
这让我觉得我实际上没有正确设置我的硬件。
我认为这里存在设计问题。您正在尝试启动一个 Activity 以响应数据层事件,然后在此 activity 中响应此事件。这并不是数据 API 的真正设计用途。
你有几个选择。
- 您已经 Activity 运行 通过
Wearable.DataApi.addListener
、Wearable.MessageApi.addListener
等接收和处理数据层事件
- 您还没有 Activity 运行,您通过自己的 WearableListenerService 接收数据事件或消息,然后开始一个新的 activity从这个服务。只要有有趣的 "wearable" 事件(例如数据、消息或节点更改),系统就会为您启动此服务。您必须记住包含适当的清单条目,以使您的服务唤醒以响应每种类型的事件——请查看我上面链接的文档中的 "Example manifest entry" 部分以获得更多清晰度。
请参阅 WearableListenerService
文档。本质上,您应该根据要处理数据事件还是消息事件来覆盖 onDataChanged(DataEventBuffer)
或 onMessageReceived(MessageEvent)
,然后从您的服务启动 activity(即使用 Intent.FLAG_ACTIVITY_NEW_TASK
)
希望对您有所帮助
发现:两个应用程序(wear 和 phone)必须具有相同的 ApplicationId(packageName)。
感谢您的帮助。
我一直在尝试通过消息 API 从我的 phone 向我的 androidWear 发送消息。到目前为止它没有用,我 运行 不知道为什么。
我有一个关于 phone 发送消息的简单应用程序,这里是代码:
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) {
}
}
当我点击发送按钮时,它发送消息,当我调试它时我可以看到它找到我的磨损(节点)并发送消息(回调returns成功)。
但是磨损什么也没收到: Activity代码:
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>
我试过使用 path="/message" 也没有用。
知道如何让它发挥作用
更新: 在看到使用消息 API 的成功响应并不意味着消息实际到达磨损后,我改变了一切以使用 DataApi。 (我相应地更改了上面的代码)。
仍然没有磨损....但我尝试了一些东西,我在我的 phone activity 上放了一个 DataApi 侦听器,它看到了变化(如果这有助于找出问题所在) .所以 phone activity 看到 DataCHange 而不是磨损 ... 这让我觉得我实际上没有正确设置我的硬件。
我认为这里存在设计问题。您正在尝试启动一个 Activity 以响应数据层事件,然后在此 activity 中响应此事件。这并不是数据 API 的真正设计用途。
你有几个选择。
- 您已经 Activity 运行 通过
Wearable.DataApi.addListener
、Wearable.MessageApi.addListener
等接收和处理数据层事件 - 您还没有 Activity 运行,您通过自己的 WearableListenerService 接收数据事件或消息,然后开始一个新的 activity从这个服务。只要有有趣的 "wearable" 事件(例如数据、消息或节点更改),系统就会为您启动此服务。您必须记住包含适当的清单条目,以使您的服务唤醒以响应每种类型的事件——请查看我上面链接的文档中的 "Example manifest entry" 部分以获得更多清晰度。
请参阅 WearableListenerService
文档。本质上,您应该根据要处理数据事件还是消息事件来覆盖 onDataChanged(DataEventBuffer)
或 onMessageReceived(MessageEvent)
,然后从您的服务启动 activity(即使用 Intent.FLAG_ACTIVITY_NEW_TASK
)
希望对您有所帮助
发现:两个应用程序(wear 和 phone)必须具有相同的 ApplicationId(packageName)。 感谢您的帮助。