使用CameraPreview时获取GPS数据的问题

时间:2010-10-16 17:41:45

标签: android

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

当我在单独的应用程序中运行代码时(比如将摄像头预览作为一个应用程序和将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 = new 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"

任何想法有什么不对?

代码在三部不同的手机上进行了测试

2 个答案:

答案 0 :(得分:1)

您是否尝试在后台运行的服务中移动LocationListener资料?也许Android需要更多的Camera Preview资源并停止了您的LocationListener。

答案 1 :(得分:1)

如果您需要稳定且连续的位置更新流,则必须确保未取消分配LocationListener。当监听器死亡时,系统将检测(通过远程接口)LocationManager,如果没有其他LocationListeners正在侦听,系统LocationManager将停止!结果是GPS必须获得新的修复。正如亨利提到的:一项服务将起到作用。

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