development - Incapaz de empujar datos al desgaste de Android(Emulador)
development android (4)
Descubrí otra causa para agregar a la lista de verificación. Las aplicaciones portátiles y móviles deben construirse con las mismas versiones de las bibliotecas de desgaste. Comprueba las versiones en tus dependencias de gradle.
compile ''com.google.android.support:wearable:1.3.0''
compile ''com.google.android.gms:play-services-wearable:8.1.0''
(No tengo suficientes puntos de reputación para comentar)
He estado tratando de enviar datos al emulador de desgaste de Android. Pero todo en vano. Mi oyente en el emulador no está recibiendo ninguna llamada en absoluto. Si alguien más ha intentado trabajar sobre el desgaste y empujar los datos para usar, por favor AYUDA.
Así es como se ve el código de mi receptor
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcode_generation);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
ivQrImage = (ImageView) stub.findViewById(R.id.ivQRImage);
}
});
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/image")) {
final DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
final Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
final Bitmap bitmap = loadBitmapFromAsset(profileAsset);
Log.d(TAG, ""+bitmap);
if (null != bitmap) {
ivQrImage.setImageBitmap(bitmap);
bitmap.recycle();
}
}
}
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
if (null != mGoogleApiClient && mGoogleApiClient.isConnected()) {
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
super.onStop();
}
public Bitmap loadBitmapFromAsset(Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset must be non-null");
}
ConnectionResult result =
mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
return null;
}
// convert asset into a file descriptor and block until it''s ready
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect();
if (assetInputStream == null) {
Log.w(TAG, "Requested an unknown Asset.");
return null;
}
// decode the stream into a bitmap
return BitmapFactory.decodeStream(assetInputStream);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG,"Connection Failed");
}
@Override
public void onConnected(Bundle bundle) {
Wearable.DataApi.addListener(mGoogleApiClient, this);
Wearable.MessageApi.addListener(mGoogleApiClient, this);
}
Así es como estoy empujando.
private void pushImageToWear() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.qr_code);
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("profileImage", asset);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
}
También tengo lo siguiente en mi manifiesto para la actividad de Android Wear
<activity
android:name=".QRCodeReceptionActivity"
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>
PD: No hay nada extraordinario que esté haciendo. Solo seguí el tutorial dado en el sitio del desarrollador.
La aplicación de su dispositivoId y la aplicación que deben usar deben coincidir, como @Bobby declaró en su respuesta. No necesitaba tener la aplicación portátil como una dependencia.
Lo siento, uso Respuesta, pero necesito una reputación de 50 para comentar :(
Tuve el mismo problema aquí https: //.com / ... , pero ahora lo arreglé.
Ok, comparto con ustedes todos los problemas que encontré:
Primero, en los archivos AndroidManifest.xml en el dispositivo móvil, agregue lo siguiente:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
En segundo lugar, lo que me confundió un poco fue que solo se llama a onDataChanged () cuando el DataItem del interior realmente se "cambia". Así que tal vez funcione por primera vez, pero luego no pasará nada.
Cambié el código en el móvil, por lo que cada vez que intento enviar datos tiene una marca de tiempo diferente:
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest request = PutDataMapRequest.create("/image");
DataMap map = request.getDataMap();
map.putLong("time", new Date().getTime()); // MOST IMPORTANT LINE FOR TIMESTAMP
map.putAsset("profileImage", asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request.asPutDataRequest());
Me enteré en este video IO
El resto del código se parece al tuyo. Espero que esta ayuda.
También tuve este problema, y me llevó horas resolverlo. ¿Mi recomendación? Cree un nuevo proyecto con Android Studio y seleccione Android Wear y Phone + Tablet como los tipos de proyecto. Esto le dará el esqueleto de un proyecto en funcionamiento, luego es solo una cuestión de trasladar a su proyecto existente las diferencias con el esqueleto generado automáticamente.
Para mí, el problema terminó siendo una combinación de lo siguiente:
- En su entrada de construcción
defaultConfig
eldefaultConfig
aplicación debe ser el mismo tanto para su aplicación portátil como para la móvil, por ejemplo:defaultConfig { applicationId "com.rukkus.app" ... }
- La aplicación móvil debe agregar el wearApp como una dependencia, así:
dependencies { ... wearApp project('':wear'') }
Además (y lo cierto es que no estoy seguro de que esto sea necesario), en los ejemplos, Google Dev''s se conecta a la API de Google en el onCreate del WearableListenerService
(en lugar de en el método onDataChanged
, como lo ilustra la documentación). Así que mi onCreate se ve así en el servicio de servicio WearableListenerService
:
@Override
public void onCreate() {
super.onCreate();
// create Google Client
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this.ctx)
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult result){
}
})
.addApi(Wearable.API).build();
//connect the client
googleApiClient.connect();
Log.i(TAG, "**creating google API client now**");
}
Esto me tomó más tiempo del que quisiera admitir para trabajar, así que espero que esto ayude a algún futuro Googler.