2015-10-17 17 views
5

Tôi đã nâng cấp Nexus 5 lên Marshmallow với OTA. Vì hoạt động dựa trên cảm biến đơn giản cập nhật không hoạt động nữa. Đoạn mã sau làm những gì cần làm trên các thiết bị khác (Galaxy S4 Lolipop, AVD, ...)Kể từ khi cập nhật OTA lên Marshmallow ứng dụng dựa trên con quay hồi chuyển của tôi không còn hoạt động nữa

Có ai đó đã thử nghiệm điều này không? Tôi có nhớ điều gì không?

Đây là mã:

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

Khi một ứng dụng gặp sự cố, bạn có thể kiểm tra logcat vì lý do tai nạn. probebly nó sẽ cung cấp cho bạn gợi ý về lý do tại sao nó bị rơi. chia sẻ logcat có thể giúp hiểu vấn đề. nhìn vào một mã rơi không phải là hữu ích mà không biết tại sao nó bị rơi. –

+1

Ứng dụng không bị lỗi, chức năng 'onSensorChanged' không bao giờ được gọi. – rouk1

+0

làm thế nào để bạn biết 'onSensorChanged' không được gọi. https://code.google.com/p/android/issues/detail?id=3708 có liên quan? –

Trả lời

1

Cuối cùng tìm thấy điều này issue. Giải pháp tạm thời là sử dụng SENSOR_DELAY_GAME thay vì SENSOR_DELAY_FASTEST.

Các vấn đề liên quan