【问题标题】:Wake up the screen if device detects the shake event如果设备检测到抖动事件,则唤醒屏幕
【发布时间】:2014-10-10 08:04:11
【问题描述】:

我在屏幕休眠后注册传感器。如果设备检测到抖动事件,我必须唤醒屏幕。 如果我将设备与系统连接,设备会正确唤醒。 如果我断开设备, moto g 设备,chroma 数位板无法唤醒。但是三星设备会唤醒。

所以我已经通过在 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();
            }

请帮我解决这些问题。

【问题讨论】:

    标签: android sensors shake


    【解决方案1】:

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

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

    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);
    

    【讨论】:

    • 我这里没有使用服务。我正在广播接收器中注册sensorListener。
    • 然后尝试使用服务 :) 您的广播接收器需要在活动暂停时工作。或者,如果您没有取消注册 Receiver onPause,则它是内存泄漏...
    • 我使用广播接收器来检测屏幕关闭,大多数情况下,我会收到广播消息。有时它会失败。而且在某些设备中,即使我在 maccel 值达到 >= 后重置 mAccel、mAccelLast 、mAccelCurrent 值1,在注销和注册传感器后,我得到了相同的 mAccel 值。如果我在 logcat 中打印传感器事件值。我得到了以前的 x、y、z 值。它没有重置。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多