Предварительный просмотр камеры на Android - странно на Samsung Galaxy S - PullRequest
5 голосов
/ 09 июля 2010

В своей деятельности я показываю предварительный просмотр камеры на SurfaceView. Он отлично работает на Nexus One и HTC Desire, но на Samsung Galaxy S я вижу странные линии, странные пропорции и все три раза. см. скриншот ниже.

Проблема, похоже, похожа на эту: предварительный просмотр камеры на android - странные строки на 1.5 версии sdk но ни один из комментариев там не помог. Я пытался поменять высоту, ширину для параметров камеры, но особой разницы не было.

(Примечание: моя деятельность всегда в горизонтальном режиме, исправлена. У меня это исправление в манифесте в качестве параметров screenOrientation, на случай, если это как-то важно).

Код моего SurfaceHolderCallback (соответствующий внутренний класс в моей деятельности):

class SurfaceHolderCallback implements SurfaceHolder.Callback {
    private static final int IMAGE_WIDTH = 512;
    private static final int IMAGE_HEIGHT = 384;
    private static final String ORIENTATION = "orientation";
    private static final String ROTATION = "rotation";
    private static final String PORTRAIT = "portrait";
    private static final String LANDSCAPE = "landscape";

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

        //Surface.setOrientation(Display.DEFAULT_DISPLAY,Surface.ROTATION_90);            
        Parameters p = camera.getParameters();
        p.setPictureSize(IMAGE_WIDTH, IMAGE_HEIGHT);
        p.set(ORIENTATION, PORTRAIT);
        p.set(ROTATION, 90);
        // p.setPreviewSize(640, 480);

        Camera.Size s = p.getSupportedPreviewSizes().get(0);
        Log.d(APP, "preview params " + s.width +"/"+ s.height);            
        p.setPreviewSize( s.width,s.height );

        p.setPictureFormat(PixelFormat.JPEG);
        p.set("flash-mode", "auto");
        camera.setParameters(p);

        try {
            camera.setPreviewDisplay(surfaceHolder);
        } catch (Throwable ignored) {
            Log.e(APP, "set preview error.", ignored);
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {

        if (isPreviewRunning) {
            camera.stopPreview();
        }
        try {
            camera.startPreview();
        } catch(Exception e) {
            Log.d(APP, "Cannot start preview", e);    
        }
        isPreviewRunning = true;
    }

    ...

alt text

Ответы [ 2 ]

6 голосов
/ 10 июля 2010

Я обнаружил, что у Samsung, похоже, проблемы с параметрами

p.set("orientation", "portrait");
p.set("rotation", 90);

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

2 голосов
/ 10 июля 2010

Я, вероятно, констатирую очевидное, но поскольку ваша программа работает как на Nexus, так и на Desire, ваш код, вероятно, в порядке.Galaxy - новый телефон - проблема, скорее всего, в его собственных драйверах, а не в вашем коде.Если это так, то это может быть что угодно: вам просто нужно подождать / надеяться на патч.

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