2012-02-14 4 views
0

Я пытаюсь понять, как я могу узнать, смотрит ли экран устройства на пользователя или, например, на стол с экраном, смотрящим вверх или вниз, и т. Д.Получите, где обращается к мобильному телефону в android

Я не использую датчик ориентации, так как он устарел. Я использую матрицу вращения, я знаю, что значения высоты тона и валика должны быть хорошими, чтобы получить эту информацию, но прежде чем я получу эти значения, мне нужно выполнить команду remapcoordinatesystem и знаете, какой Axle является X, и какой из них YI должен знать, с чем сталкивается экран.

Например: Если экран обращен к пользователю можно использовать эту таблицу сопоставления

ROTATION_0         Х   Y

ROTATION_90     -Y     Х

ROTATION_180   -X   -Y

ROTATION_270   Y   -X

Если экран перед небом, может быть, мне придется поменять Y ось с Z оси, но я не знаю, как я могу узнать, где находится экран напротив.

Любые идеи?

Я также использую этот метод, который я нашел в Интернете (http://code.google.com/p/the-schwartz-unsheathed/source/browse/trunk/src/com/android/app /schwarz/PhoneOrientation.java?r=12)

public static int getOrientation(float roll, float pitch) { 
       int orientation = ORIENTATION_INVALID; 

       if (Math.abs(roll) == 0.0 && Math.abs(pitch) == 0.0){ 
        return ORIENTATION_INVALID; 
       } 

       if(roll >= -90 && roll <= -(90-mTolerance)){ 
         orientation = ORIENTATION_FACE_LEFT; 
       } 
       else if(roll <= 90 && roll >= (90-mTolerance)){ 
         orientation = ORIENTATION_FACE_RIGHT; 
        } 

       if(pitch >= (90-mTolerance) && pitch <= (90+mTolerance)) { 
         if(orientation != ORIENTATION_INVALID){ 
           orientation = ORIENTATION_INVALID; 
         } 
         else { 
           orientation = ORIENTATION_FACE_FORWARD; 
         } 
       } else if(pitch <= -(90-mTolerance) && pitch >= -(90+mTolerance)) { 
         if(orientation != ORIENTATION_INVALID) { 
           orientation = ORIENTATION_INVALID; 
         } 
         else { 
           orientation = ORIENTATION_FACE_BACKWARD; 
         } 
       } 

       if((roll >= -mTolerance && roll <= mTolerance)) { 
         if((pitch >= -mTolerance && pitch <= mTolerance)) { 
           if(orientation != ORIENTATION_INVALID) { 
             orientation = ORIENTATION_INVALID; 
           } 
           else { 
             orientation = ORIENTATION_FACE_UP; 
           } 
         } else if((pitch <= -(180-mTolerance) && pitch >= -180) || (pitch >= (180-mTolerance) && pitch <= 180)) { 
           if(orientation != ORIENTATION_INVALID) { 
             orientation = ORIENTATION_INVALID; 
           } 
           else { 
             orientation = ORIENTATION_FACE_DOWN; 
           } 
         } 
       } 

       return orientation; 
     } 

У кого-нибудь есть лучше?

+0

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

ответ

0

Вы можете использовать акселерометр, потому что он дает ось x-y устройства, поэтому вы можете попасть туда, где находится устройство.

+0

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

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