2014-04-13 10 views
6

कैमरा एपीआई का उपयोग करके, मैं सफलतापूर्वक एक तस्वीर लेने और इसे फ़ोल्डर में सहेजने में सक्षम हूं।हर 5 सेकंड में एंड्रॉइड में चित्र लेना

Main.xml:: यहाँ कोड है कि मैं का उपयोग कर रहा है

<FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" /> 

    <Button 
     android:id="@+id/button_capture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Capture" /> 

एक सहायक वर्ग:

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraPreview extends SurfaceView implements 
     SurfaceHolder.Callback { 
    private SurfaceHolder mSurfaceHolder; 
    private Camera mCamera; 

    // Constructor that obtains context and camera 
    @SuppressWarnings("deprecation") 
    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     this.mCamera = camera; 
     this.mSurfaceHolder = this.getHolder(); 
     this.mSurfaceHolder.addCallback(this); 
     this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.setDisplayOrientation(90); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      // left blank for now 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, 
      int width, int height) { 
     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     } catch (Exception e) { 
      // intentionally left blank for a test 
     } 
    } 

} 

गतिविधि वर्ग:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 

public class MyCamera extends Activity { 
    private Camera mCamera; 
    private CameraPreview mCameraPreview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mCamera = getCameraInstance(); 
     mCameraPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mCameraPreview); 

     Button captureButton = (Button) findViewById(R.id.button_capture); 
     captureButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mCamera.takePicture(null, null, mPicture); 
      } 
     }); 
    } 

    /** 
    * Helper method to access the camera returns null if it cannot get the 
    * camera or does not exist 
    * 
    * @return 
    */ 
    private Camera getCameraInstance() { 
     Camera camera = null; 
     try { 
      camera = Camera.open(); 
     } catch (Exception e) { 
      // cannot get camera or does not exist 
     } 
     return camera; 
    } 

    PictureCallback mPicture = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      File pictureFile = getOutputMediaFile(); 
      if (pictureFile == null) { 
       return; 
      } 
      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 

      } catch (IOException e) { 
      } 
     } 

    }; 

    private static File getOutputMediaFile() { 
     File mediaStorageDir = new File(
       Environment 
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
       "MyCameraApp"); 
     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 
       Log.d("MyCameraApp", "failed to create directory"); 
       return null; 
      } 
     } 
     // Create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") 
       .format(new Date()); 
     File mediaFile; 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 

     return mediaFile; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.my_camera, menu); 
     return true; 
    } 

} 

मैं भी में शामिल किया है मेनिफेस्ट फ़ाइल निम्न है:

<uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

मैं निम्नलिखित समस्या है: एक का उपयोग करके

  1. कब्जा बटन दबाने के बाद, मैं चाहता हूँ कैमरा स्वचालित रूप से चित्रों पर कब्जा करने के लिए हर 5 सेकंड जारी रखने के लिए:

    मैं निम्नलिखित करना चाहते हैं उल्टी गिनती करने वाली घड़ी। तो मैं निम्नलिखित को शामिल किया है:

    while(true){ 
        new CountDownTimer(5000,1000){ 
    
          @Override 
          public void onFinish() { 
           mCamera.takePicture(null, null, mPicture); 
          } 
    
          @Override 
          public void onTick(long millisUntilFinished) { 
    
          } 
    
         }.start(); 
    } 
    

हालांकि, मैं अब एक तस्वीर हो रही है। कोड को दोहराए जाने के लिए मैंने थोड़ी देर (सत्य) जोड़ा। मैंने थोड़ी देर के बिना कोशिश की है (सच) और उम्मीद है कि छवि कैप्चरिंग 5 सेकंड

दूसरी बात यह है कि: मैं कैप्चर की गई तस्वीरों की गुणवत्ता कैसे बदल सकता हूं?

किसी भी मदद की सराहना की जाएगी।

+0

हाय उपयोगकर्ता 2262955, क्या आप कृपया इस बारे में गिटूब पर एक कामकाजी नमूना डाल सकते हैं? thnaks – Amir

उत्तर

2

while(true) हटाएं, आपको इसकी आवश्यकता नहीं है और असीमित उलटी गिनती टाइमर बनाएंगे।

अपने उलटी गिनती इस

new CountDownTimer(5000,1000){ 

    @Override 
    public void onFinish() { 

    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     mCamera.startPreview(); 
     mCamera.takePicture(null, null, mPicture); 
    } 

}.start(); 

onTick इस मामले में हर 1000 एमएस कहा जाता है के लिए शुरू बदलें

, और जब टाइमर उलटी गिनती समाप्त हो गया है onFinish कहा जाता है।

यदि आप हर 5 सेकंड में कुछ दोहराना चाहते हैं तो मुझे नहीं लगता कि CountDownTimer आपकी आवश्यकताओं को फिट करता है ... Timer बेहतर होगा।

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     mCamera.startPreview(); 
     mCamera.takePicture(null, null, mPicture); 
    } 
}, 0, 1000); 

Timer इंस्टाल इसे रोकने के लिए Remeber!

+0

काम नहीं कर रहा है। मुझे केवल एक तस्वीर मिल रही है – user2262955

+1

शायद अधिक तस्वीरें लेने के लिए आपको पहले StartPreview() को कॉल करना चाहिए।- अद्यतन उत्तर देखें। –

+0

पहले टाइमर के साथ काम नहीं किया है। मुझे स्रोत नहीं मिला है: स्रोत अटैचमेंट में फ़ाइल के लिए स्रोत नहीं है Timer.class – user2262955

0
while (true) { 
    new CountDownTimer(5000, 1000) { 
     @Override 
     public void onFinish() { 
      releaseCamera(); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      mCamera.takePicture(null, null, mPicture); 
     } 

     }.start(); 
} 

आप जब onTick, नहीं बुलाया जाता है जब onFinish कहा जाता है छवि पर कब्जा करने की जरूरत है। onTick को 10 सेकंड के बाद हर बार बुलाया जाएगा (यानी अंतराल निर्दिष्ट), जबकि onFinish को countDownTimer खत्म होने के बाद बुलाया जाएगा। यही कारण है कि आपको केवल एक छवि मिल रही है।

संबंधित मुद्दे