2013-05-16 67 views
0

我建立我的第一個應用程序,我希望當按下按鈕,手機不動,讓我的手機的方向。用戶可以看到後視攝像頭的觀點,然後按下按鈕即可獲取角度。調用getOrientation()導致崩潰

當我在onSensorChanged(我用作示例代碼:finding orientation using getRotationMatrix() and getOrientation())中使用代碼時,代碼似乎可以正常工作,但是在'onClick'中使用它時會崩潰。

我想其他的計算(我做了間距全局變量)的螺距值。 這裏是我的onClick代碼:

public void onClick(View arg0) 
{ 
    camera.takePicture(myShutterCallback, 
      myPictureCallback_RAW, myPictureCallback_JPG); 

    switch (event.sensor.getType()) { 
    case Sensor.TYPE_ACCELEROMETER: 
     gravity = event.values.clone(); 
     break; 
    case Sensor.TYPE_MAGNETIC_FIELD: 
     magnet = event.values.clone(); 
     break; 
    } 


    if(gravity!=null && magnet!=null) { 
     rotMatrix = SensorManager.getRotationMatrix(inR, I, gravity, magnet); 

     SensorManager.remapCoordinateSystem(inR, 
       SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); 
     SensorManager.getOrientation(outR, orientVals); 

     float azimuth = orientVals[0]*rad2deg; 
     pitch = orientVals[1]*rad2deg; 
     float roll = orientVals[2]*rad2deg; 

     TextView rezDisplay = (TextView) findViewById(R.id.finalRezult); 
     rezDisplay.setText("Atstumas iki objekto yra:" + pitch + "m"); 
    } 
} 

任何建議,鏈接,例子或TUTS將是巨大的。

編輯:

我添加了整個班級代碼。

import java.io.IOException; 

import com.mindjack.measuremydistance.SensorEvnt.mSensorEventListener; 

import android.app.Activity; 
//import android.content.Intent; 
import android.content.Context; 
import android.content.pm.ActivityInfo; 
//import android.graphics.Bitmap; 
//import android.graphics.BitmapFactory; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorManager; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.TextView; 

public class AndroidCamera extends Activity implements SurfaceHolder.Callback 
{ 
    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    boolean previewing = false; 
    LayoutInflater controlInflater = null; 
    TextView display, display1; 
    float[] magnet = new float[3]; 
    float[] gravity = new float[3]; 
    SensorEvent event; 
    boolean rotMatrix; 
    float[] outR = new float[16]; 
    float[] inR = new float[16]; 
    float[] I = new float[16]; 
    float[] orientVals = new float[3]; 
    final float pi = (float) Math.PI; 
    final float rad2deg = 180/pi; 
    float pitch; 
    SensorManager mSensorManager; 


    /** Called when the activity is first created. */ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.andcam); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     surfaceView = (SurfaceView)findViewById(R.id.surfaceview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     controlInflater = LayoutInflater.from(getBaseContext()); 
     View viewControl = controlInflater.inflate(R.layout.control, null); 
     LayoutParams layoutParamsControl 
      = new LayoutParams(LayoutParams.FILL_PARENT, 
     LayoutParams.FILL_PARENT); 
     this.addContentView(viewControl, layoutParamsControl); 

     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

     Button buttonTakePicture = (Button)findViewById(R.id.takepicture); 
     buttonTakePicture.setOnClickListener(new Button.OnClickListener() { 
      // TODO Auto-generated method stub 
      @Override 
      public void onClick(View arg0) { 
       camera.takePicture(myShutterCallback, 
        myPictureCallback_RAW, myPictureCallback_JPG); 

       switch (event.sensor.getType()){ 
       case Sensor.TYPE_ACCELEROMETER: 
        gravity = event.values.clone(); 
        break; 
       case Sensor.TYPE_MAGNETIC_FIELD: 
        magnet = event.values.clone(); 
        break; 
       } 

       //if(gravity!=null && magnet!=null){ 
        rotMatrix = SensorManager.getRotationMatrix(inR, 
         I, gravity, magnet); 
        SensorManager.remapCoordinateSystem(inR, 
         SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); 
        SensorManager.getOrientation(outR, orientVals); 

        float azimuth = orientVals[0]*rad2deg; 
        pitch = orientVals[1]*rad2deg; 
        float roll = orientVals[2]*rad2deg; 
       // } 

       TextView rezDisplay = (TextView) findViewById(R.id.finalRezult); 
       rezDisplay.setText("Atstumas iki objekto yra:" + pitch + "m"); 
      } 
     }); 
    } 

    ShutterCallback myShutterCallback = new ShutterCallback() { 
     @Override 
     public void onShutter() { 
      // TODO Auto-generated method stub 
     } 
    }; 

    PictureCallback myPictureCallback_RAW = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) { 
      // TODO Auto-generated method stub 
     } 
    }; 

    PictureCallback myPictureCallback_JPG = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) { 
      // TODO Auto-generated method stub 
      //Bitmap bitmapPicture 
      //= BitmapFactory.decodeByteArray(arg0, 0, arg0.length); 
     } 
    }; 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) 
    { 
     // TODO Auto-generated method stub 
     if(previewing) { 
      camera.stopPreview(); 
      previewing = false; 
     } 

     if (camera != null){ 
      try { 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 
       previewing = true; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     camera = Camera.open(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     previewing = false; 
    } 
} 

由於我是新的可能會有一些愚蠢的錯誤,但我無法弄清楚這種情況。 LogCat說它在第84行崩潰了。我試圖從第84行取出零件直到91,然後它不會崩潰,但是在音高值上也給出了0。

+2

發佈logcat – Blackbelt

+0

是的,因爲你是android dev的新手,logcat會向你顯示崩潰和錯誤報告的堆棧跟蹤。 Eclipse應該有它或做「adb logcat」。 – spartygw

+0

我設法發現那部分崩潰是: 'switch(event.sensor.getType()){ case Sensor.TYPE_ACCELEROMETER: gravity = event.values.clone(); 休息; case Sensor.TYPE_MAGNETIC_FIELD: magnet = event.values.clone(); 休息; }」 也許任何想法,爲什麼或如何讓不同的方式的價值觀? –

回答

0

您的event字段永遠不會初始化,您必須獲得NullPointerException,同時嘗試在您的switch語句中訪問它。

您應該執行SensorEventListener並在onSensorChanged()中獲得事件,否則您將永遠不會擁有這些值。

但是,請勿直接存儲SensorEvent,因爲該對象被SensorManager重複使用。您必須在onSensorChanged()中將傳感器的值複製到其他字段(如switch語句中的變量)中。然後您可以在onClick()中使用這些字段。

+0

我添加了整個班級。 –

+0

仍然沒有logcat ...(我們需要知道確切的異常,這裏我認爲它; ight是一個'NullPointerException',對吧?)但我會用我現在得到的東西編輯我的答案。 – Joffrey

+0

我再次編輯,使其更易於閱讀,因爲它已被接受,很高興我幫助。 – Joffrey

0

我增加了onSensorChange並實時計算值,所以現在一切都準確無誤。感謝您的幫助。