androidmatrixorientationandroid-sensorscoordinate

android: why getrotationmatrix return false?


I want to get the orientation of my phone and I have using this code that I find lot of people using it. this is the code

    public void onSensorChanged(SensorEvent event) {
    //if the data sensor is unreliabel
    if(event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    //gets the value
    switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        gravity = event.values.clone();
        break;

    case Sensor.TYPE_MAGNETIC_FIELD:
        geomag = event.values.clone();
        break;
    }
    getOrientation();
}

private void getOrientation(){

    //if gravity n geomag have value, find the rotation matrix
            if(gravity != null && geomag != null){

                //check the rotation matrix found
                boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);

                if(success){
                    SensorManager.getOrientation(inR, orientVals);
                    azimuth = Math.toDegrees(orientVals[0]);

                    TextView azi = (TextView) findViewById(R.id.textAzi);
                    azi.setText("azi : " + azimuth);

                }
                TextView cek = (TextView) findViewById(R.id.cek);
                cek.setText("rotation: "+success);
            }   

but why the getrotationmatrix always return to false? where is the problem?


Solution

  • I've try again and get the solution but I change the code to become like below

        public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            for(int i=0; i<3; i++){
                accelValues[i] =  event.values[i];
            }
            if(compassValues[0] != 0)
                ready = true;
    
            break;
    
        case Sensor.TYPE_MAGNETIC_FIELD:
            for(int i=0; i<3; i++){
                compassValues[i] = event.values[i];
            }
            if(accelValues[2] != 0)
                ready = true;
    
            break;
        }
    
        if(!ready)
            return;
    
        boolean cek = SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues);
    
        if(cek){
            SensorManager.getOrientation(inR, prefValues);
            mInclination = SensorManager.getInclination(inclineMatrix);
    
            //display every 30th values
            if(counter++ % 30 == 0){
                //do your code, what you want to do to the result
                counter = 1;
            }
        }
    

    and everything work well