Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Android 显示使用中的相机表面_Android_Service_Camera_Surfaceview - Fatal编程技术网

Android 显示使用中的相机表面

Android 显示使用中的相机表面,android,service,camera,surfaceview,Android,Service,Camera,Surfaceview,我想创建一个应用程序,用相机预览每10秒拍摄一次照片。我通过一项活动来创造它,一切都很顺利。 现在我想知道,是否有任何方法可以在服务中拍照,并在拍照前显示相机预览,所有这些都在服务中进行 您可以使用OpenGL纹理从服务中显示相机预览 摄影机辅助对象: public class CameraHelper { private final static String TAG = "CameraHelper"; private static Camera sCamera; p

我想创建一个应用程序,用相机预览每10秒拍摄一次照片。我通过一项活动来创造它,一切都很顺利。
现在我想知道,是否有任何方法可以在服务中拍照,并在拍照前显示相机预览,所有这些都在服务中进行

您可以使用OpenGL纹理从服务中显示相机预览

摄影机辅助对象:

public class CameraHelper {
    private final static String TAG = "CameraHelper";

    private static Camera sCamera;
    private static Camera.Parameters sParameters;
    public synchronized static Camera getCameraInstance(){
        if (sCamera == null) {
            try {
                sCamera = Camera.open(); // attempt to get a Camera instance
            }
            catch (Exception e) {}
        }

        if (sCamera != null) {
            sParameters = sCamera.getParameters();
            getFormats();
        }
        return sCamera; // returns null if camera is unavailable
    }

    public static void getFormats() {
         List<Size> picSizes = sParameters.getSupportedPictureSizes();
         Size s = picSizes.get(1);
         sParameters.setPictureSize(s.width, s.height);
         picSizes = sParameters.getSupportedPreviewSizes();
         Size previewSize = picSizes.get(picSizes.size() - 1);
         sParameters.setPreviewSize(previewSize.width, previewSize.width);
         sParameters.setPreviewFormat(ImageFormat.JPEG);
    }

    public synchronized static void releaseCamera() {
        if (sCamera != null) {
            sCamera.stopPreview();
            sCamera.release();        // release the camera for other applications
            sCamera = null;
        }
    }
}
公共类摄像机帮助器{
私有最终静态字符串TAG=“CameraHelper”;
私人静态摄像机;
私人静态摄像机。参数参数分光计;
公共同步静态摄影机getCameraInstance(){
if(sCamera==null){
试一试{
sCamera=Camera.open();//尝试获取一个Camera实例
}
捕获(例外e){}
}
if(sCamera!=null){
sParameters=sCamera.getParameters();
getFormats();
}
return sCamera;//如果摄像机不可用,则返回null
}
公共静态void getFormats(){
List picsize=sParameters.getSupportedPictureSizes();
大小s=picsize.get(1);
sParameters.setPictureSize(s.宽度,s.高度);
picSizes=sParameters.getSupportedPreviewSizes();
Size previewSize=picSizes.get(picSizes.Size()-1);
sParameters.setPreviewSize(previewSize.width,previewSize.width);
sParameters.setPreviewFormat(ImageFormat.JPEG);
}
公共同步静态无效释放摄影机(){
if(sCamera!=null){
sCamera.stopPreview();
sCamera.release();//为其他应用程序释放相机
sCamera=null;
}
}
}
服务:

public class CameraServiceTexture extends Service {
    private final static String TAG = "CameraServiceTexture";
    private Camera mCamera;

    @Override public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override public int onStartCommand(Intent intent, int flags, int startId) {
        new PictureThread().start();
        return START_STICKY;
    }

    private class PictureThread extends Thread {
        SurfaceTexture texture;
        private byte[] callbackBuffer;
        public void run() {
            mCamera = CameraHelper.getCameraInstance();

            int textures[] = new int[1];
            GLES20.glGenTextures(1, textures, 0);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
            int width  = 4; // size of preview
            int height = 4;  // size of preview
            GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width,
                    height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);

            texture = new SurfaceTexture(textures[0]);
            texture.setDefaultBufferSize(4, 4);

            try {
                mCamera.setPreviewTexture(texture);
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            Size previewSize=mCamera.getParameters().getPreviewSize();
            int dataBufferSize=(int)(previewSize.height*previewSize.width*
                                   (ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0));
            callbackBuffer = new byte[dataBufferSize];

            mCamera.addCallbackBuffer(callbackBuffer);
            //mCamera.setPreviewCallback(previewCallback);
            mCamera.setPreviewCallbackWithBuffer(previewCallback);

            mCamera.startPreview();


            time = System.currentTimeMillis();
        }

        private int mMaxCount = 100;
        private int mCount = 0;
        private long time;

        private final Camera.PictureCallback jpegCallBack = new Camera.PictureCallback() {
            @Override public void onPictureTaken(byte[] data, Camera camera) {
                long currentTime = System.currentTimeMillis();
                Log.i(TAG, "onPictureTaken " + data.length + " " + (currentTime - time));
                time = currentTime;
                texture.updateTexImage();
                mCamera.startPreview();
                ++mCount;
                if (mCount < mMaxCount) {
                    mCamera.takePicture(null, null, jpegCallBack);
                }
            }
        };

        private final Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
            @Override public void onPreviewFrame(byte[] data, Camera camera) {
                long currentTime = System.currentTimeMillis();
                Log.i(TAG, "onPreviewFrame " + data.length + " " + (currentTime - time));
                time = currentTime;
                mCamera.addCallbackBuffer(callbackBuffer);
            }
        };

    }
}
公共类CameraServiceTexture扩展服务{
私有最终静态字符串TAG=“CameraServiceTexture”;
私人摄像机麦卡梅拉;
@重写公共IBinder onBind(意图arg0){
返回null;
}
@覆盖公共int onStartCommand(Intent Intent、int标志、int startId){
新建PictureThread().start();
返回开始时间;
}
私有类PictureThread扩展线程{
表面结构;
专用字节[]callbackBuffer;
公开募捐{
mCamera=CameraHelper.getCameraInstance();
int纹理[]=新int[1];
GLES20.glGenTextures(1,纹理,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,纹理[0]);
int width=4;//预览的大小
int height=4;//预览的大小
GLES20.glTexImage2D(GLES20.GL_纹理_2D,0,GLES20.GL_RGBA,宽度,
高度,0,GLES20.GL_RGBA,GLES20.GL_无符号字节,null);
GLES20.glTexParameteri(GLES20.GL_纹理_2D、GLES20.GL_纹理_包裹、GLES20.GL_夹紧至边缘);
GLES20.glTexParameteri(GLES20.GL_纹理2D、GLES20.GL_纹理包裹、GLES20.GL_夹紧至边缘);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,GLES20.GL_纹理_MAG_过滤器,GLES20.GL_线性);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,GLES20.GL_纹理_最小_过滤器,GLES20.GL_线性);
纹理=新的表面纹理(纹理[0]);
设置默认缓冲区大小(4,4);
试一试{
mCamera.setPreviewTexture(纹理);
}捕获(IOE1异常){
e1.printStackTrace();
}
大小previewSize=mCamera.getParameters().getPreviewSize();
int-dataBufferSize=(int)(previewSize.height*previewSize.width*
(ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0);
callbackBuffer=新字节[dataBufferSize];
添加callbackBuffer(callbackBuffer);
//mCamera.setPreviewCallback(previewCallback);
mCamera.setPreviewCallbackWithBuffer(previewCallback);
mCamera.startPreview();
时间=System.currentTimeMillis();
}
私有整数mMaxCount=100;
私有整数mCount=0;
私人时间长;
private final Camera.PictureCallback jpegCallBack=新建Camera.PictureCallback(){
@覆盖公共void onPictureTaken(字节[]数据,摄像头){
长currentTime=System.currentTimeMillis();
Log.i(标记“onPictureTaken”+data.length++(currentTime-time));
时间=当前时间;
texture.updateMaximage();
mCamera.startPreview();
++mCount;
如果(mCount
您可以使用OpenGL纹理显示服务中的相机预览

摄影机辅助对象:

public class CameraHelper {
    private final static String TAG = "CameraHelper";

    private static Camera sCamera;
    private static Camera.Parameters sParameters;
    public synchronized static Camera getCameraInstance(){
        if (sCamera == null) {
            try {
                sCamera = Camera.open(); // attempt to get a Camera instance
            }
            catch (Exception e) {}
        }

        if (sCamera != null) {
            sParameters = sCamera.getParameters();
            getFormats();
        }
        return sCamera; // returns null if camera is unavailable
    }

    public static void getFormats() {
         List<Size> picSizes = sParameters.getSupportedPictureSizes();
         Size s = picSizes.get(1);
         sParameters.setPictureSize(s.width, s.height);
         picSizes = sParameters.getSupportedPreviewSizes();
         Size previewSize = picSizes.get(picSizes.size() - 1);
         sParameters.setPreviewSize(previewSize.width, previewSize.width);
         sParameters.setPreviewFormat(ImageFormat.JPEG);
    }

    public synchronized static void releaseCamera() {
        if (sCamera != null) {
            sCamera.stopPreview();
            sCamera.release();        // release the camera for other applications
            sCamera = null;
        }
    }
}
公共类摄像机帮助器{
私有最终静态字符串TAG=“CameraHelper”;
私人静态摄像机;
私人静态摄像机。参数参数分光计;
公共同步静态摄影机getCameraInstance(){
if(sCamera==null){
试一试{
sCamera=Camera.open();//尝试获取一个Camera实例
}
捕获(例外e){}
}
if(sCamera!=null){
sParameters=sCamera.getParameters();
getFormats();
}
return sCamera;//如果摄像机不可用,则返回null
}
公共静态void getFormats(){
List picsize=sParameters.getSupportedPictureSizes();
s