2015-10-17 9 views
5

Ich habe mein Nexus 5 auf Marshmallow mit OTA aufgerüstet. Seit dem Update funktioniert die einfache sensorbasierte Aktivität nicht mehr. Der folgende Code tut, was es auf anderen Geräten tun sollte (Galaxy S4 Lolipop, AVD, ...)Seit OTA Update auf Marshmallow funktioniert meine Gyroscope-basierte App nicht mehr

Hat jemand das auch experimentieren? Vermisse ich etwas?

Hier ist der Code:

build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     applicationId "fr.rouk1.test" 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    package="fr.rouk1" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-feature 
     android:name="android.hardware.sensor.gyroscope" 
     android:required="true"/> 
    <uses-feature 
     android:name="android.hardware.sensor.accelerometer" 
     android:required="true"/> 
    <uses-feature 
     android:name="android.hardware.sensor.compass" 
     android:required="true"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

MainActivity.java

package fr.rouk1; 

import android.app.Activity; 
import android.content.Context; 
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 MainActivity extends Activity implements SensorEventListener { 

    private TextView mText; 

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

     mText = (TextView) findViewById(R.id.text); 

     initSensor(); 
    } 

    private void initSensor() { 

     SensorManager sm = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE); 

     if (sm.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) == null) { 
      sm.registerListener(this, 
        sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
        SensorManager.SENSOR_DELAY_NORMAL); 

      sm.registerListener(this, 
        sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
        SensorManager.SENSOR_DELAY_NORMAL); 

      sm.registerListener(this, 
        sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 
        SensorManager.SENSOR_DELAY_FASTEST); 
     } else { 
      sm.registerListener(this, 
        sm.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), 
        SensorManager.SENSOR_DELAY_FASTEST); 
     } 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // this is never called 

     String s = ""; 
     for (int i = 0; i < event.values.length; i++) { 
      s = s.concat(String.format("%.4f, ", event.values[i])); 
     } 

     mText.setText(s); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     switch (accuracy) { 

      case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: 
       Log.d("rouk1", "SENSOR_STATUS_ACCURACY_HIGH"); 
       break; 

      case SensorManager.SENSOR_STATUS_ACCURACY_LOW: 
       Log.d("rouk1", "SENSOR_STATUS_ACCURACY_LOW"); 
       break; 

      case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM: 
       Log.d("rouk1", "SENSOR_STATUS_ACCURACY_MEDIUM"); 
       break; 

      case SensorManager.SENSOR_STATUS_NO_CONTACT: 
       Log.d("rouk1", "SENSOR_STATUS_NO_CONTACT"); 
       break; 

      case SensorManager.SENSOR_STATUS_UNRELIABLE: 
       Log.d("rouk1", "SENSOR_STATUS_UNRELIABLE"); 
       break; 
     } 
    } 
} 
+0

Wenn eine App abstürzt, können Sie logcat aus Absturzgründen überprüfen. prächtig gibt es einen Hinweis darauf, warum es abgestürzt ist. Durch das Freigeben des Logcat kann das Problem besser verstanden werden. einen crashenden Code zu betrachten ist nicht so nützlich, ohne zu wissen, warum er abgestürzt ist. –

+1

Die App stürzt nicht ab, die Funktion 'onSensorChanged' wird nie aufgerufen. – rouk1

+0

Woher weißt du, dass 'onSensorChanged' nicht aufgerufen wird. https://code.google.com/p/android/issues/detail?id=3708 verwandt? –

Antwort

1

Schließlich gefunden issue. Temporäre Lösung ist SENSOR_DELAY_GAME anstelle von SENSOR_DELAY_FASTEST zu verwenden.