如果设备检测到震动事件,则唤醒屏幕

时间:2014-10-10 08:04:11

标签: android sensor shake

我在屏幕休眠后注册传感器。如果设备检测到震动事件,我必须唤醒屏幕。 如果我将设备与系统连接,设备会正确唤醒。 如果我断开设备, moto g设备,色度平板电脑不会醒来。但三星设备醒来了。

因此我通过在textview中显示logcat值进行了测试。 我发现了以下问题: 有时屏幕关闭后,我没有收到广播消息。 有时候我会收到消息,但是摇动设备后maccel值也没有增加。

我使用以下代码:

初始化传感器管理器:

manager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor=manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

注册广播接收器:

registerReceiver(screenoffreceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));

广播接收器:

private BroadcastReceiver screenoffreceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle extras = intent.getExtras();
            if (Intent.ACTION_SCREEN_OFF.equalsIgnoreCase(intent.getAction())) {
                //screen has been switched off!
                manager.registerListener(Testing.this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);

            }
        }
    };

用于检测摇晃事件:

public void onSensorChanged(SensorEvent event) {
          float x = event.values[0];
          float y = event.values[1];
          float z = event.values[2];
          mAccelLast = mAccelCurrent;
          mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
          float delta = mAccelCurrent - mAccelLast;
          mAccel = mAccel * 0.9f + delta; // perform low-cut filter
          Log.i("mAccel", "mAccel "+mAccel);

          mytext.setText(mytext.getText().toString()+" "+mAccel);

            if(mAccel>=1) {
                unlock_screen();
            }

请帮我解决这些问题。

2 个答案:

答案 0 :(得分:0)

如果您想确保操作系统不会杀死/回收您的服务,您需要将其作为前台服务。默认情况下,所有服务都是后台服务,这意味着当OS需要资源时它们将被终止。有关详细信息,请参阅此文档

基本上,您需要为服务创建通知并指明它是前台。这样,用户将看到持久通知,因此他知道您的应用正在运行,并且操作系统不会终止您的服务。

Intent intent = new Intent(this, typeof(SomeActivityInYourApp));
PendingIntent pi = PendingIntent.getActivity(this, 0, intent,   PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

builder.setSmallIcon(Resource.Drawable.my_icon);
builder.setTicker("App info string");
builder.setContentIntent(pi);
builder.setOngoing(true);
builder.setOnlyAlertOnce(true);

Notification notification = builder.build();

// optionally set a custom view

startForeground(SERVICE_NOTIFICATION_ID, notification);

答案 1 :(得分:0)

如果我在设备锁定后将设备与系统连接,则cpu会继续运行。因此,当我调用unlock_screen()方法时,设备会唤醒。 如果我断开设备,在进入锁定模式后,cpu就不会运行。因此,当我调用unlock_screen()方法时,设备不会被唤醒。 所以我使用了 PARTIAL_WAKE_LOCK 来运行Cpu。