Java 在壁纸服务中显示camera2预览
我需要在现场壁纸中显示相机预览。 我已经为androidJava 在壁纸服务中显示camera2预览,java,android,android-studio,camera,camera2,Java,Android,Android Studio,Camera,Camera2,我需要在现场壁纸中显示相机预览。 我已经为android0&&width0和高度>0和宽度>高度){ 肖像=假; } 摄像机参数; 如果(摄像机==null){ camera=getCameraInstance(); } 如果(照相机!=null){ parameters=camera.getParameters(); Camera.Size=parameters.getPictureSize(); size=parameters.getPreviewSize(); parameters.set
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(this, TransparentWallpaperService.class));
startActivity(intent);
透明网络文书服务
public class TransparentWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new GlowEngine();
}
private class GlowEngine extends Engine {
private final Handler handler = new Handler();
private final Runnable viewRunner = new Runnable() {
@Override
public void run() {
drawView();
}
};
private boolean visible = true;
private CameraView view;
public GlowEngine() {
super();
view = new CameraView(getBaseContext(), getSurfaceHolder());
handler.post(viewRunner);
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(viewRunner);
}
else {
handler.removeCallbacks(viewRunner);
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
this.visible = false;
handler.removeCallbacks(viewRunner);
}
private void drawView() {
view.surfaceChanged(getSurfaceHolder(), OPAQUE, view.getWidth(), view.getHeight());
handler.removeCallbacks(viewRunner);
if (visible) {
handler.postDelayed(viewRunner, 4000);
}
}
}
}
喀麦隆人阶级
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private Camera camera;
public CameraView(Context context) {
super(context);
camera = getCameraInstance();
}
public CameraView(Context context, SurfaceHolder holder) {
this(context);
this.holder = holder;
holder.addCallback(this);
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
if(camera == null) {
camera = getCameraInstance();
}
if(camera != null) {
// The Surface has been created, now tell the camera where to draw the preview.
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
}
catch (IOException e) {
Log.e("CameraView", "Error setting camera preview: " + e.getMessage());
}
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
boolean portrait = true;
if (width > 0 && height >0 && width < height){
portrait =true;
} else if (width > 0 && height >0 && width > height){
portrait = false;
}
Camera.Parameters parameters;
if (camera == null) {
camera = getCameraInstance();
}
if (camera != null){
parameters = camera.getParameters();
Camera.Size size = parameters.getPictureSize();
size = parameters.getPreviewSize();
parameters.setPreviewSize(size.width, size.height);
if (portrait) {
camera.setDisplayOrientation(90);
} else {
camera.setDisplayOrientation(180);
}
try {
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(camera != null) {
try {
camera.stopPreview();
camera.release();
}
catch (Exception e) {
Log.e("CameraView", "Error stopping camera preview: " + e.getMessage());
}
}
}
private Camera getCameraInstance() {
Context context = getContext();
Camera camera = null;
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
try {
camera = Camera.open();
}
catch (Exception e) {
Log.e("CameraView", "Error getting camera instance: " + e.getMessage());
}
}
else {
Log.i("CameraView", "No camera found!");
}
return camera;
}
}
公共类CameraView扩展了SurfaceView实现了SurfaceHolder.Callback{
私人土地持有人;
私人摄像机;
公共摄像师(背景){
超级(上下文);
camera=getCameraInstance();
}
公共摄像机视图(上下文、表面摄像机持有者){
这(上下文);
这个.holder=holder;
holder.addCallback(本);
if(Build.VERSION.SDK_INT 0&&height>0&&width您可以继续使用旧的API;即使在新设备上,它也能完全发挥功能
否则,您可以很容易地将TextureView替换为SurfaceView;不要从TextureView的SurfaceTexture创建曲面,而是在surfaceChanged中从SurfaceView的SurfaceHolder获取曲面。您可以继续使用旧API;即使在新设备上,它也能完全发挥功能
否则,您可以很容易地将TextureView替换为SurfaceView;不要从TextureView的SurfaceTexture创建曲面,而是在surfaceChanged中从SurfaceView的SurfaceHolder获取曲面。旧API在5.0版android 6.0设备上不起作用仍在工作旧API在5.0版android 6.0设备上不起作用仍在工作