2012-02-20 3 views
3

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

После некоторых тестов, я обнаружил, что скорость моего Nexus S акселерометра является всегда 50 значений в секунду, когда телефон включен, и 6 значений в секунду, когда он спит (с PARTIAL_WAKE_LOCK), независимо от скорости ввода запросить (NORMAL, UI, GAME или FASTEST).

Поэтому я решил установить приложение найденное в Интернете, который проверяет скорость акселерометра: http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code

Но я получил такую ​​же «ошибку»: независимо от скорости я прошу, это всегда 50 значений в второй, когда телефон активен.

Я не понимаю, почему мой телефон ведет себя таким образом. Это проблема:

  • связанный с Nexus S?
  • подходит к моему телефону?
  • , связанный с Android 4?

EDIT: Я тестировал программу на другом Nexus S (Android 4), и у меня такая же проблема. Так что, похоже, исключается одна из перечисленных выше возможностей: она не связана только с моим телефоном.

+1

Я пробовал код на планшете трансформатора Asus, и у меня такая же проблема. Все задержки датчика используют 50 Гц частоты. Я тоже буду искать ответ. – vgonisanz

+1

Вы можете попробовать его в различных конфигурациях с помощью эмуляторов, чтобы определить, зависит ли он от ОС или зависит от устройства. Моя ставка будет заключаться в том, что стоимость зависит от вашего оборудования и не может быть изменена ... Также читайте это: http://stackoverflow.com/questions/4224223/android-how-to-increase-accelerometer-sampling-rate –

+0

Спасибо, я попробую с эмуляторами! –

ответ

6

Я провел несколько тестов на разных смартфонах. Вот результаты:

Samsung Galaxy Teos 
------------------- 
* When awake 
    Normal: 4.17 Hz 
    UI: 8.43 hz 
    Game: 16.93 Hz 
    Fastest: 109.42 Hz 

* When asleep 
    The phone sends null values (0), whatever the mode I chose 


Samsung Nexus S 
--------------- 
* When awake 
    Normal: 49.51 Hz 
    UI: 49.51 hz 
    Game: 49.51 Hz 
    Fastest: 49.51 Hz 

* When asleep 
    6.06 Hz, whatever the mode I chose 

LG Nexus 5 
---------- 
* When awake 
    Normal: 15.39 Hz 
    UI: 15.4 Hz 
    Game: 50.05 Hz 
    Fastest: 196.74 Hz 

* When asleep 
    Normal: 4.96 Hz 
    UI: 15.41 Hz 
    Game: 50.12 Hz 
    Fastest: 198.53 Hz 

LG Nexus 4 
---------- 
* When awake 
    Normal: 15.75 Hz 
    UI: 15.74 Hz 
    Game: 48.86 Hz 
    Fastest: 195.85 Hz 

* When asleep 
    Normal: 5.5 Hz 
    UI: 15.74 Hz 
    Game: 49.16 Hz 
    Fastest: 196.75 Hz 


Samsung Galaxy Nexus 
-------------------- 
* When awake 
    Fastest: 125 Hz 

* When asleep 
    It sends data 


Samsung Galaxy Note 2 
--------------------- 
* When awake 
    Fastest: 100 Hz 

* When asleep 
    The phone does not send anything 


Samsung Galaxy S3 and S3 Mini 
----------------------------- 
* When awake 
    Fastest: 100 Hz 

* When asleep 
    Fastest: 100 Hz 


HTC Wildfire 
------------ 
* When awake 
    Normal: 4 Hz 
    UI: 12 hz 
    Game: 22.2 Hz 
    Fastest: 38.40 Hz 

* When asleep 
    The phone does not send anything, whatever the mode I chose 


HTC Desire 
---------- 
* When awake 
    Normal: 4.36 Hz 
    UI: 11.9 hz 
    Game: 23.3 Hz 
    Fastest: 47.27 Hz 

* When asleep 
    The phone does not send anything, whatever the mode I chose 

Следует отметить, что испытания были проведены с использованием частичной блокировки бодрствования. Без него Nexus S не предоставляет никаких данных, когда он спит.

Существует также полезный список смартфонов, которые акселерометры отправить (или нет), совместимые данные во время сна: http://www.saltwebsites.com/2012/android-accelerometers-screen-off

+0

Привет, Ромайн, можете ли вы дать мне несколько указаний относительно того, как вы оценивали ставки для разных телефонов в разных режимах? – R3D3vil

+0

Hi Nisarg, я использовал это приложение для тестирования частоты устройств: http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code К счастью, моя компания владеет несколькими устройствами, поэтому я могу протестировать те, которые я цитирую в моем ответе. –

+0

Привет, Роман, спасибо большое ... Я попробую это! – R3D3vil

3

Не подключайте телефон к компьютеру с помощью USB во время приема данных, поскольку во время сбора данных регистрируется только на SD-карте. Когда телефон подключен к ПК через USB, файл SD не может быть сохранен на SD-карте.

Так что попробуйте отключить USB при сбор данных.

+0

Я тестировал ваше приложение, и действительно, частота составляет около 16-17 Гц. Как вы это делаете? Это проверка значений в методе onSensorChanged()? Если это так, это не решает мою проблему. –

+0

Кстати, ответьте мне с комментариями вместо ответов;) –

+0

мы не использовали метод SensorChanged(). Вместо этого мы извлекали максимальное количество выборок через код (используя самый быстрый), и мы выполнили выборку с помощью алгоритма, соответствующего 15 образцам в секунду. Надеюсь, это сработает и для вас. – aps109

1

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

Я поставил код в этом суть https://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530

Это суть имеет намного больше кода, чем нужно, но только обратить внимание на следующие два метода

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
//  //Power management 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
.....} 

Приведенный выше код предотвращает ОС, чтобы включить от CPU

Теперь, чтобы сделать эту услугу приоритетной услугу

NotificationCompat.Builder notificationBuilder = 
       new NotificationCompat.Builder(getApplicationContext()) 
         .setContentTitle("Title") 
         .setContentText("hola") 
         .setContentIntent(viewPendingIntent); 



     NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); 

     not=notificationBuilder.build(); 
     notificationManager.notify(notificationId,not); 
     startForeground(notificationId, not); 

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

С помощью этого кода я смог получить требуемую частоту дискретизации, даже после того, как часы отключились от экрана автоматически.

Смежные вопросы