2010-10-16 45 views
2

我试图编写一些AR应用程序。现在我写了一些代码来显示相机预览,并从设备上的传感器(acceleromentr,compas,gps reciver)获取数据。使用CameraPreview时获取GPS数据的问题

当我在单独的应用程序中运行代码(如相机预览作为一个应用程序和获取gps数据作为第二个应用程序),一切正常。但是,当我尝试整合这两个模块 - GPS停止工作;它看起来像听众没有得到任何数据。你有没有类似的问题?

的代码看起来是这样的:

public void onResume() 
{ 
    super.onResume(); 

    mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
              1000, 0.0f, 
              mLocationListener); 
} 


public void onPause() 
{ 
    super.onPause(); 
    mLocationManager.removeUpdates(mLocationListener); 
} 


private LocationListener mLocationListener = new LocationListener() 
{ 

    public void onLocationChanged(Location pLocation) { 
     double lLatitude = pLocation.getLatitude(); 
     double lLongitude = pLocation.getLongitude(); 
     mGpsTextView.setText ("Longitude" + Double.toString(lLongitude) + " Latitude: " + Double.toString(lLatitude)); 
    } 

    public void onProviderDisabled(String pProvider) { 
     mGpsTextView.setText ("Provider disabled"); 
    } 

    public void onProviderEnabled(String pProvider) { 
     mGpsTextView.setText ("Provider enabled"); 
    } 

    public void onStatusChanged(String pProvider, int pStatus, Bundle pExtras) { 
     switch (pStatus) 
     { 
     case LocationProvider.OUT_OF_SERVICE: 
      mGpsTextView.setText("GPS out of service"); 
      break; 
     case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      mGpsTextView.setText("GPS temorarily unawalible"); 
      break; 
     case LocationProvider.AVAILABLE: 
      mGpsTextView.setText("GPS avalible"); 
      break; 
     default: 
      mGpsTextView.setText("EEE"); 
     } 

    } 

}; 

我试图注册在的onCreate /的onPause /注销监听器,但行为是一样的。

的cameraPreview代码看起来像:

私人SurfaceHolder.Callback mSurfaceHolderCallback =新SurfaceHolder.Callback() { 私人相机mCamera;

public void surfaceCreated (SurfaceHolder pSurfaceHolder) 
    { 
     stopAndReleaseCamera(); 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(pSurfaceHolder); 
     } 
     catch (Exception imLazy) { 
      stopAndReleaseCamera(); 
      imLazy.printStackTrace(); 
     } 
    } 

    public void surfaceChanged (SurfaceHolder pSurfaceHolder, int pFormat, int pWidth, int pHeight) 
    { 
     Parameters lCameraParams = mCamera.getParameters(); 
     lCameraParams.setPreviewSize (pWidth, pHeight); 
     mCamera.setParameters (lCameraParams); 
     mCamera.startPreview(); 
    } 

    public void surfaceDestroyed (SurfaceHolder pSurfaceHolder) 
    { 
     stopAndReleaseCamera(); 
    } 

    private void stopAndReleaseCamera() 
    { 
     if (mCamera != null) 
     { 
      try 
      { 
       mCamera.stopPreview(); 
       mCamera.release(); 
      } 
      catch (Exception imLazy) 
      { 
       //ignore 
       imLazy.printStackTrace(); 
      } 
      mCamera = null; 
     } 
    } 
}; 

,这是注册的onCreate:

SurfaceView lSurfaceView = (SurfaceView)findViewById(R.id.CameraSurface); 
    lSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    lSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    lSurfaceView.getHolder().addCallback (mSurfaceHolderCallback); 

R.id.CameraSurface在layout.xml定义为

SurfaceView android:id="@+id/CameraSurface" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 

任何想法有什么不好?

的代码是在三个不同的电话

+0

LocationListener在什么时候停止接收事件?它在某个时候是否再次开始接收事件? – 2010-10-23 19:40:52

回答

1

如果您需要稳定持续的位置更新流,则必须确保LocationListener不会被释放。当侦听器死亡时,它将被系统检测到(通过远程接口)LocationManager,如果没有其他LocationListeners正在侦听,则系统LocationManager将停止!其结果是GPS必须获得新的修补程序。正如亨利所说:一项服务将会诀窍。

如果您有物理电话,您可以通过运行GPS代码并旋转手机来检查行为。

1

你试过将您LocationListener的东西,在它运行在后台服务进行测试?也许Android需要更多的Camera Preview资源并停止您的LocationListener。