mynamecsl 2018-05-21 04:10 采纳率: 58%
浏览 746
已采纳

如何获取psensor两次距离变化的时间差然后取消倒计时

获取psensor两次距离变化的时间差,不满2秒取消倒计时不起作用
Camera还是起来了,后面的Activity也跳转了
怎么回事
网上说是5.0以前不能CountDownTimer直接cancel,会不起作用。
但我开发环境6.0的,手机8.0的,为什么还是没用。

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

public class SensorFunctionService extends Service {

private SensorManager mSensorManager;
private Sensor mPSensor;
private PowerManager mPowerManager;
private PowerManager.WakeLock mProximityWakeLock;
private CountDownTimer timer;
private long mLastProximityEventTime = 0;
private long milliseconds;

@Override
public void onCreate() {
super.onCreate();
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mProximityWakeLock = mPowerManager.newWakeLock(32,"csl");
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mPSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

if (null == mSensorManager) {
    Log.d("csl", "deveice not support SensorManager");
}
SensorEventListener mSensorEventListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {

        Log.d("csl", "onSensorChanged 。。。。");
        if (event.sensor == null) {
            return;
        }
        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY){


            float distance = event.values[0];

           if (distance == 0.0) {
                milliseconds = SystemClock.elapsedRealtime();
            } else {
                mLastProximityEventTime = SystemClock.elapsedRealtime();
            }
            final long timeSinceLastEvent =  mLastProximityEventTime - milliseconds;

            Log.d("xxxx"," data: " + distance +" +"+ milliseconds + " +"+mLastProximityEventTime + " +"+timeSinceLastEvent);

            if (distance == 0.0) {
                timer = new CountDownTimer(2000,1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {

                        if ((timeSinceLastEvent < 2000) && (timeSinceLastEvent >0)) {
                            timer.cancel();
                        }
                    }

                    @Override
                    public void onFinish() {

                        //Intent intent = new Intent(SensorFunctionService.this, Main2Activity.class);
                        //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                        //startActivity(intent);
                        Intent  cameraIntent = new Intent();
                        // 指定开启系统相机的Action
                        cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                        cameraIntent.addCategory(Intent.CATEGORY_DEFAULT);
                        cameraIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                        startActivity(cameraIntent);

                        timer = new CountDownTimer(5000,1000) {
                            @Override
                            public void onTick(long millisUntilFinished) {

                            }

                            @Override
                            public void onFinish() {

                                Intent intent = new Intent(SensorFunctionService.this, Main2Activity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                                startActivity(intent);
                                Toast.makeText(SensorFunctionService.this,"onFinish", Toast.LENGTH_SHORT).show();
                            }
                        }.start();
                    }
                }.start();

            }
        }

    }



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

    }
};
mSensorManager.registerListener(mSensorEventListener, mPSensor, SensorManager.SENSOR_DELAY_NORMAL);

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

new Thread(new Runnable() {
    @Override
    public void run() {

    }
});
return super.onStartCommand(intent, flags, startId);

}

@Override
public void onDestroy() {
super.onDestroy();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

}

  • 写回答

1条回答 默认 最新

  • mynamecsl 2018-05-21 08:25
    关注

    解决了。
    因为每次sensorChanged就重跑timer了,所以两个时间一个在onTick之前,一个在onTick之后,所以在onTick里面始终获取不到两个值的差。
    所以不去折腾时间了。自己设一个变量,onTick的时候设为true,为true的时候Psensor远离就停止倒计时。onFinish的时候设为false

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名