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

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

报告相同问题?

悬赏问题

  • ¥30 自适应 LMS 算法实现 FIR 最佳维纳滤波器matlab方案
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像