它或多或少遵循您的代码,但做了一些更改。
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;
}
}
Update
进入壁纸代码并找出答案,仍然存在问题,但至少我让它基本上可以工作,由于推送缓冲区设置,时间顺序很重要
问题
不在横向模式下,这会导致预览图像失真,相机的已知问题尚未尝试锁定横向模式
在预览中,如果您使用后退键,所有内容都会被正确销毁(相机已释放),但如果您设置壁纸,该类不会调用 onDestroy 方法,因此这意味着您无法获取相机,因为该类的预览实例尚未释放它
它还显示为锁定屏幕图像,不知道如何覆盖它,可能通过意图接收和响应,并在您处于防护/锁定屏幕时将其关闭
尚未处理可见性事件,因此其他相机类别将无法工作,可能会造成不必要的电池消耗等。
无论如何,修改如下,以使其至少开始工作
在引擎类中,在 onCreate 中从上述类创建相机,之后由于推送缓冲区设置而会出现问题,尽管这在 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 类中更改为以下构造函数模式
public GenericaCamera(SurfaceHolder holder)
{
cameraSurfaceHolder = holder;
cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
cameraSurfaceHolder.addCallback(this);
}
基本上就是这样,至少这应该可以帮助您开始,如果您找到 1-4 的任何解决方案,请让社区知道!
Update 2
Android 3+ 似乎打破了这一点,不知道为什么,因为这些平台的源代码仍然关闭。
所以对于 2.3 以上的最终答案是上面的方法有效,但在 3+ 上则不行。