Приложение вылетает на планшете Galaxy - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть проект Android, который отлично работает на моем DroidX, но не работает на планшете Galaxy.Я получаю сообщение о том, что тип камеры 1200x728 не поддерживается.Я нигде не устанавливаю разрешение камеры, и я полагал, что это просто захват настроек по умолчанию с устройства.Почему происходит сбой, когда я пытаюсь загрузить его на Galaxy Tab?

Из своей основной деятельности я загружаю свой класс камеры следующим образом:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // requesting to turn the title OFF
    //requestWindowFeature(Window.FEATURE_NO_TITLE);

    // making it full screen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    //Set Screen Orientation
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    try{

        //Create Intance of Camera
        camPreview = new CamLayer(this.getApplicationContext());

        //Create Instance of OpenGL
        glView = new GLLayer(this);

        //FrameLayOut for holding everything
        FrameLayout frame = new FrameLayout(this);
        // set as main view
        setContentView(frame);

        // add Camera to view 
        frame.addView(camPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        frame.addView(glView);


    } catch(Exception e){}
}

Тогда мой класс камеры выглядит так:

    package com.eliddell.AR;

    import android.content.Context;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.Parameters;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;

    public class CamLayer extends SurfaceView {
            Camera camera;
            SurfaceHolder previewHolder;

    public CamLayer(Context context)
    {
        super(context);
        previewHolder = this.getHolder();
        previewHolder.setType
        (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        previewHolder.addCallback(surfaceHolderListener);

    }

    SurfaceHolder.Callback surfaceHolderListener = new SurfaceHolder.Callback() {

        public void surfaceCreated(SurfaceHolder holder) {
            camera=Camera.open();
        try {
            camera.setPreviewDisplay(previewHolder);

        }
            catch (Throwable e){ }
        }
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
        {
            Parameters params = camera.getParameters();
            params.setPreviewSize(width, height);
            params.setPictureFormat(PixelFormat.JPEG);
            camera.setParameters(params);
            camera.startPreview();
        }
        public void surfaceDestroyed(SurfaceHolder arg0)
        {
            camera.stopPreview();
            camera.release();
        }

    };

    public void onResume() {
        camera.startPreview();

    }

    public void onPause() {
        // TODO Auto-generated method stub
        camera.stopPreview();
    }

}

1 Ответ

2 голосов
/ 21 февраля 2012

Я думаю, что должны быть некоторые проблемы с настройкой параметров предварительного просмотра.Попробуйте ниже.

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (isPreviewRunning) {
camera.stopPreview();
}
try{
Camera.Parameters p = camera.getParameters();
if(p!=null){
List<Size> sizes = p.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);  
p.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(p);

camera.setPreviewDisplay(holder);;

camera.startPreview();

}
} catch (IOException e) {
// TODO Auto-generated catch block


e.printStackTrace();
}

isPreviewRunning = true;
}

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
// TODO Auto-generated method stub
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null) return null;

Size optimalSize = null;
double minDiff = Double.MAX_VALUE;


int targetHeight = h;

// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}


// Cannot find the one match the aspect ratio, ignore the requirement

if (optimalSize == null) {
minDiff = Double.MAX_VALUE;

for (Size size : sizes) {

if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);

}
}
}

return optimalSize;

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {



if (isPreviewRunning) {
camera.stopPreview();
}
try{
Camera.Parameters p = camera.getParameters();
if(p!=null){
List<Size> sizes = p.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
p.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(p);

camera.setPreviewDisplay(holder);;
camera.startPreview();

}
} catch (IOException e) {
// TODO Auto-generated catch block


e.printStackTrace();
}

isPreviewRunning = true;
}

private Size getOptimalPreviewSize(List sizes, int w, int h) {
// TODO Auto-generated method stub
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null) return null;

Size optimalSize = null;
double minDiff = Double.MAX_VALUE;

int targetHeight = h;

// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}

// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;

}

Поместите этот код в свой SurfaceChanged ().getOptimalPreviewSize () используется для установки параметров предварительного просмотра в соответствии с разрешением устройства.

...