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

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

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?