I am developing my own custom camera app,while running the application if I click the capture button my camera will capture the current position.what I actually need is retaking a photo whenever I need.But if I click the retake(take photo) button the app will crash.Here I attached my code below.So any one please help me to resolve the error.
MainActivity.java
package com.example.camera1;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Camera cameraObject;
private ShowCamera showCamera;
private ImageView pic;
private Button takePhotoButton;
public static Camera isCameraAvailiable(){
Camera object = null;
try {
object = Camera.open();
}
catch (Exception e){
}
return object;
}
private PictureCallback capturedIt = new PictureCallback() {
#Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
if(bitmap==null){
Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();
}
cameraObject.release();
}
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
takePhotoButton = (Button)findViewById(R.id.button_takephoto);
cameraObject = isCameraAvailiable();
showCamera = new ShowCamera(this, cameraObject);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(showCamera);
takePhotoButton.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
cameraObject = isCameraAvailiable();
cameraObject.stopPreview();
showCamera = new ShowCamera(getApplicationContext(), cameraObject);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(showCamera);
}
});
}
public void snapIt(View view){
cameraObject.takePicture(null, null, capturedIt);
}
#Override
public void onPause(){
super.onPause();
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
ShowCamera.java
package com.example.camera1;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holdMe;
private Camera theCamera;
public ShowCamera(Context context,Camera camera) {
super(context);
theCamera = camera;
holdMe = getHolder();
holdMe.addCallback(this);
}
#Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
#Override
public void surfaceCreated(SurfaceHolder holder) {
try {
theCamera.setDisplayOrientation(90);
theCamera.setPreviewDisplay(holder);
theCamera.startPreview();
} catch (IOException e) {
}
}
#Override
public void surfaceDestroyed(SurfaceHolder arg0) {
theCamera.stopPreview();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.30"
android:orientation="vertical" >
<FrameLayout
android:id="#+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="350dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="#+id/button_capture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="snapIt"
android:text="#string/Capture" />
<Button
android:id="#+id/button_takephoto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/button_capture"
android:text="Take Photo" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
I think the reason is you called cameraObject.release(); in onPictureTaken. You can remove it. And, don't forget to call startPreview() again.
Because:
This method is only valid when preview is active (after
startPreview()). Preview will be stopped after the image is taken;
callers must call startPreview() again if they want to re-start
preview or take more pictures. This should not be called between
start() and stop().
After calling this method, you must not call startPreview() or take
another picture until the JPEG callback has returned.
cameraObject.release();
Remove this line from tour PictureCallback. Now you know reason your app crash is quite straight to me , you are not start camera and preview also after you capture image. Preview is something stop after you call PictureCallback ,you have resume it manually.
IF you dont want to manage this thing then i can advise you to use cwac-camera library which is simply awesome. All you need to do is extend your Fragment by CameraFragment and it will take your responsibility to manage this stuff .
Enjoy !
Related
I am trying to click only a rectangular portion of the screen from camera using this code:
Java code:
package com.example.cameraapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.IOException;
public class CameraActivity extends Activity implements Camera.PictureCallback, SurfaceHolder.Callback {
public static final String EXTRA_CAMERA_DATA = "camera_data";
private static final String KEY_IS_CAPTURING = "is_capturing";
private Camera mCamera, dummyCamera;
private ImageView mCameraImage;
private SurfaceView mCameraPreview,s1;
private Button mCaptureImageButton;
private byte[] mCameraData;
private boolean mIsCapturing;
private View v1;
private View.OnClickListener mCaptureImageButtonClickListener = new View.OnClickListener() {
#Override
public void onClick(View v) {
try {
// mCamera.release();
// mCamera = Camera.open();
// mCamera.setPreviewDisplay(mCameraPreview.getHolder());
// mCamera.startPreview();
// final SurfaceHolder surfaceHolder = mCameraPreview.getHolder();
// surfaceHolder.addCallback(CameraActivity.this);
// surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
captureImage();
}catch (Exception e){
e.printStackTrace();
}
}
};
private View.OnClickListener mRecaptureImageButtonClickListener = new View.OnClickListener() {
#Override
public void onClick(View v) {
setupImageCapture();
}
};
private View.OnClickListener mDoneButtonClickListener = new View.OnClickListener() {
#Override
public void onClick(View v) {
if (mCameraData != null) {
Intent intent = new Intent();
intent.putExtra(EXTRA_CAMERA_DATA, mCameraData);
setResult(RESULT_OK, intent);
} else {
setResult(RESULT_CANCELED);
}
finish();
}
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mCameraImage = (ImageView) findViewById(R.id.camera_image_view);
mCameraImage.setVisibility(View.INVISIBLE);
v1 = findViewById(R.id.v1);
mCameraPreview = (SurfaceView) findViewById(R.id.preview_view);
s1 = (SurfaceView) findViewById(R.id.preview_view_1);
// final SurfaceHolder surfaceHolder = mCameraPreview.getHolder();
// surfaceHolder.addCallback(this);
// surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
final SurfaceHolder surfaceHolder2 = s1.getHolder();
surfaceHolder2.addCallback(this);
surfaceHolder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mCaptureImageButton = (Button) findViewById(R.id.capture_image_button);
mCaptureImageButton.setOnClickListener(mCaptureImageButtonClickListener);
final Button doneButton = (Button) findViewById(R.id.done_button);
doneButton.setOnClickListener(mDoneButtonClickListener);
mIsCapturing = true;
}
#Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putBoolean(KEY_IS_CAPTURING, mIsCapturing);
}
#Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mIsCapturing = savedInstanceState.getBoolean(KEY_IS_CAPTURING, mCameraData == null);
if (mCameraData != null) {
setupImageDisplay();
} else {
setupImageCapture();
}
}
#Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
try {
mCamera = Camera.open();
// dummyCamera = mCamera;
mCamera.setPreviewDisplay(s1.getHolder());
// dummyCamera.setPreviewDisplay(s1.getHolder());
if (mIsCapturing) {
// dummyCamera.startPreview();
mCamera.startPreview();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(CameraActivity.this, "Unable to open camera.", Toast.LENGTH_LONG)
.show();
}
}
}
#Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
#Override
public void onPictureTaken(byte[] data, Camera camera) {
mCameraData = data;
setupImageDisplay();
}
#Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mCamera != null) {
try {
// mCamera.stopPreview();
mCamera.setPreviewDisplay(holder);
// dummyCamera.setPreviewDisplay(s1.getHolder());
if (mIsCapturing) {
mCamera.startPreview();
// dummyCamera.startPreview();
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(CameraActivity.this, "Unable to start camera preview.", Toast.LENGTH_LONG).show();
}
}
}
#Override
public void surfaceCreated(SurfaceHolder holder) {
}
#Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
private void captureImage() {
mCamera.takePicture(null, null, this);
}
private void setupImageCapture() {
try {
mCameraImage.setVisibility(View.INVISIBLE);
mCameraPreview.setVisibility(View.VISIBLE);
s1.setVisibility(View.VISIBLE);
v1.setVisibility(View.VISIBLE);
mCamera.setPreviewDisplay(s1.getHolder());
mCamera.startPreview();
mCaptureImageButton.setText(R.string.capture_image);
mCaptureImageButton.setOnClickListener(mCaptureImageButtonClickListener);
}catch (Exception e){
e.printStackTrace();
}
}
private void setupImageDisplay() {
Bitmap bitmap = BitmapFactory.decodeByteArray(mCameraData, 0, mCameraData.length);
Bitmap resizedbitmap1=Bitmap.createBitmap(bitmap, 0,0,mCameraPreview.getWidth(), mCameraPreview.getHeight());
mCameraImage.setImageBitmap(resizedbitmap1);
mCamera.stopPreview();
mCameraPreview.setVisibility(View.INVISIBLE);
s1.setVisibility(View.INVISIBLE);
v1.setVisibility(View.INVISIBLE);
mCameraImage.setVisibility(View.VISIBLE);
mCaptureImageButton.setText(R.string.recapture_image);
mCaptureImageButton.setOnClickListener(mRecaptureImageButtonClickListener);
}
}
Layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#android:color/transparent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="#string/capturing_image" />
<FrameLayout
android:id="#+id/camera_frame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="#+id/camera_image_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<SurfaceView
android:id="#+id/preview_view_1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<View
android:id="#+id/v1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#CCFFFFFF"/>
<SurfaceView
android:id="#+id/preview_view"
android:layout_margin="80dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:background="#android:color/transparent"-->
<!-- android:layout_height="match_parent">-->
<!-- -->
<!-- </LinearLayout>-->
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="#+id/capture_image_button"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="#string/capture_image" />
<Button
android:id="#+id/done_button"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="#string/done" />
</LinearLayout>
</LinearLayout>
Here seems to be 2 workarounds:
Either i dynamically set the surface view "camera_image_view" at the time user try to capture screen. But i tried that in onClick and it is not working. Please suggest me some changes if you found any bug in that.
Clicking a full screen image and then cropping it to whatever fits inside the length and width of "camera_image_view". I tried this also but i think there is some flaw in this line:
Bitmap resizedbitmap1=Bitmap.createBitmap(bitmap, 0,0,mCameraPreview.getWidth(), mCameraPreview.getHeight());
as it is generating some broken colors instead of the cropped image.
So please help me with any of the two ways as both will work for me.
I am working on a QR decoder app in which i have created a SurfaceView to display camera output and a ImageButton to select an image from gallery.
I am using google play services to decode the QR code which requires to use surface view to scan the QR using camera. But it is not focusing on its own.
Below is the code for the same.
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
public class Scanner extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scanner);
final SurfaceView cameraView = (SurfaceView) findViewById(R.id.camera_view);
BarcodeDetector barcodeDectector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
final CameraSource cameraSource = new CameraSource.Builder(this,barcodeDectector).setRequestedPreviewSize(1920,1080).build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
#Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
cameraSource.start(cameraView.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
}
#Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
#Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
cameraSource.stop();
}
});
barcodeDectector.setProcessor(new Detector.Processor<Barcode>() {
#Override
public void release() {
}
#Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
//QRcode found hence move to intent action.
if( barcodes.size() != 0){
Intent i = new Intent(Scanner.this,Verify.class);
i.putExtra("xml",barcodes.valueAt(0).displayValue);
startActivity(i);
}
}
});
ImageButton scanImage = (ImageButton) findViewById(R.id.scanImage);
scanImage.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
//button action to be added
}
});
}
}
The activity_scanner.xml is as follows.
<?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:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="400dip"
android:layout_weight="70"
android:id="#+id/camera_view"
android:layout_alignParentLeft="true"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="#+id/scanImage"
android:layout_below="#+id/camera_view"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="#drawable/ic_image_black_48dp"
android:layout_alignRight="#+id/camera_view"
android:layout_alignEnd="#+id/camera_view" />
</RelativeLayout>
Try extending Surface view like this, and setFocusable(true).
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
public CameraView(Context context) {
super(context);
getHolder().addCallback(this);
setFocusable(true);
}
#Override
public void surfaceCreated(SurfaceHolder holder) {
}
#Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
#Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
EDIT 1:
Then in layout you can use this class like this,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://s...content-available-to-author-only...d.com/apk/res/android"
xmlns:tools="http://s...content-available-to-author-only...d.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin">
<com.abhayjatindoshi.encryptorcode.qrlogin.javaclass.CameraView
android:layout_width="match_parent"
android:layout_height="400dip"
android:layout_weight="70"
android:id="#+id/camera_view"
android:layout_alignParentLeft="true"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="#+id/scanImage"
android:layout_below="#+id/camera_view"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="#drawable/ic_image_black_48dp"
android:layout_alignRight="#+id/camera_view"
android:layout_alignEnd="#+id/camera_view" />
</RelativeLayout>
Use Layout like above.
try this:
cameraView.requestFocus();
cameraView.setFocusableInTouchMode(true);
cameraView.setFocusable(true);
cameraView.requestFocus();
Above did not solved mine "focus" problem but i come a cross other solution which helped me:
private void setCamFocusMode(){
if(null == mCamera) {
return;
}
/* Set Auto focus */
Parameters parameters = mCamera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if(focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else
if(focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mCamera.setParameters(parameters);
}
oryginally posted here:
https://stackoverflow.com/a/27092999/6225516
If somebody still looking for this yet, I've solved it by adding .setAutoFocusEnabled(true) before .build, in the line:
BarcodeDetector barcodeDectector = new BarcodeDetector.Builder(this)
.setBarcodeFormats(Barcode.QR_CODE)
.build();*
i want to make a very simple application and I want to open the camera in a Relative Layout, but I see only a black screen instead of the camera.
The code i very simple
public class MainActivity extends AppCompatActivity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void button(android.view.View v){
android.hardware.Camera camera = android.hardware.Camera.open();
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.video);
SurfaceView surfaceView = new SurfaceView(getApplicationContext());
relativeLayout.addView(surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
} catch (IOException e) {};
}
}
How can I fix this?
With the code below you can open the camera when clicking on the button, take a picture and display it in your image view.
Don't forget to edit YOUR_PROJECT before testing/using it.
Your Java file:
package YOUR_PROJECT;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
ImageView iv;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initialize Image view and Buttons
iv = (ImageView) findViewById(R.id.imageView);
Button btnCapture = (Button) findViewById(R.id.button_camera);
//Set listener on Capture button
btnCapture.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent c = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //Implicit Intent
startActivityForResult(c, 0);
}
});
}
//Override method onActivityResult used to retreive the image
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bitmap m = (Bitmap) data.getExtras().get("data");
iv.setImageBitmap(m);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
}
}
Your XML:
<?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"
tools:context="YOUR_PROJECT.MainActivity">
<ImageView
android:id="#+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<Button
android:id="#+id/button_camera"
android:text="Camera"
android:layout_width="127dp"
android:layout_height="106dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>
I'm new to Android Application Development, I was trying to build a basic Flashlight app but seems like most of the libraries are deprecated. I have tried doing Camera.Parameters camera; but still not working. Log shows the Exception : Caused by: java.lang.RuntimeException: Fail to connect to camera service.AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>
MainActivity.java
package com.thenewboston.flashlight;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.hardware.Camera.Parameters;
public class MainActivity extends AppCompatActivity {
private android.hardware.Camera camera = null;
Parameters params;
Boolean isOn;
ImageButton imageButton;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageButton = (ImageButton) findViewById(R.id.imageButton);
Boolean isCameraFlash = getApplication().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA);
if(!isCameraFlash)
showNoCameraAlert();
else{
camera = android.hardware.Camera.open();
params = camera.getParameters();
}
}
private void showNoCameraAlert() {
new AlertDialog.Builder(this)
.setTitle("Error")
.setMessage("Sorry, your device doesn't support flash light!")
.setNeutralButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.show();
}
public void myButton(View view){
if (isOn){
setFlashOff();
}
else {
setFlashOn();
}
}
private void setFlashOn() {
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isOn = true;
}
private void setFlashOff() {
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isOn = false;
}
#Override
protected void onStop() {
super.onStop();
if(camera != null){
camera.release();
camera = null;
}
}
}
activity_main.xml
<?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:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
tools:context="com.thenewboston.flashlight.MainActivity"
android:background="#000000">
<ImageButton
android:layout_width="150dp"
android:layout_height="150dp"
android:id="#+id/imageButton"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="#drawable/mytoggle"
android:scaleType="fitCenter"
android:background="#null"
android:onClick="myButton" />
</RelativeLayout>
I know, I'm using outdated stuff in my code, but that's probably because I have not seen anyone building flashlight app for Marshmallow. If anyone can suggest new code it will be helpful or correct my code(given above) will be thankful.
I am trying to implement an activity which shows a camera preview and contains two buttons. Getting the camera preview is no problem but when I try findViewById for the button objects the app will crash. Not sure why that's happening.
package com.capstone.parking.nyc;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.graphics.PixelFormat ;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorManager;
public class MainScreen extends Activity implements SurfaceHolder.Callback
{
Camera theCamera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean preview = false;
private SensorManager mSensorManager;
private ShakeListener mSensorListener;
#Override
public void onCreate(Bundle savedInstanceState)
{
final Button TagBttn;
final Button ParkBttn;
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFormat(PixelFormat.UNKNOWN);
setContentView(R.layout.mainscreen);
/*
*
* This line causes the crash
*/
TagBttn = (Button) findViewById(R.id.tag);
// ParkBttn = (Button)findViewById(R.id.park);
surfaceView = (SurfaceView) findViewById(R.id.camera);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSensorListener = new ShakeListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
Log.d("TAG", "onCreate MainScreen");
mSensorListener.setOnShakeListener(new ShakeListener.OnShakeListener()
{
public void onShake()
{
Log.d("SHAKE CHECK", "YUSSSSSS");
// if shaken, go to the search screen
startActivity(new Intent("com.capstone.parking.SEARCH"));
}
});
/* Tag.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
/*
*
* ENTER TAG CODE HERE
*
*
Log.d("TAG", "tag button pressed");
}
});
/*
/* Park.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
/*
*
* ENTER PARK CODE HERE
*
*
Log.e("TAG", "park button pressed");
}
});
*/
}
#Override
public void onResume()
{
super.onResume();
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}
#Override
public void onStop()
{
mSensorManager.unregisterListener(mSensorListener);
super.onStop();
}
public void surfaceCreated(SurfaceHolder holder)
{
Log.e("TAG", "surfaceCreated");
theCamera = Camera.open();
try
{
theCamera.setPreviewDisplay(holder);
}
catch (IOException e)
{
Log.e("TAG", "surfaceCreated FAIL");
}
theCamera.startPreview();
preview = true;
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
Log.e("TAG", "surfaceChanged");
if(preview)
{
theCamera.stopPreview();
}
Camera.Parameters parameters = theCamera.getParameters();
parameters.setPreviewSize(width, height);
// parameters.set("orientation", "portrait");
// parameters.set("rotation", "90");
theCamera.setParameters(parameters);
theCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder)
{
if(preview)
{
Log.e("TAG", "surfaceDestroyed");
theCamera.stopPreview();
theCamera.release();
theCamera = null;
preview = false;
}
}
}
If anyone could guide me in the right direction I would greatly appreciate it. Thanks!
mainscreen.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/background"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#006699" >
<TextView
android:id="#+id/scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="#string/shake"
android:textColor="#ffff66"
android:textStyle="bold" />
<SurfaceView
android:id="#+id/camera"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_marginBottom="125dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp" >
</SurfaceView>
<ImageButton
android:id="#+id/tag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="25dp"
android:layout_marginBottom="50dp"
android:contentDescription="#string/desc"
android:background="#drawable/tagbuttonselect"
android:clickable="true" />
<ImageButton
android:id="#+id/park"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="25dp"
android:layout_marginBottom="50dp"
android:contentDescription="#string/desc"
android:background="#drawable/parkbuttonselect"
android:clickable="true" />
</RelativeLayout>
Edit**
Oh wow. I'm retarded. I just figured it out. I was using Button instead of ImageButton. SMH Sorry, guys. lol
Try changing TagBttn = (Button) findViewById(R.id.tag); to TagBttn = (ImageButton) findViewById(R.id.tag);
may be you are trying to find id is not in mainscreen.xml
here tag is an ImageButton no simole Button
try this
TagBttn = (ImageButton) findViewById(R.id.tag);
Your tag item is an ImageButton and you are casting it to a Button. Change it. ImageButton and Button are very different classes.
No matter how confusing it may sound, it turns out that ImageButton is not a subclass of Button. So you'd want to replace your code with:
final ImageButton TagBttn;
final ImageButton ParkBttn;
and then use:
TagBttn = (ImageButton) findViewById(R.id.tag);
ParkBttn = (ImageButton) findViewById(R.id.park);