2012-06-28 50 views
5

tôi cần phải phát hiện android thay đổi hướng thiết bị mà không chơi bằng tay với dữ liệu cảm biến, trong khi vẫn giữ định hướng hoạt động dính vào một số định hướngPhát hiện hướng thiết bị

onConfigurationChange sẽ không làm việc như sẽ gắn bó hoạt động của tôi để không xoay.

Chơi xung quanh với dữ liệu cảm biến để phát hiện sự thay đổi hướng tôi coi đó là sáng chế bánh xe, vì Android đã thực hiện nhúng thuật toán để phát hiện thay đổi hướng thiết bị. Và từ một khía cạnh khác, việc phát hiện sự thay đổi định hướng không phải là một phép kiểm tra đơn giản như thế này.

public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) { 
      return; 
     } 
     //getResources().getConfiguration().orientation; 
     if (event.values[1] < 6.5 && event.values[1] > -6.5) { 
      if (orientation!=1) { 
       Log.d("Sensor", "Protrait"); 
      } 
      orientation=1; 
     } else { 
      if (orientation!=0) { 
       Log.d("Sensor", "Landscape"); 
      } 
      orientation=0; 
     } 
    } 

Nó thực sự yêu cầu xử lý dữ liệu thực như lọc từ tiếng ồn và lắc/lắc đột ngột ngắn.

Vì vậy, bất kỳ ý tưởng nào có thể phát hiện định hướng thiết bị bằng các dịch vụ cũ? (Một lần nữa, tôi sẽ dán hoạt động của mình vào một số hướng để onConfigurationChange sẽ không hoạt động)

+0

là đây không phải những gì bạn muốn ??? http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone –

+0

không, tôi không có bất kỳ tài nguyên nào để được thay đổi – deimus

Trả lời

8

Có một Trình nghe cho sự kiện định hướng.

Check the document here.

SO question mentioning implementation of that Listener.

Code Example for the same here in this blog

Tôi hy vọng điều này sẽ giúp bạn

+0

Cảm ơn người đàn ông thats chính xác những gì tôi cần !!! sự tôn trọng !!! Tôi là android mới nhưng dường như rất nhiều android-dev không biết điều này ngay cả ở đây trong stackoverflow – deimus

+0

Bạn chào đón Deimus, Không ai hoàn hảo, mỗi người đều có chuyên môn riêng của mình, tôi mới bắt đầu sử dụng SO cho 3 5 ngày :) Chúc mừng coading – rajpara

5

hoạt động của tôi được thiết lập để luôn ở chế độ dọc. Đặt mã này vàoTạo.

myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) { 
     public void onOrientationChanged(int arg0) { 
      if (arg0>=315 || arg0<45){ 
       currentOrientation = Surface.ROTATION_90; 
      }else if (arg0>=45 && arg0<135){ 
       currentOrientation = Surface.ROTATION_180; 
      }else if (arg0>=135 && arg0<225){ 
       currentOrientation = Surface.ROTATION_270; 
      }else if (arg0>=225 && arg0<315){ 
       currentOrientation = Surface.ROTATION_0; 
      } 
     } 
    }; 
+0

Điều này đã giúp tôi rất nhiều. Khi Hoạt động bị khóa theo hướng, nhưng bạn vẫn cần vị trí thiết bị nhận được, đây là cách đúng :) – Tooroop

5

Bằng cách đặt screenOrientation tài sản trong Manifest bạn sẽ không thể nhận được giá trị định hướng từ onConfigurationChanged nữa vì nó sẽ ngừng bắn, nó có thể thực hiện SensorEventListener để có được Pitch, rollyaw góc để tính định hướng, nhưng nó hơi phức tạp và quá mức cần thiết cho một nhiệm vụ như vậy. Giải pháp tốt nhất tôi tìm thấy là sử dụng OrientationEventListener, đoạn code sau sẽ cập nhật giá trị luân chuyển về biến đổi định hướng, giá trị là 0-4 theo góc xoay:

private OrientationEventListener listener; 
private int rotation; 

@Override 
protected void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.main); 

    listener = new OrientationEventListener (this, SensorManager.SENSOR_DELAY_NORMAL) 
    { 
     @Override 
     public void onOrientationChanged (int orientation) 
     { 
      rotation = ((orientation + 45)/90) % 4; 
     } 
    }; 

    if (myOrientationEventListener.canDetectOrientation()) listener.enable(); 
    else listener = null; // Orientation detection not supported 
} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    if (listener != null) listener.disable(); 
} 
Các vấn đề liên quan