Более или менее следует вашему коду с небольшими изменениями.
import java.io.IOException;
import android.hardware.Camera;
import android.view.SurfaceHolder;
public class GenericaCamera implements SurfaceHolder.Callback {
private Camera cameraDevice = null;
private SurfaceHolder cameraSurfaceHolder = null;
// MODIFIED FROM ORIGINAL SEE UPDATE AT BOTTOM
public GenericaCamera(SurfaceHolder holder)
{
cameraSurfaceHolder = holder;
cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
cameraSurfaceHolder.addCallback(this);
}
// Required camera surface holder interface Callback's
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Camera.Parameters params = cameraDevice.getParameters();
Camera.Size size = getBestPreviewSize(params,w,h);
if (size != null)
params.setPreviewSize(size.width, size.height);
cameraDevice.startPreview();
}
// When the surface is ready then we can build the camera and attach
// the camera preview output to the UI holder
public void surfaceCreated(SurfaceHolder holder)
{
try {
cameraDevice = Camera.open();
cameraDevice.setPreviewDisplay(cameraSurfaceHolder);
} catch (IOException e) { }
}
// Stop the camera preview and dispose of the camera object
public void surfaceDestroyed(SurfaceHolder holder)
{
if (null == cameraDevice)
return;
cameraDevice.stopPreview();
cameraDevice.release();
cameraDevice = null;
}
public Camera.Size getBestPreviewSize(Camera.Parameters parameters, int w, int h)
{
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes())
{
if (size.width <= w && size.height <= h)
{
if (null == result)
result = size;
else
{
int resultDelta = w - result.width + h - result.height;
int newDelta = w - size.width + h - size.height;
if (newDelta < resultDelta)
result = size;
}
}
}
return result;
}
}
Обновление
Пошел в код обоев иразобрался, все еще проблемы, но, по крайней мере, я заставил его работать в основном, порядок важности из-за настройки push-буферов
Проблемы
Не в ландшафтном режиме, это приводит к предварительному просмотру искаженного изображения, известная проблема с камерой, которая еще не пыталась зафиксировать пейзаж
В режиме предварительного просмотра, если вы нажмете клавишу возврата, все будет уничтожено должным образом (камера отпущена)но если вы устанавливаете обои, класс не вызывает метод onDestroy, так что это означает, что вы не можете получить камеру, потому что экземпляр предварительного просмотра класса не выпустил ее
Это такжеотображается как изображение экрана блокировки, не знаю, как его переопределить, возможно, получайте и отвечайте через намерения и выключайте его, когда находитесь на экране защиты / блокировки
Не обработано vСобытие isibility, поэтому другие классы камер не будут работать, потенциальная ненужная разрядка батареи и т. д.
В любом случае, со всем вышеперечисленным изменениями необходимо выполнить следующие действия, чтобы это хотя бы начало работать
В классе движка создайте камеру из вышеупомянутого класса в onCreate, любое позднее, и проблемы возникают из-за настройки push-буферов, и хотя это не рекомендуется в более поздних 2.3+, это все еще требуется в более старых версиях.На самом деле это еще не проверено выше 2.2.
@Override
public void onCreate(SurfaceHolder holder) {
Log.d("CameraWallpaper","onCreate(SurfaceHolder holder)");
if (null == GC)
GC = new GenericaCamera(holder);
super.onCreate(holder);
}
Затем в классе GenericCamera перейдите к следующему шаблону конструктора.4 Сообщите сообществу!
Обновление 2
Кажется, что Android 3+ ломает это, не знаю почему, поскольку исходный код для этих платформ все еще закрыт.
Итак, окончательноОтвет до 2.3 - выше работает, а на 3+ - нет.