2

J'ai été googler pendant 5 jours d'affilée et ne trouve toujours pas la solution à mon problème, alors je publie désespérément ma question dans l'espoir que quelqu'un puisse m'aider.Android DataItem Pas de synchronisation avec l'émulateur portable

J'ai essayé d'envoyer un DataItem à un émulateur portable via l'WearableAPI. Je vais décrire toutes les étapes que je suis et spécifier le code que j'ai écrit.

Merci d'avance!

  1. Je démarre l'émulateur.
  2. J'ouvre l'application Android Wear sur mon propre appareil et j'associe l'émulateur.
  3. Je redirige l'ADB via tbp: 5601 tcp: 5601 dans le dossier platform-tools.
  4. Je commence l'application mobile sur mon téléphone Android par studio
  5. Je commence l'application d'usure sur l'émulateur Android par studio
  6. J'attends quelque chose se produise, mais rien ne se passe.

code mobile:

@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 Mobile:

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

gradle Mobile:

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:[email protected]' 
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' 

}


code Wearable:

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

Wearable Manifest:

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

(Désolé pour le long post/code, mais je ne voulais pas manquer quoi que ce soit)

Ce que je sais déjà/debugged:

  1. La fonction onDataChanged() n'est jamais appelée
  2. La fonction onConnected() dans le périphérique portable n'est jamais appelée
  3. Si je démarre l'application sur le portable, il est indiqué: " nouvelle version des services Google Play est nécessaire. Il se mettra à jour sous peu » Après ce message, l'application commence
  4. [EDIT]:... Réglage de la BAD debuggin permis ne contribue pas

J'espère que quelqu'un peut me aider avec ces informations que je présente mes excuses. pour la quantité de code.

Merci à l'avance

+0

+1 pour le format de votre question de démarrage :) est-ce seulement avec l'émulateur l'avez-vous testé dans un environnement réel? –

+0

Merci pour votre réponse! Je viens de le tester et en effet cela fonctionne sur mon appareil portable réel (j'aurais dû y penser). Alors, qu'est-ce que je fais de mal avec l'émulateur? Merci encore! –

Répondre

0

J'ai eu la même question hier exacte et ne pouvait pas savoir pourquoi.

Aujourd'hui, j'ai tout recommencé et j'ai trouvé le lien this qui m'a montré comment connecter l'émulateur portable au téléphone. J'ai tout fait avant de trouver ce lien, sauf pour 1 chose: activer le débogage ADB sur le portable. En fin de compte, cela causait mes problèmes de connectivité. Au point: Activez le débogage ADB sur l'émulateur pour le faire fonctionner. Pour cela, allez dans options -> find "about" -> cliquez quelques fois sur "Build number" -> retournez aux options -> options du développeur -> activer le débogage ADB.

Espérons que cela aide!

+0

Merci pour votre réponse. Malheureusement, je l'ai déjà fait (j'aurais dû le poster dans ma question) et cela ne marchera pas non plus. J'ai fait une réinitialisation complète sur le portable et activé les options de débogage, mais sans succès. –

+0

La seule chose que je peux penser maintenant est de déplacer cette ligne de méta-données de code vers votre activité ... Pourriez-vous essayer cela pour moi? De plus, les notifications sont-elles partagées? les notifications apparaissent-elles à l'émulateur? si oui, le problème n'est pas causé par la connexion mais autre chose ... vous pouvez également essayer si l'exemple DataLayer fonctionne ... –

+0

J'ai déplacé la balise à l'intérieur du de l'appareil portable et portable mais toujours pas de chance. En outre, l'émulateur fonctionne exactement (c'est-à-dire reçoit des notifications) en tant que mon véritable portable, avec la seule différence que ma propre application ne reçoit pas le DataItem. Je vais regarder dans l'exemple DataLayer. Merci pour votre réponse! –