简体   繁体   English

Android Wear计步器崩溃的应用程序

[英]Android Wear Step Counter crashing app

I was writing an app to read heart rate and step count using an android wear device. 我正在编写一个应用,以使用Android Wear设备读取心率和步数。 The heart rate sensor works properly but the step count is causing an issue. 心率传感器正常工作,但步数导致问题。 However, on commenting the listener for Step Counter and registering a null in onResume() the app works with heart rate sensor. 但是,在为步骤计数器注释侦听器并在onResume()中注册null时,该应用程序可与心率传感器配合使用。 I'm not getting any log regarding this otherwise I would have posted it here. 我没有关于此的任何日志,否则我会在这里发布它。 Here's the code that I'm using 这是我正在使用的代码

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable;

import java.nio.ByteBuffer;
import java.util.List;

public class MainActivity extends Activity {

    private SensorManager mSensorManager;
    private TextView mTextViewHeart, mTextViewStep;
    private Sensor mHeartRateSensor, mStepCounterSensor;
    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                mTextViewHeart = (TextView) stub.findViewById(R.id.value_heart);
                mTextViewStep = (TextView) stub.findViewById(R.id.value_step);
            }
        });

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
        mStepCounterSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

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

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(heartListener, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(stepListener, mStepCounterSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(heartListener, mHeartRateSensor);
    }

    SensorEventListener heartListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) {
                if (event.values.length > 0) {
                    if (event.values[0] > 0.0f) {
                        mTextViewHeart.setBackgroundResource(android.R.color.holo_green_light);
                        mTextViewHeart.setText(Float.toString(event.values[0]));
                        sendToHandheld(Math.round(event.values[0]), Sensor.TYPE_HEART_RATE);
                    }
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    SensorEventListener stepListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {

            if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
                if (event.values.length > 0) {
                    mTextViewStep.setBackgroundResource(android.R.color.holo_green_light);
                    mTextViewStep.setText(Float.toString(event.values[0]));
                    sendToHandheld(Math.round(event.values[0]), Sensor.TYPE_STEP_COUNTER);
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    private void sendToHandheld(final int val, final int type) {
        final PendingResult<NodeApi.GetConnectedNodesResult> nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient);
        nodes.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
            @Override
            public void onResult(NodeApi.GetConnectedNodesResult result) {
                final List<Node> nodes = result.getNodes();
                if (nodes != null) {
                    for (int i = 0; i < nodes.size(); i++) {
                        final Node node = nodes.get(i);
                        Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "/" + type, ByteBuffer.allocate(4).putInt(val).array());
                        Log.d("Sending", type + ":" + val);
                    }
                }
            }
        });
    }
}

Update 更新

Got the log somehow 以某种方式获得日志

06-15 11:46:02.342    3355-3355/com.hsc.fit E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.hsc.fit, PID: 3355
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setBackgroundResource(int)' on a null object reference
            at com.hsc.fit.MainActivity$3.onSensorChanged(MainActivity.java:92)
            at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:405)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:143)
            at android.os.Looper.loop(Looper.java:122)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Fixed it. 修复。 The WatchViewStub 's setOnLayoutInflatedListener() is called after onResume() , and my Sensor gets registered in onResume() . onResume()之后调用WatchViewStubsetOnLayoutInflatedListener() ,并且我的Sensor已在onResume()注册。 Since my text view is used in the listener of the sensor, and it wasn't assigned a refrence yet, I was getting a NullPointerException . 由于我的文本视图用于传感器的侦听器中,并且尚未分配引用,因此我得到了NullPointerException I moved the sensor registertion inside WatchViewStub 's listener and it works now. 我将传感器注册移到WatchViewStub的侦听器中,现在可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM