在壁纸服务中显示相机2预览



我需要在动态壁纸中显示相机预览。我已经为安卓<M版本制作了。但是无法理解它如何使用新>

在谷歌示例中,他们将其放在xml和TextureView中,但是我如何根据自己的需要进行更改,我无法理解。

无论如何,谢谢!

谷歌示例https://github.com/googlesamples/android-Camera2Basic

在我的代码下面。

开始壁纸

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;
}
}

您可以继续使用旧的API;即使在新设备上,它的功能也很齐全。

否则,您可以轻松地将TextureView替换为SurfaceView;而不是从TextureView的SurfaceTexture创建Surface,而是从surfaceChanged中的SurfaceView的SurfaceHolder获取Surface。

最新更新