Нулевое соединение, износ не получен от DataLayer

Для моего первого проекта с использованием Wear я начал с простого - с помощью DataLayer отправил одну строку из Android в Wear. На самом деле это тест для гораздо большего проекта, где все, что мне нужно сделать, это иметь синхронизированную строку.

При запуске проекта Log всегда показывает, что строка была успешно отправлена, а onConnected всегда показывает NULL. Излишне говорить, что часы подключены. Я предполагаю, что проблема связана с подключением, поскольку это объясняет, почему ничего не происходит / не работает при износе. Для отладки: я использую Moto Z Play, подключенный через USB, и Lg G Watch через bluetooth-отладку. Нет проблем с установкой носить. Однако соединение всегда показывает ноль.

У меня есть служба onDataChanged, которая отображает строку ("Тестирование") через Toast, когда обнаруживает изменение. Такого никогда не бывает. Как указано выше, я предполагаю, что это проблема подключения, но она также может быть вызвана неправильным использованием. Я прошу прощения, я учусь в школе. Я ценю любую помощь или разъяснение.

Активность по телефону:

public class MainActivity extends AppCompatActivity  implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    //Global variables.
    private static final int importFileCode = 1;

    //Used for Wear DataLayer
    private static final String TAG = "MainActivity";
    private GoogleApiClient mGoogleApiClient;
    private boolean mResolvingError = false;

    //Method001: Creates the interfaces, calls necessary methods.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        //Used to initiate GoogleAPiClient
        initiateAPI();

        //Used to test the data layer
        sendAccsRequest("Testing");
    }

  @Override
    public void onConnected(Bundle connectionHint) {
        Log.d(TAG, "onConnected: " + connectionHint);
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.d(TAG, "onConnectionSuspended: " + i);
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d(TAG, "onConnectionFailed: " + connectionResult);
    }

    //Initiates the google api client.
    public void initiateAPI () {
        //GoogleApiClient used for connection w/the phone
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        mGoogleApiClient.connect();
    }

    //Used to send the string with info to wear, hopefully.
    public void sendAccsRequest(String allInfo) {
        //Creates a request with a unique key
        PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/allInfo");

        //Inserts the variables using the keys
        putDataMapRequest.getDataMap().putString("strAllInfo", allInfo);

        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("sendAccs", "Failed to send accs");
                        } else {
                            Log.d("sendAccs", "Successfully sent accs");
                        }
                    }
                });
    }

}

Активность ношения:

public class Main extends WearableActivity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        DataApi.DataListener, MessageApi.MessageListener, CapabilityApi.CapabilityListener {

    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);

        //Initiates the google api client
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        // Enables Always-on
        setAmbientEnabled();
        }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.d("onConnected(): ","Successfully connected to Google API client");
        Wearable.DataApi.addListener(mGoogleApiClient, this);
        Wearable.MessageApi.addListener(mGoogleApiClient, this);
        Wearable.CapabilityApi.addListener(
                mGoogleApiClient, this, Uri.parse("wear://"), CapabilityApi.FILTER_REACHABLE);
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.e("onConnectionSuspended()",": Connection to Google API client was suspended");
    }


    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e("onConnectionFailed(): ","Failed to connect, with result: " + connectionResult);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEventBuffer) {
        for (DataEvent event : dataEventBuffer) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                String path = event.getDataItem().getUri().getPath();
                if (dataChangeService.accPath.equals(path)) {
                    DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                    String allInfo = dataMapItem.getDataMap()
                            .getString("strAllInfo");

                    //Prints out received string
                    Log.e("strAllInfo: ", allInfo);

                }
            } else {
                Log.e("Unknown data event type", "Type = " + event.getType());
            }
        }
    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {

    }

    @Override
    public void onCapabilityChanged(CapabilityInfo capabilityInfo) {

    }
}

dataChangeService (Wear):

 public class dataChangeService extends WearableListenerService {

    GoogleApiClient mGoogleApiClient;

    public static final String accPath = "/allInfo";

    @Override
    public void onCreate() {
        super.onCreate();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .build();
        mGoogleApiClient.connect();
    }

        @Override
        public void onDataChanged(DataEventBuffer dataEvents) {
            Log.d("dataChangeService", "Successfully running");
            for (DataEvent dataEvent : dataEvents) {
                if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                    DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                    String path = dataEvent.getDataItem().getUri().getPath();
                    if (path.equals("/allInfo")) {
                        String allInfo = dataMap.getString("strAllInfo");
                        Toast.makeText(dataChangeService.this, "AllInfo: " + allInfo, Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }
    }

Android-манифест на износ:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="noobyguy.testapp">

    <uses-feature android:name="android.hardware.type.watch" />

    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.DeviceDefault">
        <uses-library
            android:name="com.google.android.wearable"
            android:required="true" />
        <!--
               Set to true if your app is Standalone, that is, it does not require the handheld
               app to run.
        -->
        <meta-data
            android:name="com.google.android.wearable.standalone"
            android:value="true" />

        <activity
            android:name=".Main"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <service
            android:name=".dataChangeService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name = "come.google.android.gms.wearable.BIND_LISTENER"/>
            </intent-filter>
        </service>
    </application>

</manifest>

1 ответ

Решение

Спасибо за помощь! Если серьезно, я в конечном итоге выяснил проблему.

  • Изнашивание не на самом деле использовать mGoogleApiClient.connect();

Но в основном проблема была в манифесте, так как BIND_LISTENER (предложенный Udacity) нужно было заменить следующим;

<service
            android:name=".dataChangeService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
                <data android:scheme="wear" android:host="*" android:pathPrefix="/allInfo"/>
            </intent-filter>
Другие вопросы по тегам