Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在壁纸服务中显示camera2预览_Java_Android_Android Studio_Camera_Camera2 - Fatal编程技术网

Java 在壁纸服务中显示camera2预览

Java 在壁纸服务中显示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

我需要在现场壁纸中显示相机预览。 我已经为android 在谷歌的例子中,他们把它放在xml和TextureView中,但我不明白如何根据自己的需要改变它

无论如何,谢谢

谷歌的例子

下面是我的代码

启动壁纸

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&&width0和高度>0和宽度>高度){ 肖像=假; } 摄像机参数; 如果(摄像机==null){ camera=getCameraInstance(); } 如果(照相机!=null){ parameters=camera.getParameters(); Camera.Size=parameters.getPictureSize(); size=parameters.getPreviewSize(); parameters.setPreviewSize(size.width、size.height); 如果(肖像){ 摄像头。设置显示方向(90); }否则{ 摄像头。设置显示方向(180); } 试一试{ 设置参数(参数); 摄像头。设置预览显示(支架); camera.startPreview(); }捕获(IOE异常){ e、 printStackTrace(); } } } @凌驾 公共空间表面已覆盖(表面层表面层){ 如果(照相机!=null){ 试一试{ camera.stopPreview(); 相机。释放(); } 捕获(例外e){ Log.e(“CameraView”,“停止相机预览时出错:”+e.getMessage()); } } } 私人摄像机getCameraInstance(){ Context=getContext(); 摄像头=空; if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE\u摄像头)){ 试一试{ camera=camera.open(); } 捕获(例外e){ Log.e(“CameraView”,“获取相机实例时出错:”+e.getMessage()); } } 否则{ Log.i(“CameraView”,“未找到摄像头!”); } 返回摄像机; } }
您可以继续使用旧的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设备上不起作用仍在工作