Android Wear アプリを市場に出してから約 10 か月が経ちましたが、機能しなくなりました (いつ機能しなくなったのかはわかりません)。
モバイル アプリで記録した統計情報を使用して、ウェアラブル アプリケーションを更新しようとしています。私が言うように、これは以前は問題なく確実に機能していました。これにタイムスタンプも追加したので、onDataChanged
データが変更された場合にのみ呼び出されるため、一意でした。これはそれを保証します。
私の問題
PutDataMapRequest
私は電話して罰金を提出することができWearable.DataApi.putDataItem
、私のResultCallback
.
はonDataChanged
通常最後に呼び出されますが、遅延は以前よりも長すぎます。さらに、起動するアプリがあり、そこにバックログがあるActivity
ため、正しく設定されていることがわかります。DataItems
私はonDataChanged
これActivity
でも同じ問題を抱えています。
私がやった事
- versionCode と versionName が両方のモジュール
build.gradle
ファイルで一致していることを確認しました。 - 両方の
build.gradle
ファイルがサポート ライブラリと Google サービス ライブラリの同じバージョンを使用していることを確認しました。 - 両方のクラスが接続していることを確認
GoogleApiClient
- サービスで強制的に呼び出すために、データが毎回異なることを確認して
onDataChanged
ください。これは必要ありませんが、機能させるためだけです。
マイコード
モバイル
if (mGoogleApiClient.isConnected()) {
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
putDataMapRequest.getDataMap().putString("content", content);
putDataMapRequest.getDataMap().putString("title", title);
putDataMapRequest.getDataMap().putLong("timestamp", DateTime.now().getMillis());
PutDataRequest request = putDataMapRequest.asPutDataRequest();
Wearable.DataApi.putDataItem(mGoogleApiClient, request)
.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
if (!dataItemResult.getStatus().isSuccess()) {
Log.e("WearDevice", "buildWatchOnlyNotification(): Failed to set the data, "
+ "status: " + dataItemResult.getStatus().getStatusCode());
} else {
Log.d(LOG_TAG, "Notificaiton result callback returned successfully: "+dataItemResult.getDataItem().toString());//: "+node.getDisplayName());
}
}
});
}
切る
拡張するサービスがありますWearableListenerService
。これはマニフェストでそのように宣言されています。
<service android:name=".NotificationUpdateService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
</intent-filter>
</service>
これが私のサービスです。
@Override
public void onCreate() {
super.onCreate();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
if (MainActivity.DEBUGGING)
Log.d(LOG_TAG, "onDataChanged");
for (DataEvent dataEvent : dataEvents) {
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
String content = dataMap.getString("content");
String title = dataMap.getString("title");
if ("/mydatapath".equals(dataEvent.getDataItem().getUri().getPath())) {
buildWearableOnlyNotification(title, content, false);
}
}
}
}
メソッドはbuildWearableOnlyNotification
フォアグラウンド通知を作成して開始し、実際に呼び出されると正常に機能します。