2011-07-06 12 views
24

पर वापस/फ्रंट कैमरा स्विच करें यदि मैं केवल CAMERA_FACING_BACK या CAMERA_FACING_FRONT का उपयोग करता हूं तो सभी ठीक काम करते हैं।फ्लाई

मुझे CAMERA_FACING_BACK से CAMERA_FACING_FRONT पर स्विच के साथ परेशानी है।

मेरे कोड का टुकड़ा:

public class PhotoCameraActivity extends Activity implements OnClickListener { 
private SurfaceView cameraView; 
private Button turnButton; 
private Camera camera = null; 
private Callback listener; 
private static int camId = Camera.CameraInfo.CAMERA_FACING_BACK; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.photo_camera_main); 
    prepareActivity(); 
} 

private void prepareActivity() { 
    cameraView = (SurfaceView) findViewById(R.id.photo_camera_surface_view); 

    turnButton = (ImageButton) findViewById(R.id.turn_button); 
    turnButton.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    if (v.equals(turnButton)) { 
     if (Camera.getNumberOfCameras() > 1 && camId < Camera.getNumberOfCameras() - 1) { 
      startCamera(camId + 1); 
     } else { 
      startCamera(Camera.CameraInfo.CAMERA_FACING_BACK); 
     } 
    } 
} 

@Override 
protected void onResume() { 
    startCamera(camId); 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    stopCamera(); 
    super.onPause(); 
} 

private void startCamera(int cameraId) { 
    if (camera != null) { 
     stopCamera(); 
    }  
    holder = cameraView.getHolder(); 
    listener = new Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       camera.setPreviewDisplay(holder); 
       camera.startPreview(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

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


    camId = cameraId; 
    camera = Camera.open(cameraId); 
    Camera.Parameters params = camera.getParameters(); 
    if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) { 
     params.setPreviewSize(1280, 800); 
    } else { 
     params.setPreviewSize(640, 480); 
    } 
    camera.setParameters(params); 

} 

private void stopCamera(){ 
    System.out.println("stopCamera method"); 
    if (camera != null){ 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
     holder.removeCallback(listener); 
     holder = null; 
    } 
} 

} 
+1

क्या "मुसीबत" आप कर रहे हैं कि का स्वभाव है आ रही हैं? – Estel

+0

अगर मैं कैमरे को रोकने की कोशिश करता हूं, तो व्यूफिंडर फ्रीज करता है और किसी अन्य कैमरे से छवि प्रदर्शित नहीं करता है। लेकिन अगर मैं "बैक" दबाता हूं और फिर इस गतिविधि को फिर से शुरू करता हूं, तो कैमरा आगे बढ़ता है और यह फिर से ठीक काम करता है। मुझे लगता है कि मुझे शट डाउन कैमरा और संसाधनों को छोड़ने में परेशानी है। –

+0

मैंने एक ही समस्या के साथ अटक गया है – himanshu

उत्तर

5

मैं cameraId = 2 और इस काम कर रहा है के साथ गतिविधि को पुनरारंभ करें।

+1

@ Dmitriy_Boichenko..मैं हूँ भी एक ही मुद्दा का सामना करना पड़ रहा है .. क्या आप अपना कोड साझा कर सकते हैं? – sarath

+0

बटन पर गतिविधि को पुनरारंभ करने के लिए कैसे करें – Ravi

+0

कोड को फिर से निष्पादित करने के लिए कॉल ऑनक्रेट (शून्य) विधि पर क्लिक करें .. – WonderSoftwares

21

onCreate में() मेरी गतिविधि के मैं एक बटन मेरी पूर्वावलोकन SurfaceView पर ओवरले के लिए निम्न onClick श्रोता जोड़ने (वहाँ का पूर्वावलोकन करने के लिए वेब पर कई उदाहरण हैं): अपने परीक्षण उपकरण पीठ पर

ImageButton useOtherCamera = (ImageButton) findViewById(R.id.useOtherCamera); 
//if phone has only one camera, hide "switch camera" button 
if(Camera.getNumberOfCameras() == 1){ 
    useOtherCamera.setVisibility(View.INVISIBLE); 
} 
else { 
    useOtherCamera.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 
    //NB: if you don't release the current camera before switching, you app will crash 
    camera.release(); 

    //swap the id of the camera to be used 
    if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
     currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
    } 
    else { 
     currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
    } 
    camera = Camera.open(currentCameraId); 
    //Code snippet for this method from somewhere on android developers, i forget where 
    setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera); 
    try { 
     //this step is critical or preview on new camera will no know where to render to 
     camera.setPreviewDisplay(previewHolder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    camera.startPreview(); 
} 

कैमरे में 0 की आईडी है और फ्रंट में 1 आईडी है। मैं सुझाव देता हूं कि कैमरे के कैमरेइन्फो स्थिर स्टैबिक वेरिएबल्स को आपके कैमरे आईडी के बजाय हार्ड-कोडिंग मानों के बजाय। मुझे यकीन है कि केवल अन्य उपकरणों पर मुद्दों का कारण होगा।

+0

+1 मैं कैमरा खो रहा था .setPreviewDisplay (पूर्वावलोकनहोल्डर); –

+5

** यह कोड [गलत] है (http://stackoverflow.com/questions/2779002/how-to-open-front-camera-on-android-platform/4767832#comment33410134_4767832) **: * ... कैमरा का सामना करना है कैमरे इंडेक्स की तुलना में असफल नहीं है। उदाहरण के लिए मेरे टैबलेट में केवल एक कैमरा है (इंडेक्स: 0) लेकिन सामने का सामना करना पड़ रहा है (इंडेक्स का सामना करना पड़ रहा है: 1)। इसलिए Camera.open (CameraInfo.CAMERA_FACING_FRONT) जैसे सरल कोड का उपयोग करना nonesense * –

+1

@AlexCohn मैं नहीं कहूंगा कि यह कोड गलत है, वास्तव में यह बहुत अच्छा काम करता है और दिखाता है कि कैमरे को कैसे रोकें और एक नया शुरू करें। यह प्रोग्रामर पर ** ** कोड को समझने और अपनी आवश्यकताओं के अनुरूप अनुकूलित करने के लिए है। – Merlevede

4

मैंने अपने लेआउट में SurfaceView को हटा दिया और फिर से जोड़ा और इसलिए यह काम किया। इस कोड को

public void switchCamera(int cameraType) 
{ 
    if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) 
    { 
     if(Camera.getNumberOfCameras() > cameraType) 
     { 
      // Set selected camera 
      this.cameraType = cameraType; 
     } 
     else 
     { 
      // Set default camera (Rear) 
      this.cameraType = Camera.CameraInfo.CAMERA_FACING_BACK; 
     } 

     if(mCamera != null) 
     { 
      // Destroy previuos Holder 
      surfaceDestroyed(holder); 
      holder.removeCallback(this); 

      // Remove and re-Add SurfaceView 
      ViewGroup rootLayout = (ViewGroup) surface.getParent(); 
      rootLayout.removeView(surface); 
      surface = new SurfaceView(context); 
      holder = surface.getHolder(); 
      holder.addCallback(this); 
      rootLayout.addView(surface, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     } 
    } 
} 
+0

मैं वास्तव में दृश्य को हटाने के लिए भूल गया था इसलिए मैं स्विच किए गए कैमरे के दृश्य को देखने में सक्षम नहीं था। इस मदद से –

0

उपयोग:

if (mCamera != null) { 
     mCamera.stopPreview();     
     mCamera.release(); 
     mCamera = null; 
} 

//swap the id of the camera to be used 
if (currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
else 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;   

try {     
     mCamera = Camera.open(currentCameraId); 

     mCamera.setDisplayOrientation(90); 

     mCamera.setPreviewDisplay(surfaceHolder);    

     mCamera.startPreview(); 

    } 
catch (Exception e) { e.printStackTrace(); } 
+3

** यह कोड [गलत] है (http://stackoverflow.com/questions/2779002/how-to- ओपन-फ्रंट-कैमरा-ऑन-एंड्रॉइड-प्लेटफार्म/4767832 # टिप्पणी 33410134_4767832) **: * ... कैमरा का सामना कैमरा इंडेक्स की तुलना में असफल नहीं है। उदाहरण के लिए मेरे टैबलेट में केवल एक कैमरा है (इंडेक्स: 0) लेकिन सामने का सामना करना पड़ रहा है (इंडेक्स का सामना करना पड़ रहा है: 1)। इसलिए Camera.open (CameraInfo.CAMERA_FACING_FRONT) जैसे सरल कोड का उपयोग करना बकवास है * –

2

मैं जोड़ने से पहले सतह अवलोकन को निकालने के लिए है एक नया एक:

if (mPreview != null) { 
     mPreview.surfaceDestroyed(mPreview.getHolder()); 
     mPreview.getHolder().removeCallback(mPreview); 
     mPreview.destroyDrawingCache(); 
     FrameLayout preview = (FrameLayout) view.findViewById(R.id.camera_frame); 
     preview.removeView(mPreview); 
     mPreview.mCamera = null; 
     mPreview = null; 

    } 

//then add your preview 
संबंधित मुद्दे