2012-02-28 19 views
5

Tôi đang cố gắng có góc nghiêng của điện thoại và tôi có hoạt động này hoạt động hoàn hảo trên LG Optimus S với 2.3 trên đó, nhưng trên cổ phiếu của tôi Verizon Galaxy Nexus chạy ICS 4.0.2 sự kiện TYPE_MAGNETIC_FIELD không bao giờ cháy.Sự kiện TYPE_MAGNETIC_FIELD không kích hoạt trên Galaxy Nexus ICS 4.0.2

Vì sự kiện TYPE_MAGNETIC_FIELD không bao giờ xảy ra, tôi không nhận được mảng mGravs cần thiết để truyền vào SensorManager.getRotationMatrix. Vì vậy, tôi không thể nói góc của điện thoại. Giống như tôi đã đề cập đến mã này hoạt động tốt trên thiết bị khác của tôi và tôi có thể thấy góc nghiêng của điện thoại mà không có vấn đề gì.

Bất kỳ ai biết tại sao tôi sẽ không nhận được sự kiện này với Galaxy Nexus của mình? Đã có bất kỳ thay đổi nào đối với SDK có thể ngăn việc này hoạt động không?

Đây là hoạt động của tôi:

package com.rain.united; 

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class Gameplay extends Activity implements SensorEventListener{ 
    private static final String TAG = "CameraDemo"; 
    private TextView mOrientationData; 
    private SensorManager mSensMan; 
    private float mAzimuth; 
    private float[] mGravs = new float[3]; 
    private float[] mGeoMags = new float[3]; 
    private float[] mOrientation = new float[3]; 
    private float[] mRotationM = new float[9]; 
    private float[] mRemapedRotationM = new float[9]; 
    private boolean mFailed; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gameplay); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     mOrientationData = (TextView) findViewById(R.id.orientation_data); 

     mSensMan = (SensorManager) getSystemService(SENSOR_SERVICE); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mSensMan.registerListener(this, mSensMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_UI); 
     mSensMan.registerListener(this, mSensMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_UI); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensMan.unregisterListener(this); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
      return; 
     Log.d("united", "anything"); 
     switch (event.sensor.getType()) { 
      case Sensor.TYPE_MAGNETIC_FIELD: 
       //I NEVER GET TO THIS CODE ON MY GALAXY NEXUS 
       System.arraycopy(event.values, 0, mGravs, 0, 3); 
       Log.d("united", mGravs.toString()); 
       break; 
      case Sensor.TYPE_ACCELEROMETER: 
       // Here let's try another way: 
       for (int i=0;i<3;i++) mGeoMags[i] = event.values[i]; 
        break; 
       default: 
        return; 
     } 
     if (SensorManager.getRotationMatrix(mRotationM, null, mGravs, mGeoMags)){ 
      //Rotate to the camera's line of view (Y axis along the camera's axis) 
      //TODO: Find how to use android.opengl.Matrix to rotate to an arbitrary coordinate system. 
      SensorManager.remapCoordinateSystem(mRotationM, SensorManager.AXIS_X, 
        SensorManager.AXIS_Z, mRemapedRotationM); 
      SensorManager.getOrientation(mRemapedRotationM, mOrientation); 
      onSuccess(); 
     } else { 
      onFailure(); 
     } 
    } 

    void onSuccess(){ 
     if (mFailed) mFailed = false; 
     //  Convert the azimuth to degrees in 0.5 degree resolution. 
     mAzimuth = (float) Math.round((Math.toDegrees(mOrientation[0])) *2)/ 2; 
     //  Adjust the range: 0 < range <= 360 (from: -180 < range <= 180). 
     mAzimuth = (mAzimuth+360)%360; // alternative: mAzimuth = mAzimuth>=0 ? mAzimuth : mAzimuth+360; 
     mOrientationData.setText("Azimuth= " + mAzimuth); 
    } 
    void onFailure() { 
     if (!mFailed) { 
      mFailed = true; 
      mOrientationData.setText("didn't get rotation info"); 
     } 
    } 
} 
+0

Bạn có quản lý để giải quyết vấn đề này không? – Mikooos

+1

Tôi có cùng một vấn đề. –

+0

Chúng tôi có cùng một vấn đề trên Galaxy S3 và máy tính bảng Asus. Có ai đó sửa cái thứ khó chịu này không? – WindRider

Trả lời

3
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) return; 

Hủy bỏ dòng này. Cảm biến từ tính đang trả lại trạng thái chính xác này và mã của bạn đang loại bỏ các sự kiện này.

+0

Thx, nó đã giúp trên SE Xperia Mini X8 và Samsung Galaxy S1 (và có lẽ nhiều hơn nữa) – Hrk

+0

Giúp tôi cũng !!!!! – user2924714

Các vấn đề liên quan