Android Wear将数据发送到Android手机,但手机似乎永远不会收到它

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

在Android手机(Android 4.4.4版本)上,我使用了一个侦听器服务,该服务通过AndroidManifest.xml绑定,并通过手机上的主要活动启动.从日志中,我可以确认在手机上成功创建了服务,但是没有收到任何数据(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按钮从音频生成输入(代码显示),我知道这是因为日志记录正常工作.然后我尝试将这些数据从磨损设备发送到手机.在日志中,我看到“结果可用.状态:状态{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,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());
                    }
                });
            }
        }
    }
}

解决方法

为了让WearableListenerService触发’onDataChanged’事件,主应用程序和可穿戴应用程序中的applicationId必须匹配(build.gradle文件).

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

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...