Проблема с получением данных GPS при использовании CameraPreview - PullRequest
2 голосов
/ 16 октября 2010

Я пытался написать какое-то приложение 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 выглядит следующим образом:

private SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback () {private Camera 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 ]

1 голос
/ 24 октября 2010

Если вам нужен постоянный и непрерывный поток обновлений местоположений, вы должны убедиться, что LocationListener НЕ освобожден. Когда слушатель умирает, он будет обнаружен (через удаленный интерфейс) системой LocationManager, и если другие LocationListeners не слушает, система LocationManager остановится! В результате GPS должен получить новое исправление. Как упоминал Генри: сервис сделает свое дело.

Если у вас есть физический телефон, вы можете проверить его поведение, введя код GPS и повернув телефон.

1 голос
/ 22 октября 2010

Вы пытались переместить ваш материал LocationListener в службу, которая работает в фоновом режиме? Возможно, Android потребовалось больше ресурсов для предварительного просмотра камеры и остановил ваш LocationListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...