Intereting Posts
Добавить пользовательский шрифт для полного приложения для Android Почему я получаю файл cookie SACSID из входа в Google appengine вместо ACSID? Во время работы андроида AVD-манипулятора отображается ошибка: «Модуль ядра HAX не установлен!» Как удалить неиспользуемые языки из окончательного файла APK с помощью Xamarin.Android? @ Font-face не работает в браузерах Android Ошибка при добавлении фрагментов динамически – java.lang.IllegalStateException: Android ListView Adapter, как обнаружить пустой список? Создавайте файлы mp4 на Android с помощью Jcodec Проблемы с созданием нескольких таблиц в sqlite Private String или public static String? Android NDK в Eclipse :: (Не удается запустить программу «ndk-build»: неизвестная причина) Не удается получить доступ к папке с данными в Проводнике DDMS с помощью Nexus One! Как изменить изображения вкладок в TabHost Как преобразовать SpannedString в Spannable Android: есть ли способ программирования веб-ярлыка на главном экране?

Акселерометр останавливает доставку образцов, когда экран выключен на Droid / Nexus One даже с WakeLock

У меня есть код, который расширяет сервис и регистрирует показания датчика акселерометра SensorEvent (SensorEvent) на Android. Я хотел бы иметь возможность записывать эти показания датчиков, даже когда устройство выключено (я осторожно работаю от батареи, и это становится очевидным, когда он работает). Пока экран работает на торгах, отлично работает на 2.0.1 Motorola Droid и 2.1 Nexus One.

Однако, когда телефон перейдет в спящий режим (нажав кнопку питания), экран отключится, и события onSensorChanged перестанут поставляться (проверено с помощью сообщения Log.e, которое вызывается каждый раз, когда onSensorChanged вызов).

Служба получает wakeLock, чтобы убедиться, что она работает в фоновом режиме; Но, похоже, это не имеет никакого эффекта. Я пробовал все различные PowerManager. Блокировки, но ни один из них не имеет значения.

 _WakeLock = _PowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); _WakeLock.acquire(); 

Были противоречивые сообщения о том, действительно ли вы можете получать данные от датчиков, пока экран выключен … у кого-нибудь есть опыт с этим в более современной версии Android (Eclair) и аппаратного обеспечения?

Это, по-видимому, указывает на то, что он работал в Cupcake: http://groups.google.com/group/android-developers/msg/a616773b12c2d9e5

PS: Точный же код работает так, как предполагалось, в 1.5 на G1. Ведение журнала продолжается, когда экран выключается, когда приложение находится в фоновом режиме и т. Д.

Solutions Collecting From Web of "Акселерометр останавливает доставку образцов, когда экран выключен на Droid / Nexus One даже с WakeLock"

Мы пришли к выводу, что это началось с версии 2.0.1. Кажется, это преднамеренно, возможно, часть увеличения срока службы аккумулятора, которое было рекламировано как функция. У нас было рабочее дрожание, чтобы разбудить или разблокировать на 2.0, затем оно сломалось в обновлении, и мы не смогли найти какое-либо решение. ; (Не имеет значения, сохраняется ли частичная блокировка процессора, которая должна всегда предотвращать спящий режим процессора. Из того, что я видел при регистрации отладки через USB, иногда случается упоминание изменений датчика-слушателя, когда происходит спящий режим.

Пользователь опубликовал обходное решение, которое, как он утверждал, работает на устройствах Motorola – https://sites.google.com/a/bug-br.org.br/android/technical-documents

Я протестировал обходной путь, придумав следующий код из учебника и некоторую ручную ревизию (в его учебнике представлен код «несколько ошибок»):

 public class ShakeWakeupService extends Service implements SensorEventListener{ private Context mContext; SensorManager mSensorEventManager; Sensor mSensor; // BroadcastReceiver for handling ACTION_SCREEN_OFF. public BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Check action just to be on the safe side. if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.v("shake mediator screen off","trying re-registration"); // Unregisters the listener and registers it again. mSensorEventManager.unregisterListener(ShakeWakeupService.this); mSensorEventManager.registerListener(ShakeWakeupService.this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } } }; @Override public void onCreate() { super.onCreate(); Log.v("shake service startup","registering for shake"); mContext = getApplicationContext(); // Obtain a reference to system-wide sensor event manager. mSensorEventManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); // Get the default sensor for accel mSensor = mSensorEventManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // Register for events. mSensorEventManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); // Register our receiver for the ACTION_SCREEN_OFF action. This will make our receiver // code be called whenever the phone enters standby mode. IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mReceiver, filter); } @Override public void onDestroy() { // Unregister our receiver. unregisterReceiver(mReceiver); // Unregister from SensorManager. mSensorEventManager.unregisterListener(this); } @Override public IBinder onBind(Intent intent) { // We don't need a IBinder interface. return null; } public void onShake() { //Poke a user activity to cause wake? } public void onAccuracyChanged(Sensor sensor, int accuracy) { //not used right now } //Used to decide if it is a shake public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return; Log.v("sensor","sensor change is verifying"); } } 

Обходной путь работает для меня, но не будет работать, пока я запускаю screebl, что является особенностью, которую многие мои пользователи действительно хотят работать вместе с тем, что я разрабатываю.

Просто обновил свой Nexus One с помощью FROYO FRF50 ROM, который за последние несколько дней ходит по сети, и кажется, что теперь датчики работают снова, когда экран выключен, если у вас есть PARTIAL_WAKELOCK. Я не знаю, приведет ли это к официальной сборке, хотя я понимаю, что это основано на официальной сборке, которую получили некоторые пользователи N1. Возможно, они изменили свое мнение (еще раз) и снова включили датчики, когда телефон заблокирован. Скрещенные пальцы.

Конечно, они могли бы просто отключить их снова в 2.2-r1, кто знает …

Использование SCREEN_DIM_WAKE_LOCK для меня работало на HTC EVO ..

 final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); _WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG"); _WakeLock.acquire(); 

Похоже, что это проблема с прошивкой 2.1, мне необходимо, чтобы это было исправлено, но мне нужно работать во всех возможных решениях, чтобы охватить все версии.

Я собрал список телефонов и прошивок, которые работают / не работают / работают с перерывами, чтобы мы могли либо протестировать телефон, либо прошивку.

http://apprssd.com/2010/09/08/android-onsensorchanged-not-working-when-screen-lock-is-on/

Если у вас есть новый телефон, вы можете обновить список, сообщите мне.

Существует альтернативное решение (вроде), в котором вы всегда включаете экран, используя:

Settings.System.putInt (getContentResolver (), Settings.System.SCREEN_OFF_TIMEOUT, -1);

Но это не мешает пользователю отключить экран, нажав кнопку питания, а затем поток событий датчика прекратится. Для этого вам также потребуется разрешение WRITE_SETTINGS.

Обходной путь выше перерегистрации для событий датчиков не работает на Droid Eris, который работает под управлением Android 2.1 и, как ожидается, никогда не получит обновление. Я использовал следующее, хотя, похоже, работает. Вместо отмены регистрации и повторной регистрации этот подход снова включает экран, когда пользователь отключает его, хотя он возвращается в затемненное состояние. В следующем коде обработчик – это просто обработчик, созданный в Activity (т. Е. Обработчик Handler = new Handler ();) и mTurnBackOn – это Wake Wake, инициализированный нулем.

 public BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { // Turn the screen back on again, from the main thread handler.post(new Runnable() { public void run() { if(mTurnBackOn != null) mTurnBackOn.release(); mTurnBackOn = mPwrMgr.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "AccelOn"); mTurnBackOn.acquire(); }}); } } };