Приложение вылетает на планшете Galaxy

У меня есть проект для 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();
    }

}


person erik    schedule 19.02.2012    source источник


Ответы (1)


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

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() используется для установки параметров предварительного просмотра в соответствии с разрешением устройства.

person Dhruvisha    schedule 21.02.2012
comment
кажется, что много кода только для того, чтобы получить встроенную камеру устройства ... но спасибо - person erik; 21.02.2012
comment
если это так, вам нужно установить разрешение на использование камеры в androidmanifest.xml - person Dhruvisha; 22.02.2012
comment
мое разрешение установлено в моем манифесте .. это само собой разумеется .. я полагаю, что это приведет к сбою на любом устройстве, если я не исправлю? - person erik; 22.02.2012
comment
Поскольку ваш код хорошо работает на DroidX, но не на Galaxy Tab, так что определенно проблема с параметрами предварительного просмотра. Вы должны попробовать мой код для установки параметров. Это поможет вам. - person Dhruvisha; 23.02.2012
comment
мне пришлось немного отложить это, но, наконец, я возвращаюсь к этому. Я пытался использовать ваш код, но, кажется, везде есть всевозможные ошибки, в основном вокруг переменных w и h, на которые вы ссылаетесь.. Я могу не говорите, что ваш код плохой, так как он не отформатирован, как код выше.. не могли бы вы перепроверить и очистить код выше? - person erik; 25.03.2012
comment
в конце концов я просто удалил строку из моего исходного кода при изменении на поверхности, //params.setPreviewSize(width, height); - person erik; 25.03.2012
comment
Пожалуйста, обратитесь по этой ссылке: stackoverflow.com/questions/9197331/ - person Dhruvisha; 25.03.2012