2012-04-12 1 views
6

Используя некоторый код из this question Я установил код для обнаружения, когда устройство Android будет повернуто. Он отлично подходит для планшета asus (4.0.3) и двух симуляторов (4.0.3 и 2.1), но для разжигающего огня (2.3.4) и дроида (2.3.4) он переключает ширину и высоту.Определить ориентацию с помощью javascript на устройствах Android.

Код:

<script type="text/javascript"> 
    var supportsOrientationChange = "onorientationchange" in window,orientationEvent = supportsOrientationChange ? "orientationchange" : "resize"; 

    window.addEventListener(orientationEvent, function() { 
     alert("The rotation is " + window.orientation + " and the resolution is " + screen.width + " x " + screen.height); 
     modRule(); 
    }, false); 
</script> 

Выход из ASUS таблетки

Держа его в том, что выглядит как пейзаж:

Вращение 0 и разрешение 1280 х 800

Портрет

Вращение -90 и разрешение 800 х 1280

Выход из Kindle Fire

пейзаж

Вращение 90 и разрешение составляет 600 х 819

Портрет:

Вращение равно 0, а разрешение составляет 1024 х 395

Выход из DroidX

пейзаж:

Вращение 90 и разрешение 320x488

Портрет:

Вращение 0 и разрешение 569x239

Есть ли способ я могу

а) Сделать Javascript обнаружить, если он должен использовать высоту вместо ширины или ширины вместо высоты

OR

b) Заставить устройства сообщать правильные значения по их ширине и высоте?

ответ

1

После долгого поиска я узнал, что это ошибка с ОС 2.2 и 2.3. Я исправил ошибку с помощью 2.3.4, поместив этот код в свое приложение.

browser = (WebView)findViewById(R.id.webBrowser); 
browser.setBackgroundColor(Color.BLACK); 
WebSettings webSettings = browser.getSettings(); 
webSettings.setJavaScriptEnabled(true); 
webSettings.setUserAgentString("Android " + android.os.Build.VERSION.SDK);//this is so the JavaScript knows what version of the OS I'm using 

И тогда для обнаружения, если я нахожусь в ландшафтном режиме:

var uagent = navigator.userAgent.toLowerCase(); 
function isLandscape() 
{ 
    var width = screen.width; 
    var height = screen.height; 
    if (isBugged()) 
    { 
     var temp = width; 
     width = height; 
     height = temp; 
    } 
    var landscape = width > height; 
    return landscape; 
} 

function isBugged() 
{ 
    return uagent == "android 10" 
} 

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

<body onload="if(isBugged()){uagent = 'bypass';}/*code that depends on isLandscape()*/;uagent = navigator.userAgent.toLowerCase();"> 

Это настоящая боль, намного больше работы, чем должно быть. Тем более, что он работает в 2.1, но не 2.3.4. Действительно расстраивает, но это то, что у меня есть. На данный момент я проверяю только на sdk 10, я собираюсь добавить проверку на другие прослушиваемые версии в ближайшее время.

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