Intereting Posts
Размер текста с разным разрешением Как использовать экран блокировки пароля по умолчанию в нашем приложении для Android? Catch all type exceptions для программирования Android Как я могу подключиться к Android с ADB через TCP? Поведение imeOptions, imeActionId и imeActionLabel Как получить, когда ImageView полностью загружен в Android requestWindowFeature (Window.FEATURE_NO_TITLE); Дает исключение Обновите Android SDK Tool до 22.0.4 (последняя версия) с 22.0.1 Android: какая разница между setFlags и addFlags для намерения При выходе из системы очистите стек истории событий, не позволяя кнопке «Назад» открывать только активированные активации. Как установить столбец таблицы в android Android: очистить кеш всех приложений? Приложение Кордовы, которое не использует push-уведомления: «Отсутствие права на уведомление push-уведомления» Студия Android, использующая> 100% процессор во все времена – фоновые процессы не работают Просмотр курсора базы данных Android

Акселерометр Android не работает, когда экран выключен

Я разрабатываю приложение для моей окончательной диссертации по информатике, и мне нужно собирать и регистрировать данные акселерометра. Мне нужно приобрести его целый день, поэтому существуют серьезные ограничения батареи (например, я не могу оставить экран включенным). Кроме того, это не приложение, ориентированное на рынок, поэтому вполне допустимо совершить серьезный хакер, даже низкоуровневое C / C ++ кодирование, если это необходимо.

Хорошо известно, что на многих устройствах слушатели событий акселерометра прекращают генерировать события при выключении экрана (некоторые ссылки на эту проблему: http://code.google.com/p/android/issues/detail?id=3708 , Accelerometer Останавливает доставку образцов, когда экран выключен на Droid / Nexus One даже с WakeLock ). Я тщательно искал некоторые альтернативы, некоторые из них включают обходные пути, которые не работают для моего устройства (LG P990, ПЗУ).

Итак, что происходит, так это: когда вы регистрируете прослушиватель событий для датчика акселерометра андроида в Сервисе, он отлично работает, пока экран не будет отключен. Я уже пытался зарегистрировать eventListener на службе, в IntentService, попытался приобрести WakeLocks. Что касается wakelocks, я могу проверить, что служба все еще работает, наблюдая за выходом LOGcat, но, похоже, акселерометр переходит в спящий режим. Одним из обходных решений, представленным в некоторых ссылках, является отмена регистрации и повторная регистрация прослушивателя событий с использованием потока IntentService, как в этом фрагменте кода ниже

synchronized private static PowerManager.WakeLock getLock(Context context) { if (lockStatic==null) { PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE); lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,NAME); lockStatic.setReferenceCounted(true); } return(lockStatic); } @Override protected void onHandleIntent(Intent intent) { sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(this); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); synchronized (this) { boolean run = true; while (run){ try { wait(1000); getLock(AccelerometerService.this).acquire(); sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(this); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); Log.d("Accelerometer service", "tick!"); } catch (Exception e) { run = false; Log.d("Accelerometer service", "interrupted; cause: " + e.getMessage()); } } } } @Override public void onSensorChanged(SensorEvent event) { Log.d("accelerometer event received", "xyz: "+ event.values[0] + "," + event.values[1] + "," + event.values[2]); } 

Что действительно вызывает onSensorChange каждый раз, когда мы отменим регистрацию / регистрацию слушателя. Проблема в том, что полученное событие всегда содержит одни и те же значения, независимо от того, как я встряхиваю устройство.

Итак, в основном, мои вопросы: (медведь со мной, я почти заканчиваю: P)

  1. Возможно ли доступ к низкоуровневому доступу (подход C / C ++) к аппарату акселерометра БЕЗ регистрации на прослушиватель событий?

  2. Есть ли другой способ обхода или взлома?

  3. Может ли кто-нибудь с более современным телефоном добровольно протестировать, если проблема сохраняется в прошивке 3.0 и выше?

[ОБНОВИТЬ]

К сожалению, это похоже на ошибку с некоторыми сотовыми телефонами. Более подробно в моем ответе.

Solutions Collecting From Web of "Акселерометр Android не работает, когда экран выключен"

В принципе, это проблема с моим телефоном. Другие пользователи сообщают, что это также происходит с их телефонами, от разных брендов, но с той же версией Android. У других людей нет проблем вообще, что указывает на то, что это не проблема с версией Android, но и с реалиями каждой компании для их аппаратных драйверов.

Мне нужны данные постоянного акселерометра, и я не могу измерить эти данные для меня – у меня есть Arduino с Bluetooth и акселерометром, поэтому я мог бы реализовать это решение. Поэтому я решил, что временное решение для моего мобильного телефона должно позволить экрану (затемненному) и игнорировать потребление батареи. Позже я проведу тесты на использование батареи с помощью другого телефона Android, который работает с выключенным экраном.

Дополнительная информация об ошибке

Я исследовал еще несколько и нашел отчеты от других пользователей Android, и я думаю, что, может быть, я понимаю, что происходит. Библиотека libsensors.so, у которой есть драйверы для телефонных датчиков, не разработана компанией Google, но для каждого поставщика сотовых телефонов – конечно, потому что у каждого мобильного телефона есть свое специфическое оборудование. Google предоставляет только заголовочный файл C, чтобы разработчики знали, что им нужно реализовать. В некоторых вариантах реализации этих драйверов разработчики просто отключают акселерометр, когда экран выключается, тем самым предотвращая прием слушателя сенсора для получения новых событий.

Я также тестировал это с помощью CyanogenMod RC7.2, но он тоже не работал, потому что драйверы акселерометра являются оригинальными для LG.

Электронные письма, обменянные с отделом кадров LG

Я отправил электронное письмо разработчикам LG P990 и, наконец, получил некоторые конкретные ответы! Это может очень помочь некоторым людям, таким как я, которые испытывают эти проблемы с Android. Я написал следующий вопрос

Здравствуйте! Я развиваю диссертацию по информатике, и в настоящее время я получаю данные с аппаратуры акселерометра. На данный момент я узнал, что акселерометры не отправляют события, когда экран выключен, поэтому даже когда я захватываю wakelock из одной из моих программ, я могу проверить, что моя программа все еще работает (через выход LOGcat), но нет Происходит акселерометр. Я должен затушить свой экран (что я не могу себе позволить, батарея стекает слишком быстро), чтобы снова начать принимать события акселерометра. Я также попытался получить доступ к нему через собственный C-код, зарегистрировавшись на событиях акселерометра, но результат был тем же, акселерометр не выдавал никаких значений, хотя я вращал свое устройство. Поэтому мне было интересно, могу ли я иметь прямой доступ к аппаратным средствам, с собственным кодом, без необходимости регистрироваться в прослушивателе. Это возможно? Если да, не могли бы вы дать дополнительные советы? Я бы очень признателен за любую помощь! Мартин

За что я получил этот ответ:

Дорогой Мартин, Мы получили ответ от Dev. Команда. Они сказали, что вы не можете получить акселерометр, когда экран телефона выключен. Поскольку слой HAL не реализовал путь sysFS для получения H / W-события, такого как акселерометр, и нет открытого API для получения события. Спасибо. С наилучшими пожеланиями. (Шон Ким)

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

[…] Я задал этот вопрос, потому что у меня есть друзья, у которых также есть телефоны Android с той же версией пряничных прядей, но из других брендов мобильных телефонов, и некоторые из них сообщили, что они получают события от акселерометров, когда экран выключен. Я читал на некоторых форумах, что эта ошибка – я считаю ее ошибкой, так как, когда я приобретаю Wakelock, я ожидаю, что у меня будет какая-то обработка – зависит от драйверов датчиков, которые продавцы реализуют для своих мобильных телефонов. Есть ли вероятность, что эти драйверы могут быть обновлены или эта ошибка будет исправлена ​​в какой-то момент? Это очень помогло бы мне с моей текущей работой […]

И тогда я получил этот ответ:

Насколько мне известно из Dev. Команда, Это не ошибка. Это безграничный телефон из-за архитектуры H / W. Нам необходимо переконфигурировать архитектуру HAL и драйвер устройства для поддержки вашего запроса. Но, как вы знаете, это слишком сложно из-за нехватки ресурсов. Мы стараемся помочь вам всеми нашими усилиями, но мы не можем поддержать ваш запрос, как я уже говорил. (Шон Ким)

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

Нижняя строка Если у вас есть мобильный телефон, который не отправляет события акселерометра с выключенным экраном, попробуйте обновить прошивку. Если это не решит, и вы действительно хотите сделать серьезный взлом, повторите свой аппаратный уровень – подсказка: возможно, это что-то связано с libsensors.so.

Я не уверен, что это действительно поможет вам, но я нашел работу (не уверен, насколько хорошо, если поможет экономить аккумулятор, хотя).

Используя bash, у меня есть петля cat-ing /sys/devices/virtual/accelerometer/accelerometer/acc_file , и когда я выключаю экран с помощью кнопки питания, выход продолжается, но заморожен. (У меня было sshd, работающее в chroot, следовательно, возможность видеть это.)

Тем не менее, в эхом 0 > /sys/devices/platform/msm_fb.196609/leds/lcd-backlight/brightness . Экран выключится, и выход будет непрерывным.

Это на SGH-T589W, версия 2.3.6 для Android.

Я столкнулся с аналогичными проблемами с Samsung Nexus под управлением Android 4.0.2, используя другие системные службы, которые останавливают / приостанавливают пока экран выключен, хотя PARTIAL_WAKE_LOCK приобретается. Моим решением было использовать SCREEN_DIM_WAKE_LOCK как в:

  lockStatic = mgr.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,NAME); 

Было бы намного лучше отключить экран, но по крайней мере это решение работает, хотя было бы еще лучше, если бы я мог ограничить использование SCREEN_DIM_WAKE_LOCK только теми устройствами / операционными SCREEN_DIM_WAKE_LOCK которые этого требуют.

Я применил PARTIAL_WAKE_LOCK, и он работал как обаяние для меня. Протестировано на OS 5.0, 6.0 и 7.0. Вот мой код, чтобы получить и освободить блокировку от пробуждения. Будьте осторожны, это увеличивает дренаж батареи, поэтому приобретайте и освобождайте его разумно.

 public void acquireWakeLock() { final PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); releaseWakeLock(); //Acquire new wake lock mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK"); mWakeLock.acquire(); } public void releaseWakeLock() { if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); mWakeLock = null; } } 

Ссылка: https://developer.android.com/training/scheduling/wakelock.html#cpu

Я работаю над предсказанием sdk, который использует данные датчиков устройства (акселерометр / гироскоп) и прогнозирует пользовательские события. Я испытал ту же проблему.

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

Если опция частичного следящего следа недоступна для вашего телефона, это означает, что драйвер для датчика включен с помощью функции early_suspend .

Есть два варианта.

1: отключить EARLY_SUSPEND в драйвере

2: добавьте флаг времени выполнения, который может enable / disable early_suspend функции disable early_suspend на уровне драйвера.

ех. Cat / sys / module / earlysuspend / sensor 1/0

ИМО второй вариант должен был быть с самого начала.