0

How can Take picture from front camera in service without showing camera on screen. I have service class

public class PhotoTakingService extends Service {
    //Camera variables
    //a surface holder
    private SurfaceHolder sHolder;
    //a variable to control the camera
    private Camera mCamera;
    //the camera parameters
    private Parameters parameters;

    boolean mPreviewRunning = false;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public void onStart(Intent intent,int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent,startId);



        mCamera = Camera.open();
        SurfaceView sv = new SurfaceView(getBaseContext());


        try {

            Camera.Parameters p = mCamera.getParameters();
            mCamera.setParameters(p);
            mCamera.startPreview();

            mCamera.takePicture(null,null,mPictureCallback);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        //Get a surface
        sHolder = sv.getHolder();
        //tells Android that this surface will have its data constantly replaced
        sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData,Camera c) {
            Log.e("Callback TAG","Here in jpeg Callback");

            if (imageData != null) {
                FileOutputStream outputStream = null;
                try {
                    outputStream = new FileOutputStream("/sdcard/car_final/Image.jpg");
                    outputStream.write(imageData);

                    // Removed the finish call you had here
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (outputStream != null) try {
                        outputStream.close();
                    } catch (IOException ex) {
                        // TODO Auto-generated catch block
                        ex.printStackTrace();
                    }
                }

            }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

and main activity. I want to call from main activity.

 public class MainActivity extends Activity implements SurfaceHolder.Callback {



 private static final String TAG = MainActivity.class.getSimpleName();

    public static SurfaceView mSurfaceView;
    public static SurfaceHolder mSurfaceHolder;
    public static Camera mCamera;
    public static boolean mPreviewRunning;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        Button btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this, PhotoTakingService.class);
                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startService(intent);

            }
        });

      /*  Button btnStop = (Button) findViewById(R.id.StopService);
        btnStop.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                stopService(new Intent(CameraRecorder.this, RecorderService.class));
            }
        });*/
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
}
W4R10CK
  • 5,502
  • 2
  • 19
  • 30

1 Answers1

0

When you are in background thread such as service use SurfaceTexture instead of SurfaceHolder. If you are looking for implementation here is a opensource app where I have implemented background video stream and UI video stream both.

Md Samiul Alim Sakib
  • 1,114
  • 12
  • 15