Reputation: 11
I'm trying to replicate this function https://developer.android.com/training/wearables/data-layer/assets.html.
The transmitter part in watch is fine. In the onDataChanged
function of WearableListenerService
in handheld, an exception occurred every time DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
is called.
The exception is as follows:
04-30 13:02:21.003 16588-16588/com.xxx.hbips I/dalvikvm﹕ Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zzh
04-30 13:02:21.003 16588-16588/com.xxx.hbips W/dalvikvm﹕ VFY: unable to resolve virtual method 464: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
04-30 13:02:21.003 16588-16588/com.xxx.hbips D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000b
04-30 13:02:21.053 16588-16790/com.xxx.hbips E/DataLayerSample﹕ WEAR :: Service connected to GoogleApiClient.
04-30 13:02:21.053 16588-16790/com.xxx.hbips W/dalvikvm﹕ threadid=19: thread exiting with uncaught exception (group=0x417bfd58)
04-30 13:02:21.053 16588-16790/com.xxx.hbips E/AndroidRuntime﹕ FATAL EXCEPTION: WearableListenerService
Process: com.xxx.hbips, PID: 16588
java.lang.IllegalStateException: Cannot find DataItemAsset referenced in data at 0 for DataItemEntity [@4287a7e0,dataSz=0, numAssets=1, uri=wear://df70fc47-0580-4750-b6ea-6e47439ed1ed/audio]
at com.google.android.gms.wearable.DataMapItem.zza(Unknown Source)
at com.google.android.gms.wearable.DataMapItem.<init>(Unknown Source)
at com.google.android.gms.wearable.DataMapItem.fromDataItem(Unknown Source)
at com.xxx.hbips.DataLayerListenerService.onDataChanged(DataLayerListenerService.java:58)
at com.google.android.gms.wearable.WearableListenerService$zza$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
Transmitter code is as follows:
class IpsTimerTask extends TimerTask {
public void run() {
sem.acquireUninterruptibly();
byte[] buffer = new byte[60000];
audioRecord.startRecording();
audioRecord.read(buffer, 0, 60000);
audioRecord.stop();
sem.release();
Asset asset = Asset.createFromBytes(buffer);
PutDataRequest request = PutDataRequest.create("/audio");
request.putAsset("Audio", asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
Log.d(TAG, "transmitted"+buffer.length);
}
}
Receiver code is as follows:
public void onDataChanged(DataEventBuffer dataEvents) {
final List<DataEvent> events = FreezableUtils
.freezeIterable(dataEvents);
dataEvents.close();
if (!mGoogleApiClient.isConnected()) {
ConnectionResult connectionResult = mGoogleApiClient
.blockingConnect(30, TimeUnit.SECONDS);
if (!connectionResult.isSuccess()) {
Log.e(TAG,"WEAR :: Service failed to connect to GoogleApiClient.");
return;
}
} else {
Log.e(TAG,"WEAR :: Service connected to GoogleApiClient.");
}
for (DataEvent event : events) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/audio")) {
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
Asset audioAsset = dataMapItem.getDataMap().getAsset("Audio");
DataExchange.setBuffer(loadAudioFromAsset(audioAsset));
Log.w(TAG, "receive");
}
}
}
Any ideas, please?
Upvotes: 1
Views: 619
Reputation: 17723
I solved it by replacing this
PutDataRequest putDataRequest = PutDataRequest.create("/image");
putDataRequest.putAsset("debugFile", asset);
Wearable.DataApi.putDataItem(client, putDataRequest);
with this
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("debugFile", asset);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataItemResult> pendingResult = Wearable.DataApi.putDataItem(client, request);
pendingResult.setResultCallback(new ResultCallback<DataItemResult> () {
@Override
public void onResult(DataItemResult dataItemResult) {
// something
}
} );
now it works for me
Upvotes: 0
Reputation: 971
It seems the issue could be here:
final List<DataEvent> events = FreezableUtils
.freezeIterable(dataEvents);
dataEvents.close();
What does it mean? Please show this code for detailed answer.
Upvotes: 1