Android DataItem не синхронизируется с носимым эмулятором

Я гуглю 5 дней подряд и до сих пор не могу найти решение своей проблемы, поэтому я отчаянно публикую свой вопрос в надежде, что кто-нибудь сможет мне помочь.

Я пытался отправить DataItem в носимый эмулятор через WearableAPI. Я опишу все шаги, которые я выполняю, и укажу код, который я написал.

Заранее спасибо!

  1. Запускаю эмулятор.
  2. Я открываю приложение Android Wear на своем устройстве и подключаю эмулятор.
  3. Пробиваю ADB через adb -d forward tcp:5601 tcp:5601 в папку platform-tools.
  4. Я запускаю мобильное приложение на своем телефоне через Android Studio
  5. Я запускаю приложение Wear на эмуляторе через Android Studio.
  6. Я жду, что что-то произойдет, но ничего не происходит.

Мобильный код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    initComponents();
}


private void initComponents() {
    ...
    initWearLink();
}
@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}


// ---------------------------- WEARABLE PART ----------------------------

private void initWearLink() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            // Request access only to the Wearable API
            .addApi(Wearable.API)
            .build();
    increaseCounter();
}


private static final String COUNT_KEY = "efficiencyaide.dev.pv.studea.count";

private GoogleApiClient mGoogleApiClient;
private int count = 0;


// Create a data map and put data in it
private void increaseCounter() {
    PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
    putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
    PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
    PendingResult<DataApi.DataItemResult> pendingResult =
            Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq.setUrgent());
}


@Override
public void onConnected(@Nullable Bundle bundle) {

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
    public void onDataChanged(DataEventBuffer dataEventBuffer) {

}

Мобильный манифест:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="efficiencyaide.dev.pv.studea">
<meta-data 
    android:name="com.google.android.gms.version" 
    android:value="@integer/google_play_services_version" />
<uses-permission android:name="android.permission.INTERNET" />
<application
    tools:replace="android:icon"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">>


    <activity
        android:name=".newapp.activities.StartSplashScreen"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:theme="@style/FullscreenTheme">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>

</application>

</manifest>

Мобильный градиент:

apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
defaultConfig {
    applicationId "efficiencyaide.dev.pv.studea"
    minSdkVersion 22
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

repositories {
maven {
    url "https://jitpack.io"
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
wearApp project(':wear')

compile 'com.android.support:appcompat-v7:24.2.1'

compile 'com.google.android.gms:play-services:10.0.1'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.daimajia.swipelayout:library:1.2.0@aar'
compile 'joda-time:joda-time:2.9.6'
compile 'com.github.clans:fab:1.6.4'
compile 'com.github.jivimberg:autoresizetextview:0.0.2'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.google.android.gms:play-services-ads:10.0.1'
testCompile 'junit:junit:4.12'

}


Носимый код:

 private void initWear() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .enableAutoManage(this,this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
}


@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

@Override
protected void onResume() {
    super.onResume();
    mGoogleApiClient.connect();
}

@Override
public void onConnected(Bundle bundle) {
    Log.i("Test", "Connected");
    Wearable.DataApi.addListener(mGoogleApiClient, this);
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
protected void onPause() {
    super.onPause();
    Wearable.DataApi.removeListener(mGoogleApiClient, this);
    mGoogleApiClient.disconnect();
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // DataItem changed
            DataItem item = event.getDataItem();
            if (item.getUri().getPath().compareTo("/count") == 0) {
                DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                updateCount(dataMap.getInt(COUNT_KEY));
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

Носимый манифест:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="efficiencyaide.dev.pv.studea">

<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=".TaskWorkWatchFace"
        android:label="@string/app_name">
    </activity>
    <activity android:name=".TaskSuggestionWatchFace"
        android:label="@string/app_name"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </activity>
</application>

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

</manifest>

(Извините за длинный пост/код, но я не хотел ничего пропустить)

Что я уже знаю/отлаживал:

  1. Функция onDataChanged() никогда не вызывается
  2. Функция onConnected() в носимом устройстве никогда не вызывается.
  3. Если я запускаю приложение на носимом устройстве, оно говорит: «требуется новая версия сервисов Google Play. Оно скоро обновится». После этого сообщения приложение запускается.
  4. [EDIT]: включение отладки ADB не помогает.

Я надеюсь, что кто-то может помочь мне с этой информацией. Прошу прощения за количество кода.

заранее спасибо


person Pieter Verlinden    schedule 21.12.2016    source источник
comment
+1 за формат вашего стартового вопроса :) это только с эмулятором, вы тестировали его в реальной среде?   -  person Charuක    schedule 21.12.2016
comment
Спасибо за ваш ответ! Я только что протестировал его, и он действительно работает на моем реальном носимом устройстве (я должен был подумать об этом). Так что я делаю не так с эмулятором? Еще раз спасибо!   -  person Pieter Verlinden    schedule 21.12.2016


Ответы (1)


У меня была точно такая же проблема вчера, и я не мог понять, почему.

Сегодня я снова все запустил и нашел эта ссылка, которая показала мне, как подключить эмулятор носимых устройств к телефону. Все делал до того, как нашел эту ссылку, кроме 1 вещи: включить отладку по ADB на носимом.

В конце концов, это вызывало у меня проблемы с подключением.

В точку: включите отладку ADB на эмуляторе, чтобы он заработал.

Для этого перейдите к параметрам --> найдите "о" --> нажмите несколько раз на "Номер сборки" --> вернитесь к параметрам --> параметры разработчика --> включите отладку ADB.

Надеюсь это поможет!

person Bryan Baan    schedule 22.12.2016
comment
Спасибо за ваш ответ. К сожалению, я уже сделал это (я должен был опубликовать это в своем вопросе), и это тоже не сработает. Я сделал полный сброс на носимом устройстве и включил параметры отладки, но безуспешно. - person Pieter Verlinden; 22.12.2016
comment
Единственное, о чем я могу думать сейчас, это перенести эту строку кода метаданных в вашу деятельность... Не могли бы вы попробовать это для меня? Кроме того, являются ли уведомления общими? всплывают ли уведомления в эмуляторе? если это так, проблема не в соединении, а в чем-то другом... вы также можете попробовать, если образец DataLayer работает... - person Bryan Baan; 22.12.2016
comment
Я переместил тег «мета-данные» в «активность» носимых и мобильных устройств, но все равно не повезло. Кроме того, эмулятор работает точно (т.е. получает уведомления) как мое настоящее носимое устройство, с той лишь разницей, что мое собственное приложение не получает DataItem. Я рассмотрю образец DataLayer. Благодарю за ваш ответ! - person Pieter Verlinden; 22.12.2016