2013-07-16 46 views
0

我想檢測,如果我的智能手機用戶左轉或右轉或轉身。Android檢測從手機轉向

這裏一個例子來解釋「右轉」:

用戶面對一個十字路口。現在我想檢測我的用戶是正確的路徑還是左邊的路徑,或者直接進入。

所以我用這個來獲得方位:

@Override 
public void onSensorChanged(SensorEvent event) { 

    switch (event.sensor.getType()) { 
    case Sensor.TYPE_ACCELEROMETER: 
     for (int i = 0; i < 3; i++) { 
      valuesAccelerometer[i] = event.values[i]; 
     } 
     break; 
    case Sensor.TYPE_MAGNETIC_FIELD: 
     for (int i = 0; i < 3; i++) { 
      valuesMagneticField[i] = event.values[i]; 
     } 
     break; 
    } 
    boolean success = SensorManager.getRotationMatrix(matrixR, matrixI, 
      valuesAccelerometer, valuesMagneticField); 

    if (success) { 
     SensorManager.getOrientation(matrixR, matrixValues); 
     Math.round(Math.toDegrees(Math.acos(matrixValues[0]))); 
     azimuth = (float) Math.round(Math.toDegrees(matrixValues[0])); 
     if (azimuth < 0.0f) { 
      azimuth += 360.0f; 
     } 
    } 

這工作得很好。但現在我不知道如何設置開始和我旋轉的終點......

+0

如果需要檢測的改變,你需要獲得和存儲感興趣的參數(即角度)的初始值並且將其與當前值進行比較。沒有關於你想要檢測的更多細節,我不能更具體。 「用戶向右轉」並沒有太多的定義。 – amoiseyev

+0

我添加一個例子來解釋它更好! – JavaNullPointer

+1

這不是一個很好的例子。多少學位構成「右轉」?是否應該在一定的時間範圍內,或者是否應該將一個緩慢而微妙的漂移轉化爲一個轉折?如果用戶將手機放在手中,會發生什麼?等等... – Geobits

回答

2
use this program. whenever you turn left or right and up and down, you will get horizontal and vertical notification like arrow image..and you will get that coordinates. 

package com.authorwjf; 

import android.annotation.SuppressLint; 
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.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 

@SuppressLint("NewApi") 
public class Main extends Activity implements SensorEventListener { 

private float mLastX, mLastY, mLastZ; 
private boolean mInitialized; 
private SensorManager mSensorManager; 
private Sensor mAccelerometer; 
private final float NOISE = (float) 2.0; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mInitialized = false; 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mSensorManager.registerListener(this, 
    mAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); 
} 

protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, 
mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 

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

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    // can be safely ignored for this demo 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    TextView tvX= (TextView)findViewById(R.id.x_axis); 
    TextView tvY= (TextView)findViewById(R.id.y_axis); 
    TextView tvZ= (TextView)findViewById(R.id.z_axis); 
    ImageView iv = (ImageView)findViewById(R.id.image); 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
    if (!mInitialized) { 
     mLastX = x; 
     mLastY = y; 
     mLastZ = z; 
     tvX.setText("0.0"); 
     tvY.setText("0.0"); 
     tvZ.setText("0.0"); 
     mInitialized = true; 
    } else { 
     float deltaX = Math.abs(mLastX - x); 
     float deltaY = Math.abs(mLastY - y); 
     float deltaZ = Math.abs(mLastZ - z); 
     if (deltaX < NOISE) deltaX = (float)0.0; 
     if (deltaY < NOISE) deltaY = (float)0.0; 
     if (deltaZ < NOISE) deltaZ = (float)0.0; 
     mLastX = x; 
     mLastY = y; 
     mLastZ = z; 
     tvX.setText(Float.toString(deltaX)); 
     tvY.setText(Float.toString(deltaY)); 
     tvZ.setText(Float.toString(deltaZ)); 
     iv.setVisibility(View.VISIBLE); 
     if (deltaX > deltaY) { 
      iv.setImageResource(R.drawable.horizontal); 
     } else if (deltaY > deltaX) { 
      iv.setImageResource(R.drawable.vertical); 
     } else { 
      iv.setVisibility(View.INVISIBLE); 
     } 
    } 
} 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<TextView 
    android:paddingTop="20dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="16sp" 
    android:textStyle="bold" 
    android:gravity="center" 
    android:text="Shaker Demo"/> 
<TableLayout 
    android:paddingTop="10dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:stretchColumns="*"> 
    <TableRow> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="14sp" 
      android:text="X-Axis" 
      android:gravity="center"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="14sp" 
      android:text="Y-Axis" 
      android:gravity="center"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="14sp" 
      android:text="Z-Axis" 
      android:gravity="center"/> 
    </TableRow> 
    <TableRow> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/x_axis" 
      android:gravity="center"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/y_axis" 
      android:gravity="center"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/z_axis" 
      android:gravity="center"/> 
    </TableRow> 
</TableLayout> 
<ImageView 
    android:paddingTop="10dip" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/image" 
    android:layout_gravity="center" 
    android:visibility="invisible"/> 
</LinearLayout>