Created
September 25, 2014 09:19
-
-
Save Geal/003b9c3be4c223ad619d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package epsi.com.phototest; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.content.pm.PackageManager; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
import android.hardware.Camera; | |
import android.media.MediaScannerConnection; | |
import android.net.Uri; | |
import android.os.Bundle; | |
import android.os.Environment; | |
import android.provider.MediaStore; | |
import android.util.Log; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.view.SurfaceHolder; | |
import android.view.SurfaceView; | |
import android.view.View; | |
import android.widget.Button; | |
import android.widget.FrameLayout; | |
import java.io.File; | |
import java.io.FileNotFoundException; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
public class MainCameraActivity extends Activity { | |
private Camera mCamera; | |
private CameraPreview mPreview; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main_camera); | |
// Create an instance of Camera | |
mCamera = getCameraInstance(); | |
// Create our Preview view and set it as the content of our activity. | |
mPreview = new CameraPreview(this, mCamera); | |
FrameLayout preview = (FrameLayout) findViewById(R.id.mainCameraPreview); | |
preview.addView(mPreview); | |
Button btn = (Button) findViewById(R.id.mainCameraCapture); | |
btn.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
mCamera.takePicture(null, null, mPicture); | |
} | |
}); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
getMenuInflater().inflate(R.menu.main_camera, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
// Handle action bar item clicks here. The action bar will | |
// automatically handle clicks on the Home/Up button, so long | |
// as you specify a parent activity in AndroidManifest.xml. | |
int id = item.getItemId(); | |
if (id == R.id.action_settings) { | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
private boolean checkCameraHardware(Context context) { | |
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { | |
// this device has a camera | |
return true; | |
} else { | |
// no camera on this device | |
return false; | |
} | |
} | |
public static Camera getCameraInstance() { | |
Camera c = null; | |
try { | |
c = Camera.open(); // attempt to get a Camera instance | |
} catch (Exception e) { | |
// Camera is not available (in use or does not exist) | |
} | |
return c; // returns null if camera is unavailable | |
} | |
@Override | |
protected void onPause() { | |
super.onPause(); | |
//releaseMediaRecorder(); // if you are using MediaRecorder, release it first | |
releaseCamera(); // release the camera immediately on pause event | |
} | |
private void releaseCamera() { | |
if (mCamera != null) { | |
mCamera.release(); // release the camera for other applications | |
mCamera = null; | |
} | |
} | |
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { | |
private SurfaceHolder mHolder; | |
private Camera mCamera; | |
public CameraPreview(Context context, Camera camera) { | |
super(context); | |
mCamera = camera; | |
// Install a SurfaceHolder.Callback so we get notified when the | |
// underlying surface is created and destroyed. | |
mHolder = getHolder(); | |
mHolder.addCallback(this); | |
// deprecated setting, but required on Android versions prior to 3.0 | |
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); | |
} | |
public void surfaceCreated(SurfaceHolder holder) { | |
// The Surface has been created, now tell the camera where to draw the preview. | |
try { | |
mCamera.setPreviewDisplay(holder); | |
mCamera.startPreview(); | |
} catch (IOException e) { | |
Log.d("Phototest", "Error setting camera preview: " + e.getMessage()); | |
} | |
} | |
public void surfaceDestroyed(SurfaceHolder holder) { | |
// empty. Take care of releasing the Camera preview in your activity. | |
} | |
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { | |
// If your preview can change or rotate, take care of those events here. | |
// Make sure to stop the preview before resizing or reformatting it. | |
if (mHolder.getSurface() == null) { | |
// preview surface does not exist | |
return; | |
} | |
// stop preview before making changes | |
try { | |
mCamera.stopPreview(); | |
} catch (Exception e) { | |
// ignore: tried to stop a non-existent preview | |
} | |
// set preview size and make any resize, rotate or | |
// reformatting changes here | |
// start preview with new settings | |
try { | |
mCamera.setPreviewDisplay(mHolder); | |
mCamera.startPreview(); | |
} catch (Exception e) { | |
Log.d("PhotoTest", "Error starting camera preview: " + e.getMessage()); | |
} | |
} | |
} | |
private Camera.PictureCallback mPicture = new Camera.PictureCallback() { | |
@Override | |
public void onPictureTaken(byte[] data, Camera camera) { | |
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); | |
if (pictureFile == null) { | |
Log.d("PhotoTest", "Error creating media file, check storage permissions"); | |
return; | |
} | |
try { | |
FileOutputStream fos = new FileOutputStream(pictureFile); | |
fos.write(data); | |
fos.close(); | |
String filepath = pictureFile.getAbsolutePath(); | |
Bitmap myBitmap = BitmapFactory.decodeFile(filepath); | |
MediaStore.Images.Media.insertImage(getContentResolver(), myBitmap, "PhotoTest", "taken with intent camera"); | |
MediaScannerConnection.scanFile(MainCameraActivity.this, new String[]{filepath}, null, null); | |
} catch (FileNotFoundException e) { | |
Log.d("PhotoTest", "File not found: " + e.getMessage()); | |
} catch (IOException e) { | |
Log.d("PhotoTest", "Error accessing file: " + e.getMessage()); | |
} | |
} | |
}; | |
public static final int MEDIA_TYPE_IMAGE = 1; | |
public static final int MEDIA_TYPE_VIDEO = 2; | |
/** | |
* Create a file Uri for saving an image or video | |
*/ | |
private static Uri getOutputMediaFileUri(int type) { | |
return Uri.fromFile(getOutputMediaFile(type)); | |
} | |
/** | |
* Create a File for saving an image or video | |
*/ | |
private static File getOutputMediaFile(int type) { | |
// 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), "PhotoTest"); | |
// 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("PhotoTest", "failed to create directory"); | |
return null; | |
} | |
} | |
// Create a media file name | |
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); | |
File mediaFile; | |
if (type == MEDIA_TYPE_IMAGE) { | |
mediaFile = new File(mediaStorageDir.getPath() + File.separator + | |
"IMG_" + timeStamp + ".jpg"); | |
} else if (type == MEDIA_TYPE_VIDEO) { | |
mediaFile = new File(mediaStorageDir.getPath() + File.separator + | |
"VID_" + timeStamp + ".mp4"); | |
} else { | |
return null; | |
} | |
Log.v("PhotoTest", "storing at " + mediaFile.getAbsolutePath()); | |
return mediaFile; | |
} | |
} |
yes, do not use 6 year old code, it is not maintained
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
i tried this code, but after installing it is showing application has stopped. any suggestion?