【问题标题】:Android: service for gps / sensor loggingAndroid:gps/传感器记录服务
【发布时间】:2010-12-14 20:08:27
【问题描述】:

我正在寻找最佳实践来实现定期(每 10-60 秒)记录 gps 或其他传感器值的服务。当手机进入睡眠状态时,该服务应处理待机模式。

非常感谢任何帮助(伪代码或教程)!

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    看起来不可能让方向传感器连续工作几个小时,即使设备可能会进入睡眠状态(请参阅http://code.google.com/p/android/issues/detail?id=3708#makechanges

    显示屏一关闭,传感器就会做同样的事情...... :(

    我现在实现了唤醒锁(需要许可)

    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    

    结合计时器和广播接收器,将重新打开显示器。这对于电池寿命来说当然是疯狂的,但到目前为止我没有找到其他方法。

    这是我在服务中的 onCreate 方法:

    @Override
    public void onCreate() {
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    CONTEXT = this;
    PowerManager pm = (PowerManager) CONTEXT.getSystemService(Context.POWER_SERVICE);
    this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my tag");
    mWakeLock.acquire();
    Log.d(TAG, "Wakelock acquired");
    // register receiver that handles screen on and screen off logic
                IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
                filter.addAction(Intent.ACTION_SCREEN_OFF);
                BroadcastReceiver mReceiver = new ScreenReceiver();
                registerReceiver(mReceiver, filter);
    }
    

    这是服务的onStart方法:

    @Override
    public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show();
    Log.d(TAG, "onStart");
    boolean screenOn = intent.getBooleanExtra("screen_state", false);
                if (!screenOn) {
                    Log.d(TAG, "Screen is on");
                } else {
                 Log.d(TAG, "Screen is off");
             Timer timer = new Timer("DigitalClock");
         timer.schedule(new TimerTask() {
            @Override
            public void run() {
             Log.d(TAG,"Waiting 1 sec for switching the screen back on again...");
         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
             "my tag");
         mWakeLock.acquire();
            }
         }, 1000);
                 mWakeLock.acquire();
                    }
    }
    

    这是 BroadcastReceiver 类:

    public class ScreenReceiver extends BroadcastReceiver {
         private boolean screenOff;
         @Override
         public void onReceive(Context context, Intent intent) {
                 if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                         screenOff = true;
                 } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                         screenOff = false;
                 }
                 Intent i = new Intent(context, MyService.class);
                 i.putExtra("screen_state", screenOff);
                 context.startService(i);
         }
    

    }

    此解决方法也适用于通过 USB 从调试器中拔出的设备(我首先遇到了这个问题)。

    如果您有更好的解决方案,或者 2.3 中是否有修复,请告诉我。谢谢!

    【讨论】:

    • 这仍然是唯一的方法吗?我的意思是,有没有更好的方法来持续监控安卓传感器?
    【解决方案2】:

    这里是有关如何使用 Android 服务的教程的链接。 LINK 这是有关如何从传感器读取数据的教程的链接。 LINK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-10
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多