2014-01-07 2 views
0


В настоящее время я пытаюсь реализовать Scrollview чего я хочу, включенный ImageView прокручивать через RotationVectorSensor и SensorEventListener.
Android - Получение MotionSensor терпит неудачу (NullPointer)

Это мой код до сих пор:

import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.HorizontalScrollView; 
import android.widget.Toast; 


public class MainActivity extends Activity implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor sensor; 
private HorizontalScrollView scrollView; 

private String TAG = MainActivity.class.getSimpleName(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 

    if (sensor != null) { 
     sensorManager.registerListener(this, sensor, 
       SensorManager.SENSOR_DELAY_NORMAL); 
     Log.d(TAG, "Sensor found."); 
    } else { 
     Log.e(TAG, "Sensor NOT found."); 
     Toast.makeText(this, "ROTATION_VECTOR Sensor not found", 
       Toast.LENGTH_LONG).show(); 
     finish(); 
    } 
    scrollView = (HorizontalScrollView) findViewById(R.id.panoramaScrollView); 
    Log.d(TAG, "Panorama Scroll View found."); 
} 

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

} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    Toast.makeText(this, "rotating Yippi!", Toast.LENGTH_LONG).show(); 
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     final float angle = event.values[2]; 
     scrollView.post(new Runnable() { 
      public void run() { 
       if (scrollView != null) { 
        scrollView.scrollTo((int)angle, scrollView.getBottom()); 
        Log.d(TAG, "scrollTo executed."); 
       } 
      } 
     }); 
    } 

} 


@Override 
public void onResume() { 
    super.onResume(); 
    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); 
    Log.d(TAG, "SensorListener registered"); 
} 


@Override 
public void onPause() { 
    super.onPause(); 
    if (sensor != null) { 
     sensorManager.unregisterListener(this); 
     Log.d(TAG, "SensorListener unregistered"); 
    } 
} 

} 

NullPointer происходит непосредственно после того, как датчик инициализируется:

sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 

Therefor в приложение выходит и печатает: "Датчик не найден" .. .

Есть ли что-нибудь, что я забыл?
Спасибо заранее!

+1

Вы проверили, имеет ли ваше устройство этот конкретный датчик? Похоже, это не так. –

+0

Я еще об этом не думал, но является ли RotationSensor не просто комбинацией MagneticFieldSensor и Accelerometer? –

+0

Возможно ли, что в манифесте отсутствуют определенные разрешения? –

ответ

0

Я нашел решение. В манифесте андроида отсутствовали следующие строки:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> 
+0

Я думаю, что он может использовать компас также для определения вектора вращения, поэтому ему нужны эти разрешения. – tolgap

Смежные вопросы