2014-04-16 18 views
1

因此,我有一個用Android Eclipse編寫的應用程序,該應用程序通過固定標記顯示地圖,然後使用旋轉矢量傳感器根據旋轉變化移動。當我在設備上運行它時,手機傾斜時屏幕不會移動。我嘗試了一切,甚至讓我的教授看着它。他在代碼中找不到問題。最後,我們在他的設備上運行它,它完美運行!我有一個Moto G,我想知道是否有人爲什麼這個代碼適用於其他Android設備,但不是我的。以下是該項目的代碼。Android應用程序中的旋轉矢量傳感器無法在我的Moto上工作G

package com.example.flymap_awc; 

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.Menu; 
import android.util.Log; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MainActivity extends Activity implements SensorEventListener { 
    static final LatLng HAMBURG = new LatLng(53.558, 9.927); 
    static final LatLng KIEL = new LatLng(53.551, 9.993); 
    private GoogleMap map; 

    private SensorManager mSensorManager; 

    private double oldx = 0, oldy=0, oldz = 0; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) 
     .getMap(); 
    Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) 
     .title("Hamburg")); 
    Marker kiel = map.addMarker(new MarkerOptions() 
     .position(KIEL) 
     .title("Kiel") 
     .snippet("Kiel is cool") 
     .icon(BitmapDescriptorFactory 
      .fromResource(R.drawable.ic_launcher))); 

    // Move the camera instantly to hamburg with a zoom of 15. 
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); 

    // Zoom in, animating the camera. 
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 

    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 

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


    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) 
     { 

      if(oldx==0 && oldy ==0 && oldz ==0){ 
      // if this is the first run (oldx/y/z=0, get the initial orientation 
       oldx = event.values[0]; 
       oldy = event.values[1]; 
       oldz =event.values[2]; 

       //set oldx to event.values[0], etc. 
      } 

      // get change in rotation amount store as dx,dy,dz 
      double dx = oldx - event.values[0]; 
      double dy = oldy - event.values[1]; 
      double dz = oldz - event.values[2]; 
      double dTotal = Math.abs(dx) + Math.abs(dy) + Math.abs(dz); 
      if (dTotal > 0.05) 
      { 
       double lat = map.getCameraPosition().target.latitude; 
       double lng = map.getCameraPosition().target.longitude; 

       lat +=dx; 
       lng -=dy; 

       Log.println(100,"100","lat, lng, dx, dy" + lat + lng+dx+dy); 

       LatLng loc = new LatLng(lat, lng); 
       map.moveCamera(CameraUpdateFactory.newLatLng(loc)); 

       oldx = event.values[0]; 
       oldy = event.values[1]; 
       oldz = event.values[2]; 

      } 

      //filter out noise where Math.abs(dx) + Math.abs(dy)+ Math.abs(dz) > 0.05 
      // get current lat lng 
      //that my map camera is point at (or targeting) 


      // add to the lat and lng based on dx dy 
      //may want to compensate for zoom inverse proportionally 

      //may have to do lng -=dy to move intuitively 
      //move camera using camerupdatefactory to the new LatLng(lat,lng) 

      // update old oldy oldz 

     } 
    } 







protected void onResume(){ 
     super.onResume(); 
     // register this class as a listener for the orientation sensor 
     mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), 
       SensorManager.SENSOR_DELAY_NORMAL); 

    } 
    protected void onPause(){ 
     super.onPause(); 
     //unregister listener 
     mSensorManager.unregisterListener(this); 

    } 
} 

這裏是清單代碼

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.flymap_awc" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="19" 
     android:targetSdkVersion="19" /> 

<uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 

    <uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
<!-- The following two permissions are not required to use 
    Google Maps Android API v2, but are recommended. --> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     > 

     <meta-data 
    android:name="com.google.android.gms.version" 
    android:value="@integer/google_play_services_version" /> 

     <activity 
      android:name="com.example.flymap_awc.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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


    <meta-data 
    android:name="com.google.android.maps.v2.API_KEY" 
    android:value="AIzaSyDC4pK6_RmiSsDoWFAEmTUO2DRynTR0lik"/> 
    </application> 

</manifest> 

回答

3

ROTATION_VECTOR需要陀螺儀的工作,這就是原因。

底層基礎傳感器(S):加速度計,陀螺儀和磁強計

我的一個應用程序的停止是由於太工作,在摩托G.

+0

我不確定;我有一個沒有陀螺儀的京瓷Hydro邊緣,但有一個旋轉矢量傳感器。 – ethanwu10

0

我剛剛有了一個快速瀏覽在你的代碼上。我認爲問題在於你的代碼假設傳感器存在併成功註冊。在我有限的經驗中,由於設備中不存在或者存在故障,傳感器可能不可用。

嘗試做以下檢查,看看你會得到什麼:

  • 確保mSensorManager.registerListener回報true
  • 確保mSensorManager.getDefaultSensor不返回null
  • 確保onSensorChanged被調用。您可以在其中放置一個斷點或添加一行來編寫日誌消息。
相關問題