Android: Take Photo Without User Interface

前端 未结 2 1445
深忆病人
深忆病人 2020-12-16 20:21

I am interested in writing an app for android where after a certain event in the app a photo is automatically taken using the camera on the android.

Things I need:<

2条回答
  •  一生所求
    2020-12-16 20:36

    This is service to capture photo in background, hope it helps.:

    public class CapPhoto extends Service
    {
        private SurfaceHolder sHolder;    
        private Camera mCamera;
        private Parameters parameters;
    
    
      @Override
        public void onCreate()
        {
          super.onCreate();
          Log.d("CAM", "start");
    
          if (android.os.Build.VERSION.SDK_INT > 9) {
              StrictMode.ThreadPolicy policy = 
                   new StrictMode.ThreadPolicy.Builder().permitAll().build();
              StrictMode.setThreadPolicy(policy);}
              Thread myThread = null;
    
    
      }
      @Override
      public void onStart(Intent intent, int startId) {
    
        super.onStart(intent, startId);
    
     if (Camera.getNumberOfCameras() >= 2) { 
    
        mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); }
    
     if (Camera.getNumberOfCameras() < 2) { 
    
        mCamera = Camera.open(); }
        SurfaceView sv = new SurfaceView(getApplicationContext());
    
    
         try {
                   mCamera.setPreviewDisplay(sv.getHolder());
                   parameters = mCamera.getParameters();
                   mCamera.setParameters(parameters);
                   mCamera.startPreview();
    
                   mCamera.takePicture(null, null, mCall);
             } catch (IOException e) { e.printStackTrace(); }
    
            sHolder = sv.getHolder();
            sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }
    
      Camera.PictureCallback mCall = new Camera.PictureCallback()
      {
    
         public void onPictureTaken(final byte[] data, Camera camera)
         {
    
            FileOutputStream outStream = null;
                    try{
    
                        File sd = new File(Environment.getExternalStorageDirectory(), "A");
                        if(!sd.exists()) {                                 
                          sd.mkdirs();
                          Log.i("FO", "folder" + Environment.getExternalStorageDirectory());
                        } 
    
                            Calendar cal = Calendar.getInstance();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
                            String tar = (sdf.format(cal.getTime()));
    
                            outStream = new FileOutputStream(sd+tar+".jpg");
                            outStream.write(data);  outStream.close();
    
                            Log.i("CAM", data.length + " byte written to:"+sd+tar+".jpg");
                            camkapa(sHolder);               
    
    
                     } catch (FileNotFoundException e){
                        Log.d("CAM", e.getMessage());
                    } catch (IOException e){
                        Log.d("CAM", e.getMessage());
                    }}
      };
    
    
        @Override
        public IBinder onBind(Intent intent) {
              return null;
        }
    
        public void camkapa(SurfaceHolder sHolder) {
    
            if (null == mCamera)
                return;
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
            Log.i("CAM", " closed");
            }
    
        }
    

    AndroidManifest.xml

    
    
    
    
    
                 
    
                
            
    

    Call this in your MainActivity to call service :

        Intent service;
    
        ....
    
        Calendar cal = Calendar.getInstance();
    
        service = new Intent(getBaseContext(), CapPhoto.class);
        cal.add(Calendar.SECOND, 15);
        //TAKE PHOTO EVERY 15 SECONDS
        PendingIntent pintent = PendingIntent.getService(this, 0, service, 0);
        AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                     60*60*1000, pintent);
        startService(service);
    

提交回复
热议问题