2017-08-30 281 views
1

我正在研究一个涉及手动相机的应用程序,该相机具有自己的闪光灯按钮,可以从OFF旋转到ON到AUTO。我使用onClickListener调用switch语句来执行此操作。选择了闪光灯模式,但camera2不会使用那些闪光灯模式拍摄图像

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

所以我现在需要做的是取决于选择什么闪光灯模式,相机将捕捉适当。此刻,无论选择何种模式,都不会发生闪光。

我该怎么办?

更多帮助代码。

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

} 

回答

1

是的,它适用于我。这里是我的代码:

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

}

尝试一下,我是你FINDE什么是你的代码错误 布局activity_main.xml中:

+0

谢谢塞尔吉奥!这有帮助!:DI欣赏它! –

0

的外带闪光灯上,你可以使用这个:`

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

和起飞闪光:

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

希望它帮助。

`

+0

嗨塞尔吉奥!谢谢回复。我放弃了这一切,但遗憾的是还是一无所获。它根本不想闪光。哎呀,我甚至没有看到闪光灯在没有手动开关的情况下自动闪光。或者有什么东西丢失,所以有些地方是错误的。我不确定。 :( - 但是,谢谢你的回答。 –

+0

你很好吧 –

0

我认为这会奏效。

第一个改变你的梅托德setFlash()这样的:

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

} 不是把您选择setFlash()梅托德这样的:

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

我测试它,它很好地工作:)希望它帮助

+0

感谢你的回复。所以你这个工作对你有用吗?它实际上闪现了吗?对我来说还是什么都没有,累了你的代码也许还有别的东西我不是在我现在得到一个黑色屏幕catpure现在:( –

+0

我把所有的代码放在顶部 –

+0

谢谢塞尔吉奥的一切帮助。你帮助我了解Flash现在! –

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>