onDataChanged не вызывается на износ Android
Я хочу отправить только простые строки со смартфона на Android Wear. Я смотрел в этом вопросе раньше: не удалось отправить данные на износ Android (эмулятор) и попытался сделать то же самое, но onDataChanged только при удалении дырки приложения на моем телефоне, но не при вызове push StringstoWear. Надеюсь на помощь...
Вот мой код на телефоне: пакет de.gruppe8.culturehelper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.Wearable;
import java.util.Date;
public class Phone extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
private static final String TAG = "PHONE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phone);
//Erstelle Google API Client zur Kommunikation mit Wear
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
//Testbutton zum Daten versenden
Button button = (Button) findViewById(R.id.Testbutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pushStringsToWear();
}
});
}
//Sendet Daten an Wear, wenn aufgerufen !!!!--->Auchtung wird noch nicht richtig empfangen
private void pushStringsToWear() {
Inhalt.TEXT ="ätzend";
//Requester
PutDataMapRequest Sender = PutDataMapRequest.create(Inhalt.NOTIFICATION_PATH);
//Diese Daten werden versendet, unter dem angegeben Pfad (siehe hier drüber)
Sender.getDataMap().putLong("time", System.currentTimeMillis());
Sender.getDataMap().putString("Bilddateiname", Inhalt.IMAGE);
Sender.getDataMap().putString("Text", Inhalt.TEXT);
Wearable.DataApi.putDataItem(mGoogleApiClient, Sender.asPutDataRequest());
//bestätigt das aufrufen der Funktion
TextView Information = (TextView) findViewById(R.id.Information);
String a= "dgdfjkjhg";
Information.setText(a);
}
//zu versendende Daten--->müssen anhand der Datenbank vor dem Absenden verändert werden
public static class Inhalt {
public static String NOTIFICATION_PATH = "/Warning";
public static Long Zeit = System.currentTimeMillis();
public static String IMAGE = "Image";
public static String TEXT = "content";
}
//Pflichtfunktionen onStart,onStop,onConnected,onConnectionFailed/Suspended, onStop
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
Log.d(TAG, "connected to APICLIENT" + new Date().getTime());
}
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "Connected");
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "Connection Suspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG, "Connection Failed");
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
Log.d(TAG, "disconected from APICLIENT" + new Date().getTime());
}
}
И это мой код на износ:
package de.gruppe8.culturehelper;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Wearable;
import java.util.Objects;
public class Watch extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, DataApi.DataListener, MessageApi.MessageListener {
private GoogleApiClient mGoogleApiClient;
private static final String TAG = "WEAR";
private TextView mTextView;
GoogleApiAvailability a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_watch);
//Starten des Google API Clients zur kommunikation mit Smartphone
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
//Wenn Daten vom Handy abgesendet werden, werden sie hier empfangen ---> Derzeit nur bei Deinstallation der App
public void onDataChanged(DataEventBuffer dataEvent) {
for (DataEvent event : dataEvent) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/Warning")) {
final DataMapItem dMI = DataMapItem.fromDataItem(event.getDataItem());
//Empfangbare Daten, zur weiterverarbeitung If states einbauen und Folge festlegen(externe Funktionen?)
String Text = dMI.getDataMap().getString("Text");
String Bild = dMI.getDataMap().getString("Bilddateiname");
Long Zeit = dMI.getDataMap().getLong("time");
//Teststring
TextView Testergebnis = (TextView) findViewById(R.id.text);
String s= Objects.toString(Zeit, null);
Testergebnis.setText(s);
}
}
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
//Startet die Listener
@Override
public void onConnected(Bundle bundle) {
Wearable.DataApi.addListener(mGoogleApiClient, this);
Wearable.MessageApi.addListener(mGoogleApiClient, this);
}
@Override
protected void onStop() {
if (null != mGoogleApiClient && mGoogleApiClient.isConnected()) {
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
super.onStop();
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "Connection Suspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG, "Connection Failed");
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
}
}
носить манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.gruppe8.culturehelper">
<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">
<activity
android:name=".Watch"
android:label="@string/app_name"
android:exported="true"
android:allowEmbedded="true"
android:taskAffinity=""
android:theme="@android:style/Theme.DeviceDefault.Light">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- ATTENTION: This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. -->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
</application>
Манифест телефона:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- ATTENTION: This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. -->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
1 ответ
Начиная с Play Services 8.3, синхронизация данных с использованием DataApi упаковывается и выполняется с определенной частотой, что означает, что синхронизация ваших данных может быть отложена до 30 минут. Если вам нужна немедленная синхронизация, вам нужно убедиться, что ваш запрос установлен как срочный. Как примечание, это хорошая практика для проверки подключения ApiClient, когда вы используете его, например, в вашем pushStringsToWear