Android: Take Photo Without User Interface

前端 未结 2 1441
深忆病人
深忆病人 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:25

    Few tips:

    • First of all, don't hardcode file paths. Your /sdcard might not exist at all, so your outStream will be null, and it will crash when you call any method from outStream. Instead, use Environment.getExternalStoragePublicDirectory or Environment.getExternalStorageDirectory (for devices with Android version < 2.2). See here

    • no photo preview - you can make your preview 1pixel x 1pixel in size, so it will be barely visible

    • you need to declare permissions in AndroidManifest:

      "android.permission.CAMERA" and "android.permission.WRITE_EXTERNAL_STORAGE" (if you want to save pictures)

    I suggest you go through the example form the docs and experiment.

    0 讨论(0)
  • 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

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-feature android:name="android.hardware.camera" />
    
    <service android:name=".CapPhoto" android:enabled="true">
                 <intent-filter>
    
                </intent-filter>
            </service>
    

    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);
    
    0 讨论(0)
提交回复
热议问题