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;
}
}
}
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. –
Die App stürzt nicht ab, die Funktion 'onSensorChanged' wird nie aufgerufen. – rouk1
Woher weißt du, dass 'onSensorChanged' nicht aufgerufen wird. https://code.google.com/p/android/issues/detail?id=3708 verwandt? –