2015-10-13 67 views
3

我有一個接收推送通知,檢測當前設備方向(縱向/右側風景/左側風景)並拍攝照片的應用程序。 方向用於設置Camera.Parameters的旋轉。從沒有指南針的設備上獲取服務的方向

我使用SensorManager.getRotationMatrix()來計算方向,但它需要來自地磁傳感器的值。 Lenovo S90-A沒有指南針,所以好像沒有辦法讓我獲得這些值。

我試圖用這個代碼:

int rotation = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 

從我Service,但它的工作原理,只有當設備處於開啓狀態。 但是,如果設備正在休眠並收到推送通知,則此方法始終返回Surface.ROTATION_0

設備將被固定在牆上,不應該移動。

那麼,有沒有辦法檢測當前設備方向沒有指南針?

+1

設備方向與指南針無關。它是爲您提供設備方向的加速度計。 – m0skit0

+0

@ m0skit0請問我可以給我一個解決方案嗎?嘗試真的很難找到它,但沒有運氣。 – agamov

+0

[使用加速度計](http://stackoverflow.com/questions/5180187/how-do-i-use-the-android-accelerometer) – m0skit0

回答

0

這個answer真的很有幫助。實際上,如果您的設備的方向是平的(例如它位於桌子上),則您不能僅依靠加速度計。 我結束了這種方法,我用於沒有指南針的設備。 對於使用指南針的設備,我使用SensorManager.getRotationMatrix()SensorManager.getOrientation()

/** 
    * calculates rotation only from accelerometer values 
    * @param g - accelerometer event values 
    * @return 
    */ 
    private int getRotationFromAccelerometerOnly(float[] g) { 
     double normOfG = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]); 
     // Normalize the accelerometer vector 
     g[0] = (float) (g[0]/normOfG); 
     g[1] = (float) (g[1]/normOfG); 
     g[2] = (float) (g[2]/normOfG); 
     int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2]))); 
     int rotation; 
     if (inclination < 25 || inclination > 155) { 
      // device is flat, return 0 
      rotation = 0; 
     } else { 
      // device is not flat 
      rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1]))); 
     } 

     return rotation; 
    }