Android 将资产从手表转移到手持设备

Android 将资产从手表转移到手持设备,android,google-play-services,wear-os,android-wear-data-api,Android,Google Play Services,Wear Os,Android Wear Data Api,我试图复制这个函数。 手表上的发射器部件很好。在手持设备的WearableListenerService的onDataChanged功能中,每次DataMapItem DataMapItem=DataMapItem.fromDataItem(event.getDataItem())时都会发生异常被调用 例外情况如下: 04-30 13:02:21.003 16588-16588/com.xxx.hbips I/dalvikvm﹕ Could not find method androi

我试图复制这个函数。 手表上的发射器部件很好。在手持设备的WearableListenerService的
onDataChanged
功能中,每次
DataMapItem DataMapItem=DataMapItem.fromDataItem(event.getDataItem())时都会发生异常被调用

例外情况如下:

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)
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);
        }
    }
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");
            }
        }
    }
接收器代码如下:

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)
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);
        }
    }
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");
            }
        }
    }
public void onDataChanged(DataEventBuffer dataEvents){
最终列表事件=Freezabluetils
.可冻结(数据事件);
dataEvents.close();
如果(!mgoogleapClient.isConnected()){
ConnectionResult ConnectionResult=mgoogleapClient
.阻塞连接(30,时间单位为秒);
如果(!connectionResult.isSuccess()){
Log.e(标记“WEAR::Service未能连接到GoogleAppClient”);
返回;
}
}否则{
Log.e(标签“WEAR::连接到GoogleAppClient的服务”);
}
用于(数据事件:事件){
如果(event.getType()==DataEvent.TYPE_已更改&&
event.getDataItem().getUri().getPath().equals(“/audio”)){
DataMapItem DataMapItem=DataMapItem.fromDataItem(event.getDataItem());
Asset audioAsset=dataMapItem.getDataMap().getAsset(“音频”);
DataExchange.setBuffer(loadAudioFromAsset(audioAsset));
Log.w(标记“接收”);
}
}
}

有什么想法吗?

问题似乎在这里:

final List<DataEvent> events = FreezableUtils
    .freezeIterable(dataEvents);
dataEvents.close();
final List events=FreezableUtils
.可冻结(数据事件);
dataEvents.close();
这是什么意思?
请显示此代码以获取详细答案。

我通过替换此代码解决了此问题

    PutDataRequest putDataRequest = PutDataRequest.create("/image");
    putDataRequest.putAsset("debugFile", asset);
    Wearable.DataApi.putDataItem(client, putDataRequest);
用这个

    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 
        }
    } );
putDataMapRequestDataMap=PutDataMapRequest.create(“/image”);
dataMap.getDataMap().putAsset(“调试文件”,资产);
PutDataRequest=dataMap.asPutDataRequest();
Pendingreult Pendingreult=可穿戴的.DataApi.putDataItem(客户端,请求);
Pendingreult.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(DataItemResult DataItemResult){
//某物
}
} );
现在对我有用了