1.Add these in your Main Activity
public class MainActivity extends Activity {
private static final int REQ_CAMERA_IMAGE = 456;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String message = "Click the button below to start";
if(cameraNotDetected()){
message = "No camera detected, clicking the button below will have unexpected behaviour.";
}
TextView cameraDescriptionTextView = (TextView) findViewById(R.id.text_view_camera_description);
cameraDescriptionTextView.setText(message);
}
private boolean cameraNotDetected() {
return !getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
@FromXML
public void onUseCameraClick(View button){
Intent intent = new Intent(this, CameraActivity.class);
startActivityForResult(intent, REQ_CAMERA_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQ_CAMERA_IMAGE && resultCode == RESULT_OK){
String imgPath = data.getStringExtra(CameraActivity.EXTRA_IMAGE_PATH);
Log.i("Got image path: "+ imgPath);
displayImage(imgPath);
} else
if(requestCode == REQ_CAMERA_IMAGE && resultCode == RESULT_CANCELED){
Log.i("User didn't take an image");
}
}
private void displayImage(String path) {
ImageView imageView = (ImageView) findViewById(R.id.image_view_captured_image);
imageView.setImageBitmap(BitmapHelper.decodeSampledBitmap(path, 300, 250));
}
}
2.Create Class CameraActivity
public class CameraActivity extends Activity implements PictureCallback {
protected static final String EXTRA_IMAGE_PATH = "EXTRA_IMAGE_PATH";
private Camera camera;
private CameraPreview cameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
setResult(RESULT_CANCELED);
// Camera may be in use by another activity or the system or not available at all
camera = getCameraInstance();
if(cameraAvailable(camera)){
initCameraPreview();
} else {
finish();
}
}
// Show the camera view on the activity
private void initCameraPreview() {
cameraPreview = (CameraPreview) findViewById(R.id.camera_preview);
cameraPreview.init(camera);
}
@FromXML
public void onCaptureClick(View button){
// Take a picture with a callback when the photo has been created
// Here you can add callbacks if you want to give feedback when the picture is being taken
camera.takePicture(null, null, this);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d("Picture taken");
String path = savePictureToFileSystem(data);
setResult(path);
finish();
}
private static String savePictureToFileSystem(byte[] data) {
File file = getOutputMediaFile();
saveToFile(data, file);
return file.getAbsolutePath();
}
private void setResult(String path) {
Intent intent = new Intent();
intent.putExtra(EXTRA_IMAGE_PATH, path);
setResult(RESULT_OK, intent);
}
// ALWAYS remember to release the camera when you are finished
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
private void releaseCamera() {
if(camera != null){
camera.release();
camera = null;
}
}
}
3.Create Class CameraPreview
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera camera;
private SurfaceHolder holder;
public CameraPreview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CameraPreview(Context context) {
super(context);
}
public void init(Camera camera) {
this.camera = camera;
initSurfaceHolder();
}
@SuppressWarnings("deprecation") // needed for < 3.0
private void initSurfaceHolder() {
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera(holder);
}
private void initCamera(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
Log.d("Error setting camera preview", e);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
4.Create Class BitmapHelper
public class BitmapHelper {
public static Bitmap decodeSampledBitmap(String path, int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = BitmapHelper.calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
}
5.Create Class CameraHelper
public class CameraHelper {
public static boolean cameraAvailable(Camera camera) {
return camera != null;
}
public static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
// Camera is not available or doesn't exist
Log.d("getCamera failed", e);
}
return c;
}
}
6.Create Class MediaHelper
public class MediaHelper {
public static File getOutputMediaFile(){
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Spike");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = new File(mediaStorageDir.getPath() + File.separator +"IMG_"+ timeStamp +".jpg");
return mediaFile;
}
public static boolean saveToFile(byte[] bytes, File file){
boolean saved = false;
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
saved = true;
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", e);
} catch (IOException e) {
Log.e("IOException", e);
}
return saved;
}
}
7.Create Class Log
public class Log {
private static final String TAG = "CameraCheck";
public static void d(String msg) {
d(msg, null);
}
public static void d(String msg, Throwable e) {
android.util.Log.d(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void i(String msg) {
i(msg, null);
}
public static void i(String msg, Throwable e) {
android.util.Log.i(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void e(String msg) {
e(msg, null);
}
public static void e(String msg, Throwable e) {
android.util.Log.e(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void v(String msg) {
android.util.Log.v(TAG, Thread.currentThread().getName() + "| " + msg);
}
public static String identifyMessage(Resources res, Message msg) {
try {
return res.getResourceEntryName(msg.what);
} catch (NotFoundException ignore) {
return "not found";
}
}
public static void w(String msg) {
android.util.Log.w(TAG, Thread.currentThread().getName() + "| " + msg);
}
/**
* Use this when you want to debug a String that is too long to be printed in one Log line.
* This will print the string breaking it up into 500 character segments
*
* @param msg
*/
public static void debugLongString(String msg) {
StringBuffer b = new StringBuffer();
char[] c = msg.toCharArray();
int x = 0;
for (int i = 0; i < c.length; i++) {
b.append(c[i]);
if (x++ == 500) {
d(b.toString());
b = new StringBuffer();
x = 0;
}
}
d(b.toString());
}
}
8.Add permission in manifest file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.camera.snap"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.camera.snap.ui.MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.camera.snap.ui.CameraActivity"
android:label="@string/title_activity_camera"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" />
</application>
</manifest>
public class MainActivity extends Activity {
private static final int REQ_CAMERA_IMAGE = 456;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String message = "Click the button below to start";
if(cameraNotDetected()){
message = "No camera detected, clicking the button below will have unexpected behaviour.";
}
TextView cameraDescriptionTextView = (TextView) findViewById(R.id.text_view_camera_description);
cameraDescriptionTextView.setText(message);
}
private boolean cameraNotDetected() {
return !getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
@FromXML
public void onUseCameraClick(View button){
Intent intent = new Intent(this, CameraActivity.class);
startActivityForResult(intent, REQ_CAMERA_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQ_CAMERA_IMAGE && resultCode == RESULT_OK){
String imgPath = data.getStringExtra(CameraActivity.EXTRA_IMAGE_PATH);
Log.i("Got image path: "+ imgPath);
displayImage(imgPath);
} else
if(requestCode == REQ_CAMERA_IMAGE && resultCode == RESULT_CANCELED){
Log.i("User didn't take an image");
}
}
private void displayImage(String path) {
ImageView imageView = (ImageView) findViewById(R.id.image_view_captured_image);
imageView.setImageBitmap(BitmapHelper.decodeSampledBitmap(path, 300, 250));
}
}
2.Create Class CameraActivity
public class CameraActivity extends Activity implements PictureCallback {
protected static final String EXTRA_IMAGE_PATH = "EXTRA_IMAGE_PATH";
private Camera camera;
private CameraPreview cameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
setResult(RESULT_CANCELED);
// Camera may be in use by another activity or the system or not available at all
camera = getCameraInstance();
if(cameraAvailable(camera)){
initCameraPreview();
} else {
finish();
}
}
// Show the camera view on the activity
private void initCameraPreview() {
cameraPreview = (CameraPreview) findViewById(R.id.camera_preview);
cameraPreview.init(camera);
}
@FromXML
public void onCaptureClick(View button){
// Take a picture with a callback when the photo has been created
// Here you can add callbacks if you want to give feedback when the picture is being taken
camera.takePicture(null, null, this);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d("Picture taken");
String path = savePictureToFileSystem(data);
setResult(path);
finish();
}
private static String savePictureToFileSystem(byte[] data) {
File file = getOutputMediaFile();
saveToFile(data, file);
return file.getAbsolutePath();
}
private void setResult(String path) {
Intent intent = new Intent();
intent.putExtra(EXTRA_IMAGE_PATH, path);
setResult(RESULT_OK, intent);
}
// ALWAYS remember to release the camera when you are finished
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
private void releaseCamera() {
if(camera != null){
camera.release();
camera = null;
}
}
}
3.Create Class CameraPreview
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera camera;
private SurfaceHolder holder;
public CameraPreview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CameraPreview(Context context) {
super(context);
}
public void init(Camera camera) {
this.camera = camera;
initSurfaceHolder();
}
@SuppressWarnings("deprecation") // needed for < 3.0
private void initSurfaceHolder() {
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera(holder);
}
private void initCamera(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
Log.d("Error setting camera preview", e);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
4.Create Class BitmapHelper
public class BitmapHelper {
public static Bitmap decodeSampledBitmap(String path, int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = BitmapHelper.calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
}
5.Create Class CameraHelper
public class CameraHelper {
public static boolean cameraAvailable(Camera camera) {
return camera != null;
}
public static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
// Camera is not available or doesn't exist
Log.d("getCamera failed", e);
}
return c;
}
}
6.Create Class MediaHelper
public class MediaHelper {
public static File getOutputMediaFile(){
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Spike");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = new File(mediaStorageDir.getPath() + File.separator +"IMG_"+ timeStamp +".jpg");
return mediaFile;
}
public static boolean saveToFile(byte[] bytes, File file){
boolean saved = false;
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
saved = true;
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", e);
} catch (IOException e) {
Log.e("IOException", e);
}
return saved;
}
}
7.Create Class Log
public class Log {
private static final String TAG = "CameraCheck";
public static void d(String msg) {
d(msg, null);
}
public static void d(String msg, Throwable e) {
android.util.Log.d(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void i(String msg) {
i(msg, null);
}
public static void i(String msg, Throwable e) {
android.util.Log.i(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void e(String msg) {
e(msg, null);
}
public static void e(String msg, Throwable e) {
android.util.Log.e(TAG, Thread.currentThread().getName() + "| " + msg, e);
}
public static void v(String msg) {
android.util.Log.v(TAG, Thread.currentThread().getName() + "| " + msg);
}
public static String identifyMessage(Resources res, Message msg) {
try {
return res.getResourceEntryName(msg.what);
} catch (NotFoundException ignore) {
return "not found";
}
}
public static void w(String msg) {
android.util.Log.w(TAG, Thread.currentThread().getName() + "| " + msg);
}
/**
* Use this when you want to debug a String that is too long to be printed in one Log line.
* This will print the string breaking it up into 500 character segments
*
* @param msg
*/
public static void debugLongString(String msg) {
StringBuffer b = new StringBuffer();
char[] c = msg.toCharArray();
int x = 0;
for (int i = 0; i < c.length; i++) {
b.append(c[i]);
if (x++ == 500) {
d(b.toString());
b = new StringBuffer();
x = 0;
}
}
d(b.toString());
}
}
8.Add permission in manifest file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.camera.snap"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.camera.snap.ui.MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.camera.snap.ui.CameraActivity"
android:label="@string/title_activity_camera"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" />
</application>
</manifest>
Hello Nikhil , This is not customized camera , You are using inbuilt functionality of android.
ReplyDelete