В моем действии я показываю предварительный просмотр камеры на surfaceView. Это работает превосходное над Nexus One и HTC Desire, но над Samsung Galaxy S я вижу странные строки, странные пропорции и все три раза. см. Снимок экрана ниже.
Проблема, кажется, подобна этому: предварительный просмотр камеры на андроиде - странные строки на 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;
}
...
Я обнаружил, что у Samsung проблемы с параметрами
p.set("orientation", "portrait");
p.set("rotation", 90);
После раскомментирования все выглядит нормально. Мне просто нужно потом повернуть изображение вручную.
Я, наверное, констатирую очевидное, но поскольку ваша программа работает как на Nexus, так и на Desire, ваш код, вероятно, в порядке. Galaxy - новый телефон - проблема, скорее всего, связана с ошибкой в его собственных драйверах, а не в вашем коде. Если это так, это может быть что угодно: вам просто нужно подождать / надеяться на патч.