2012-04-12 17 views
6

Przy użyciu kodu z this question skonfigurowałem kod do wykrywania, kiedy urządzenie z Androidem jest obracane. Działa świetnie dla tabletu asus (4.0.3) i dwóch symulatorów (4.0.3 i 2.1), ale dla ognia rozpałkowego (2.3.4) i droidx (2.3.4) przełącza szerokość i wysokość.Wykryj orientację za pomocą javascript na urządzeniach z Androidem

Kod:

<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> 

Wyjście z asus tabletki

Trzymając go w co wygląda jak krajobraz:

Obrót wynosi 0, a rozdzielczość wynosi 1280 x 800

Portret

obroty silnika -90 rozdzielczość 800 x 1280

Wyjście z Kindle ognia

krajobrazu

obroty silnika 90, rozdzielczość wynosi 600 x 819

Portret:

Obrót jest 0 i rozdzielczości 1024 x 395

wyjściowy DroidX

pozioma:

obroty silnika 90, rozdzielczość wynosi 320x488

Portret:

Obrót wynosi 0, a rozdzielczość to 569x239

Czy istnieje sposób mogę

a) dokonania javascript wykryć, czy należy go używać wysokość zamiast szerokości lub szerokości zamiast wysokości

LUB

b) Czy urządzenia zgłaszają prawidłowe wartości ich szerokości i wysokości?

Odpowiedz

1

Po dłuższym szukaniu okazało się, że jest to błąd w systemach operacyjnych 2.2 i 2.3. Naprawiłem błąd w 2.3.4, umieszczając ten kod w mojej aplikacji.

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 

A potem do wykrywania, czy jestem w trybie poziomym:

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" 
} 

A jeśli to nie było wystarczająco skomplikowane, gdy organizm początkowo ładuje, to prawda o tym, czy to w trybie poziomym lub nie. Więc musiałem ominąć moje własne obejście.

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

To prawdziwy ból, o wiele więcej pracy niż powinien. Zwłaszcza, że ​​działa w wersji 2.1, ale nie 2.3.4. Naprawdę frustrujące, ale to właśnie mam. W tej chwili sprawdzam tylko sdk 10, wkrótce dodam sprawdzanie innych błędnych wersji.

Powiązane problemy