Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Since OTA update to Marshmallow my gyroscope based app does not work anymore

I've upgraded my Nexus 5 to Marshmallow with OTA. Since the update simple sensor based activity does not work anymore. The following code do what it should to do on others devices (Galaxy S4 Lolipop, AVD, ...)

Does someone has experiment this too ? Do I miss something ?

Here is the 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;
        }
    }
}
like image 779
rouk1 Avatar asked Nov 10 '22 03:11

rouk1


1 Answers

Finally found this issue. Temporary solution is to use SENSOR_DELAY_GAME instead of SENSOR_DELAY_FASTEST.

like image 103
rouk1 Avatar answered Nov 14 '22 21:11

rouk1