android 磨损时未调用 onDataChanged

onDataChanged isn´t called on android wear

我只想将简单的字符串从智能手机发送到 android wear。我之前看过这个问题:Unable to push data to android wear (Emulator) 并尝试以相同的方式进行操作,但仅当我删除 Phone 上的应用程序时才 onDataChanged,但在调用 push StringstoWear 时不会。 希望得到帮助...

这是我在 Phone 上的代码: 包 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());
}



}

这是我在 Wear 上的代码:

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>

Phone 清单:

<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>

Play Services 8.3, data synchronization using DataApi is batched up and done with a certain frequency which means synchronization of your data can be delayed up to 30 minutes. If you need immediate sync, you need to make sure your request is set as urgent 开始。作为旁注,最好在使用时检查 ApiClient 的连接性,例如在 pushStringsToWear