2016-09-22 234 views
0

如何在沒有在屏幕上顯示相機的情況下拍攝來自前置攝像頭的照片。 我有服務分類拍攝來自相機的照片

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; 
    } 
} 

和主要活動。我想從主要活動中打電話。

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) { 
    } 
} 

回答

0

當你在後臺線程,如服務使用SurfaceTexture代替SurfaceHolder。如果你正在尋找實現here is a opensource app,我已經實現了背景視頻流和UI視頻流。

+0

我想只從前面的攝像頭捕獲圖像..沒有顯示相機。 –

+0

類似的情況下,您可以從提供的鏈接中獲得創意。 –

相關問題