6

简短摘要:我正在尝试使用 PutDataRequest 和 GoogleApiClient 将数据从 Android Wear 手表发送到 Android 手机。日志似乎显示数据已成功发送,但 onDataChanged 永远不会触发。我正在使用 Android Studio 1.0.2。我没有使用任何模拟器,而是使用我拥有的 Android Wear 手表——我已通过 Android Wear 设备和手机上的 Android Wear 应用程序配对并启用调试。在手机和 Wear 的 AndroidManifest.xml 中,我都包含了 com.google.android.gms.version。

在Android Phone(Android 4.4.4 版本)上,我使用了一个监听服务,它通过AndroidManifest.xml 绑定,并通过手机上的主Activity 启动。从日志中,我可以确认服务已在手机上成功创建,但从未收到任何数据(准确地说,onDataChanged 永远不会触发)。

    <!-- Phone manifest, registers the listener -->
    <service android:name=".DataLayerListenerService" >
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>

这是在手机上运行的侦听器服务:

public class DataLayerListenerService extends WearableListenerService {
    private static final String TAG = DataLayerListenerService.class.getName();
    private GoogleApiClient mGoogleApiClient;

    private static final String WEARABLE_DATA_PATH = "/audio";

    @Override
    public void onCreate() {
        // I can see this fires properly on the Android mobile phone
        Logger.d(TAG, "onCreate");
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        // This never fires on the Android mobile phone, even though Wear says data was sent successfully
        Logger.d(TAG, "on change");
    }
}

在 Wear 设备上,我有一个创建 Google API 客户端的主要活动。我使用 UI 按钮从音频生成输入(代码未显示),我知道由于日志记录而可以正常工作。然后我尝试将这些数据从穿戴设备发送到手机。在日志中,我看到“结果可用。状态:Status{statusCode=SUCCESS, resolution=null}”(我使用结果回调来跟踪)。

public class MainActivity extends Activity implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {
    private static final String TAG = MainActivity.class.getName();
    private static final int SPEECH_REQUEST_CODE = 1;

    private static final int RECORDER_SAMPLERATE = 44100;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    private TextView mTextView;
    private AudioRecord recorder;
    private int bufferSize = 0;
    private Thread recordingThread = null;
    private GoogleApiClient mGoogleApiClient;
    private volatile boolean isRecording;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "Creating MainActivity");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                mTextView = (TextView) stub.findViewById(R.id.text);
            }
        });

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }

    // Connect to the data layer when the Activity starts
    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    protected void onResume() {
        if (null != mGoogleApiClient && !mGoogleApiClient.isConnected()) {
            mGoogleApiClient.connect();
        }
        super.onResume();
    }

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

    // Placeholders for required connection callbacks
    @Override
    public void onConnectionSuspended(int cause) {
        Log.d(TAG, "Connection suspended");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d(TAG, "Connection failed");
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.d(TAG, "Connected successfully");
    }

    // This is invoked from the UI, via a helper method not shown. Logs show the method is invoked fine.
    private void processRawAudioData() {
        byte data[] = new byte[bufferSize];
        int read = 0;
        while(isRecording) {
            read = recorder.read(data, 0, bufferSize);

            if(AudioRecord.ERROR_INVALID_OPERATION != read) {
                Log.d(TAG, "Successfully read " + data.length + " bytes of audio");
                Log.d(TAG, "Initial ten bytes: " + data[0] + data[1] + data[2] + data[3]
                    + data[4] + data[5] + data[6] + data[7] + data[8] + data[9] + data[10]);

                Asset myAsset = Asset.createFromBytes(data);
                PutDataRequest request = PutDataRequest.create("/audio");
                // might need to change time each time for other end to see change.
                request.putAsset("profileImage", myAsset);
                PendingResult<DataApi.DataItemResult> result =
                    Wearable.DataApi.putDataItem(mGoogleApiClient, request);
                result.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                     // LOGS SHOW STATUS "MainActivity﹕ result available. Status: Status{statusCode=SUCCESS, resolution=null}"   
                     Log.d(TAG, "result available. Status: " + dataItemResult.getStatus());
                    }
                });
            }
        }
    }
}
4

6 回答 6

9

为了WearableListenerService触发'onDataChanged'事件,可穿戴应用applicationId's中的必须匹配 ( )。main appbuild.gradle files

另外,你不能发送静态数据,数据必须改变。这意味着您的 PutDataMapRequest 对象中的数据必须发生变化。

于 2015-04-07T03:10:13.850 回答
1

我遇到了同样的问题,从我在 Google 开发人员那里读到的内容,onDataChanged 永远不会在设备上被触发,因为它不会监听来自可穿戴设备的事件:

例如,您可以拥有一个设置和获取数据项对象的手持应用程序和一个监听这些更新以更新其 UI 的可穿戴应用程序。可穿戴设备从不更新任何数据项,因此手持应用程序不会侦听来自可穿戴设备应用程序的任何数据事件。

https://developer.android.com/training/wearables/data-layer/events.html#Listen

于 2015-08-27T10:50:02.277 回答
0

在发送数据apimap中添加一个键值 map.put("timestamp", System.currentmillions())

于 2015-03-05T05:33:43.370 回答
0

你的 onReceive 被调用了吗?

我遇到了类似的问题,即手持设备发送数据但未调用侦听器服务。这是由于应用程序和磨损 gradle 文件之间的不一致。

我的应用程序有多种口味,我必须将其移除并制作与磨损相同的等级,并且之后一切都可以顺利运行

于 2015-05-08T14:30:45.570 回答
0

您是否在侦听器端应用程序中添加了Wearable.DataApi.addListener() ?

于 2015-08-17T07:04:50.143 回答
0

好的,所以我遇到了同样的问题,我发现在从手机发送事件时我没有连接,所以我从来没有看到它。关键是:onDataChanged() 不会触发,除非 GoogleApiClient 已连接并在发送时进行侦听。它似乎不会在您重新连接后立即向您发送您错过的事件;当您连接()时,您必须手动轮询丢失的数据项。

至少,这对我来说似乎是一个错误:我希望 onDataChanged() 触发客户端断开连接时发送的任何事件。我的假设错了吗?

无论如何,这是我每次连接时手动轮询我错过的事件的方式:

@Override
public void onConnected(Bundle bundle) {

    Wearable.DataApi.addListener(googleApiClient, this);

    syncPresets();
}
@Override
public void onConnectionSuspended(int i) {

    Wearable.DataApi.removeListener(googleApiClient, this);
}

private void syncPresets() {

    // Ok, so the reason is, we're calling Wearable.DataApi.addListener(googleApiClient, this);
    // only when we connect. 
    // thus, we manually poll for the ones we missed...
    Wearable.DataApi.getDataItems(googleApiClient, getDataUri(WEARABLE_DATA_PATH))
            .setResultCallback(new ResultCallback<DataItemBuffer>() {
                @Override
                public void onResult(DataItemBuffer dataItems) {
                    Status status = dataItems.getStatus();

                    if (status.isSuccess()) {

                        for (DataItem dataItem : dataItems) {

                            Log.d(TAG, "Synced image " + dataItem);
                            if (dataItem != null) {



                                // do whatever you do with the items here...
                                onReceivedImage(dataItem);



                            }
                        }
                    } else {
                        Log.d(TAG, "Failed getting image: (" + status.getStatusCode() + ") " + status.getStatusMessage());
                    }

                    dataItems.release();
                }
            });
}
于 2015-09-22T02:01:51.230 回答