2017-08-30 5 views
1

Je travaille sur une application qui implique une caméra manuelle dans laquelle elle possède son propre bouton flash qu'elle fait passer de OFF à ON à AUTO. J'appelle une instruction switch avec un onClickListener pour le faire.Mode flash sélectionné mais camera2 ne capture pas d'image avec ces modes de flash

private void setFlash() { 
    switch (mFlashMode) { 
     case CONTROL_AE_MODE_OFF: 
      mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
      useFlashButton.setImageResource(R.drawable.flash_on); 
      mFlashMode = CONTROL_AE_MODE_ON; 
      break; 
     case CONTROL_AE_MODE_ON: 
      mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
      useFlashButton.setImageResource(R.drawable.flash_automatic); 
      mFlashMode = CONTROL_AE_MODE_ON_AUTO_FLASH; 
      break; 
     case CONTROL_AE_MODE_ON_AUTO_FLASH: 
      mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF); 
      useFlashButton.setImageResource(R.drawable.flash_off); 
      mFlashMode = CONTROL_AE_MODE_OFF; 
      break; 
    } 
} 

Alors ce que je dois faire maintenant est en fonction du mode flash est sélectionné, l'appareil photo capture de façon appropriée. pour le moment quel que soit le mode que je sélectionne, aucun flash ne se produit.

Que puis-je faire?

plus de code pour aider.

 protected void onImageCaptureClick() { 
     if (null == mCameraDevice) { 
      Log.e(TAG, "cameraDevice is null"); 
      return; 
     } 
     CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

     try { 
      CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraDevice.getId()); 
      Size[] jpegSizes = null; 
      if (characteristics != null) { 
       jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG); 
      } 
      int width = 640; 
      int height = 480; 
      if (jpegSizes != null && 0 < jpegSizes.length) { 
       width = jpegSizes[0].getWidth(); 
       height = jpegSizes[0].getHeight(); 
      } 
      ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
      List<Surface> outputSurfaces = new ArrayList<>(2); 
      outputSurfaces.add(reader.getSurface()); 
      outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture())); 
      final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
      captureBuilder.addTarget(reader.getSurface()); 
      // Use the same AE and AF modes as the preview. 

      captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); 
      // Orientation 
      int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
      captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 

      final File file = new File(_pictureUri.getPath()); 
      ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { 
       @Override 
       public void onImageAvailable(ImageReader reader) { 
        Image image = null; 
        try { 
         image = reader.acquireLatestImage(); 
         ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
         byte[] bytes = new byte[buffer.capacity()]; 
         buffer.get(bytes); 
         save(bytes); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
         if (image != null) { 
          image.close(); 
         } 
        } 
       } 


       private void save(byte[] bytes) throws IOException { 
        OutputStream output = null; 
        try { 
         output = new FileOutputStream(file); 
         output.write(bytes); 
        } finally { 
         if (null != output) { 
          output.close(); 
         } 
        } 
       } 
      }; 
      reader.setOnImageAvailableListener(readerListener, mBackgroundHandler); 
      final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { 
       //byte[] data; 
       @Override 
       public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { 
        super.onCaptureCompleted(session, request, result); 


        Intent intent = new Intent (CameraActivity.this, CameraReviewPhotoActivity.class); 
        intent.putExtra (MediaStore.EXTRA_OUTPUT, _pictureUri); 
        startActivityForResult (intent, CameraActivity.kRequest_Code_Approve_Image); 

       } 
      }; 
      mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { 
       @Override 
       public void onConfigured(CameraCaptureSession session) { 
        try { 
         session.capture(captureBuilder.build(), captureListener, mBackgroundHandler); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onConfigureFailed(CameraCaptureSession session) { 
       } 
      }, mBackgroundHandler); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 


    private void runPrecaptureSequence() { 
    try { 

     setFlash(); 
     mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, 
       CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); 

     mState = STATE_WAITING_PRE_CAPTURE; 
     mCameraCaptureSessions.capture(mCaptureRequestBuilder.build(), mCaptureCallback, 
       mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 

} 

Répondre

1

oui, cela fonctionne pour moi. voici mon code:

public class AndroidCameraApi extends AppCompatActivity { 
private static final String TAG = "AndroidCameraApi"; 
private Button takePictureButton; 
private TextureView textureView; 
private Button flashButton; 
private CaptureRequest.Builder captureBuilder; 
private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); 
static { 
    ORIENTATIONS.append(Surface.ROTATION_0, 90); 
    ORIENTATIONS.append(Surface.ROTATION_90, 0); 
    ORIENTATIONS.append(Surface.ROTATION_180, 270); 
    ORIENTATIONS.append(Surface.ROTATION_270, 180); 
} 
private String cameraId; 
protected CameraDevice cameraDevice; 
protected CameraCaptureSession cameraCaptureSessions; 
protected CaptureRequest captureRequest; 
protected CaptureRequest.Builder captureRequestBuilder; 
private Size imageDimension; 
private ImageReader imageReader; 
private File file; 
private static final int REQUEST_CAMERA_PERMISSION = 200; 
private boolean mFlashSupported; 
private boolean flash_on=false; 
private Handler mBackgroundHandler; 
private HandlerThread mBackgroundThread; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    textureView = (TextureView) findViewById(R.id.texture); 
    flashButton=(Button)findViewById(R.id.button); 
    assert textureView != null; 
    textureView.setSurfaceTextureListener(textureListener); 
    takePictureButton = (Button) findViewById(R.id.btn_takepicture); 
    assert takePictureButton != null; 
    flashButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(!flash_on){ 

        flash_on=true; 


      }else{ 
       flash_on=false; 



      } 

     } 
    }); 
    takePictureButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      takePicture(); 
     } 
    }); 
} 
TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() { 
    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     //open your camera here 
     openCamera(); 
    } 
    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
     // Transform you image captured size according to the surface width and height 
    } 
    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     return false; 
    } 
    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    } 
}; 
private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { 
    @Override 
    public void onOpened(CameraDevice camera) { 
     //This is called when the camera is open 
     Log.e(TAG, "onOpened"); 
     cameraDevice = camera; 
     createCameraPreview(); 
    } 
    @Override 
    public void onDisconnected(CameraDevice camera) { 
     cameraDevice.close(); 
    } 
    @Override 
    public void onError(CameraDevice camera, int error) { 
     cameraDevice.close(); 
     cameraDevice = null; 
    } 
}; 
final CameraCaptureSession.CaptureCallback captureCallbackListener = new CameraCaptureSession.CaptureCallback() { 
    @Override 
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 
     super.onCaptureCompleted(session, request, result); 
     Toast.makeText(AndroidCameraApi.this, "Saved:" + file, Toast.LENGTH_SHORT).show(); 
     createCameraPreview(); 
    } 
}; 
protected void startBackgroundThread() { 
    mBackgroundThread = new HandlerThread("Camera Background"); 
    mBackgroundThread.start(); 
    mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); 
} 
protected void stopBackgroundThread() { 
    mBackgroundThread.quitSafely(); 
    try { 
     mBackgroundThread.join(); 
     mBackgroundThread = null; 
     mBackgroundHandler = null; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
protected void takePicture() { 
    if(null == cameraDevice) { 
     Log.e(TAG, "cameraDevice is null"); 
     return; 
    } 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId()); 
     Size[] jpegSizes = null; 
     if (characteristics != null) { 
      jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG); 
     } 
     int width = 640; 
     int height = 480; 
     if (jpegSizes != null && 0 < jpegSizes.length) { 
      width = jpegSizes[0].getWidth(); 
      height = jpegSizes[0].getHeight(); 
     } 
     ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
     List<Surface> outputSurfaces = new ArrayList<Surface>(2); 
     outputSurfaces.add(reader.getSurface()); 
     outputSurfaces.add(new Surface(textureView.getSurfaceTexture())); 
     captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureBuilder.addTarget(reader.getSurface()); 

     //THIS YOU HAVE TO PUT YOUR METOD setFlash(); be shore your swith metos works i use just 2 states "Flash on" and "Flash off" you can add "Flash Auto" 

     if(flash_on){ 
      captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
      captureBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
     }else{ 
      captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
      captureBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
     } 



     int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 

     final File file = new File(Environment.getExternalStorageDirectory()+"/pic.jpg"); 
     ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader reader) { 
       Image image = null; 
       try { 
        image = reader.acquireLatestImage(); 
        ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
        byte[] bytes = new byte[buffer.capacity()]; 
        buffer.get(bytes); 
        save(bytes); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
        if (image != null) { 
         image.close(); 
        } 
       } 
      } 
      private void save(byte[] bytes) throws IOException { 
       OutputStream output = null; 
       try { 
        output = new FileOutputStream(file); 
        output.write(bytes); 
       } finally { 
        if (null != output) { 
         output.close(); 
        } 
       } 
      } 
     }; 
     reader.setOnImageAvailableListener(readerListener, mBackgroundHandler); 
     final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { 
      @Override 
      public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 
       super.onCaptureCompleted(session, request, result); 
       Toast.makeText(AndroidCameraApi.this, "Saved:" + file, Toast.LENGTH_SHORT).show(); 
       createCameraPreview(); 
      } 
     }; 
     cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { 
      @Override 
      public void onConfigured(CameraCaptureSession session) { 
       try { 
        session.capture(captureBuilder.build(), captureListener, mBackgroundHandler); 
       } catch (CameraAccessException e) { 
        e.printStackTrace(); 
       } 
      } 
      @Override 
      public void onConfigureFailed(CameraCaptureSession session) { 
      } 
     }, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 
protected void createCameraPreview() { 
    try { 
     SurfaceTexture texture = textureView.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
     Surface surface = new Surface(texture); 
     captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     captureRequestBuilder.addTarget(surface); 
     cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback(){ 
      @Override 
      public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
       //The camera is already closed 
       if (null == cameraDevice) { 
        return; 
       } 
       // When the session is ready, we start displaying the preview. 
       cameraCaptureSessions = cameraCaptureSession; 
       updatePreview(); 
      } 
      @Override 
      public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 
       Toast.makeText(AndroidCameraApi.this, "Configuration change", Toast.LENGTH_SHORT).show(); 
      } 
     }, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 
private void openCamera() { 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    Log.e(TAG, "is camera open"); 
    try { 
     cameraId = manager.getCameraIdList()[0]; 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 
     StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
     assert map != null; 
     imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; 
     // Add permission for camera and let user grant the permission 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(AndroidCameraApi.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION); 
      return; 
     } 
     manager.openCamera(cameraId, stateCallback, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
    Log.e(TAG, "openCamera X"); 
} 
public void updatePreview() { 
    if(null == cameraDevice) { 
     Log.e(TAG, "updatePreview error, return"); 
    } 


    try { 
     cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 
private void closeCamera() { 
    if (null != cameraDevice) { 
     cameraDevice.close(); 
     cameraDevice = null; 
    } 
    if (null != imageReader) { 
     imageReader.close(); 
     imageReader = null; 
    } 
} 
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    if (requestCode == REQUEST_CAMERA_PERMISSION) { 
     if (grantResults[0] == PackageManager.PERMISSION_DENIED) { 
      // close the app 
      Toast.makeText(AndroidCameraApi.this, "Sorry!!!, you can't use this app without granting permission", Toast.LENGTH_LONG).show(); 
      finish(); 
     } 
    } 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    Log.e(TAG, "onResume"); 
    startBackgroundThread(); 
    if (textureView.isAvailable()) { 
     openCamera(); 
    } else { 
     textureView.setSurfaceTextureListener(textureListener); 
    } 
} 
@Override 
protected void onPause() { 
    Log.e(TAG, "onPause"); 
    //closeCamera(); 
    stopBackgroundThread(); 
    super.onPause(); 
} 

@Override 
protected void onDestroy() { 
    closeCamera(); 
    super.onDestroy(); 
} 

}

essayer et mon être vous finde ce qui ne va pas avec votre code mise en page activity_main.xml:

+0

Merci Sergio ! ceci a aidé!: DI l'apprécie! –

0

pour prendre le flash, vous pouvez utiliser ceci: `

mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH); 

et pour le décollage flash:

mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 

espère que cela aide.

`

+0

Salut Sergio! Merci pour la réponse. J'ai essayé, mais malheureusement toujours rien. il ne veut tout simplement pas clignoter du tout. diable, je ne l'ai même pas vu clignoter lorsque le flash a été mis en place sans le commutateur manuel seul. ou quelque chose manque, donc quelque chose est au mauvais endroit. je ne suis pas sûr. :(- mais je vous remercie pour votre réponse –

+0

vous êtes bienvenu –

0

Je pense que cela fonctionnera.

premier changement votre metod setFlash() comme ceci:

private void setFlash(CaptureRequest.Builder cuptureBuilder) { 
switch (mFlashMode) { 
    case CONTROL_AE_MODE_OFF: 
    //Flash ON 
     cuptureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
      cuptureBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
      useFlashButton.setImageResource(R.drawable.flash_on); 
     mFlashMode = CONTROL_AE_MODE_ON; 
     break; 
    case CONTROL_AE_MODE_ON: 
    //FLASH AUTO 
     cuptureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      cuptureBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
      useFlashButton.setImageResource(R.drawable.flash_automatic); 
     mFlashMode = CONTROL_AE_MODE_ON_AUTO_FLASH; 
     break; 
    case CONTROL_AE_MODE_ON_AUTO_FLASH: 
    //FLASH OFF 
    cuptureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
      cuptureBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
     useFlashButton.setImageResource(R.drawable.flash_off); 
     mFlashMode = CONTROL_AE_MODE_OFF; 
     break; 
} 

} que mettre vous êtes setFlash() Metod comme ceci:

ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
     List<Surface> outputSurfaces = new ArrayList<>(2); 
     outputSurfaces.add(reader.getSurface()); 
     outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture())); 
     final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureBuilder.addTarget(reader.getSurface()); 
     // Use the same AE and AF modes as the preview. 
     //***PUT YOURE METOD setFlash(cuptureBuilder) HERE*** 
     setFlash(cuptureBuilder); 

     captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); 
     // Orientation 
     int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 

i tester et ça marche très bien:) espoir il aide

+0

Merci pour la réponse, alors vous allez travailler sur le vôtre? Il a clignoté? Toujours rien pour moi, fatigué votre code.Il est peut-être autre chose que je ne suis pas à la minute je reçois un écran noirâtre sur catpure maintenant :( –

+0

je mets tout le code sur le dessus –

+0

Merci Sergio pour toute votre aide, vous m'a aidé à comprendre Flash maintenant! –

0
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 
<TextureView 
    android:id="@+id/texture" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true"/> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:gravity="bottom"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center_horizontal"> 

      <Button 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="flash mode" 
       android:id="@+id/button" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentEnd="true" 
       android:layout_weight="1" /> 
     </LinearLayout> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center_horizontal"> 

      <Button 
       android:id="@+id/btn_takepicture" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/take_picture" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentStart="true" 
       android:layout_weight="1" /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 
</RelativeLayout>