Question

J'essaie d'obtenir l'angle incliné du téléphone, et j'ai cette activité qui fonctionne parfaitement sur mon LG Optimus S avec 2.3, mais sur mon stock Verizon Galaxy Nexus exécutant ICS 4.0.2 L'événement TYPE_MAGNETIC_FIELD ne se déclenche jamais.

Étant donné que l'événement TYPE_MAGNETIC_FIELD ne se déclenche jamais, je n'obtiens pas le tableau Mgravs nécessaire pour passer dans le sensorManager.getRotationMatrix. Je ne peux donc pas dire l'angle du téléphone. Comme je l'ai mentionné, ce code fonctionne très bien sur mon autre appareil et je peux voir l'angle d'inclinaison du téléphone sans problème.

Quelque chose de savoir pourquoi je n'obtiendrais pas cet événement avec mon Nexus Galaxy? Y a-t-il eu des modifications du SDK qui empêcheraient cela de fonctionner?

Voici mon activité:

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"); 
        } 
    }
}
Était-ce utile?

La solution

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

Supprimer cette ligne. Le capteur magnétique renvoie ce statut de précision et votre code jette ces événements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top