github 当前下载地址:https://github.com/Arikes/CameraAndroid.git
类 MResource
package com.example.camerademo;
import android.content.Context;
public class MResource {
public static int getIdByName(Context context, String className, String name) {
String packageName = context.getPackageName();
Class r = null;
int id = 0;
try {
r = Class.forName(packageName + ".R");
Class[] classes = r.getClasses();
Class desireClass = null;
for (int i = 0; i < classes.length; ++i) {
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}
}
资源单位类MediaItem
package com.example.camerademo;
import org.json.JSONException;
import org.json.JSONObject;
public class MediaItem {
public enum MediaType {
PHOTO, MOVIE
} ;
public static final String MEDIA_ITEM="media_item";
private static final String ITEM_NAME="itemName";
private static final String ITEM_PATH="itemPath";
private static final String ITEM_ICONPATH="iconPath";
private static final String ITEM_MEDIATYPE="mediaType";
private String m_itemname;
private String m_itempath;
private String m_iconpath;
private MediaType m_mediaType;
public MediaItem(String itemname,String itempath,String iconpath,MediaType mediaType)
{
m_itemname=itemname;
m_itempath=itempath;
m_iconpath=iconpath;
m_mediaType=mediaType;
}
public String getItemname() {
return m_itemname;
}
public void setItemname(String itemname) {
m_itemname = itemname;
}
public String getItempath() {
return m_itempath;
}
public void setItempath(String itempath) {
m_itempath = itempath;
}
public String getIconpath() {
return m_iconpath;
}
public void setIconpath(String iconpath) {
m_iconpath = iconpath;
}
public MediaType getMediaType() {
return m_mediaType;
}
public void setMediaType(MediaType mediaType) {
m_mediaType = mediaType;
}
public JSONObject toJson() throws JSONException
{
JSONObject json = new JSONObject();
json.put(ITEM_NAME, m_itemname);
json.put(ITEM_PATH, m_itempath);
json.put(ITEM_ICONPATH, m_iconpath);
json.put(ITEM_MEDIATYPE, m_mediaType);
return json;
}
}
主类CameraCtr
package com.example.camerademo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.json.JSONArray;
import org.json.JSONException;
import com.example.camerademo.MediaItem.MediaType;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageButton;
public class CameraCtr extends Activity{
public static final String TAG="CameraCtr";
private ArrayList<MediaItem> mMedialist;
private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder holder;
private ImageButton mTake;
private ImageButton mPosition;
private ImageButton mRecord;
private ImageButton mFlash;
private ImageButton mZoom;
private Chronometer mRecordTimer;
private MediaRecorder mMediaRecorder;
private ImageButton mStopRecord;
private Button mMediaCount;
private boolean bVidoMode;
private boolean bFront;
private boolean hasflash;
private boolean bRecording;
private int curZoom;
private int mediaCount;
private float startX = 0.0f,startY = 0.0f,endX = 0.0f,endY = 0.0f;
private Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
}
};
private Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
String filename = "pic_"+newfilename()+".jpg";
// File file = new File(Environment.getExternalStoragePublicDirectory(
// Environment.DIRECTORY_DCIM), filename);
FileOutputStream os = null;
boolean success = true;
try{
os =CameraCtr.this.openFileOutput(filename,MODE_PRIVATE);
File mRecAudioFile = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
// File mRecAudioFile= new File(dir.getAbsolutePath()+File.separator+filename);
FileOutputStream fops = new FileOutputStream(mRecAudioFile);
fops.write(data);
fops.close();
}catch(Exception e)
{
Log.e(TAG, "ERRER WRITE to file "+filename,e);
success = false;
}
if(success)
{
Log.i(TAG, "JPEG saved at : "+filename);
mediaCount++;
mMediaCount.setText(String.valueOf(mediaCount));
}
MediaItem mediaitem= new MediaItem(filename,Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,MediaType.PHOTO);
mMedialist.add(mediaitem);
Log.i(TAG, getApplicationContext().getFilesDir().getAbsolutePath());
Log.i(TAG, getApplicationContext().getPackageResourcePath());
mCamera.startPreview();
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
mediaCount=0;
bFront = false;
hasflash = false;
bRecording=false;
bVidoMode = true;
curZoom = 1;
mMedialist = new ArrayList<MediaItem>();
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_camera);
setContentView(MResource.getIdByName(getApplication(), "layout", "activity_camera"));
// Environment.getExternalStorageDirectory().getPath()
// File file
String albumName="moVdo";
File dir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), albumName);
if(!dir.exists())
if(!dir.mkdir())
Log.e(TAG, "don't create dir");
else
Log.i(TAG, "DIR is created");
mRecordTimer = (Chronometer)findViewById(MResource.getIdByName(getApplication(), "id", "recordTimer"));
if(bVidoMode)
mRecordTimer.setVisibility(0x00000000);
mMediaCount=(Button)findViewById(MResource.getIdByName(getApplication(), "id", "media_count"));
// mTake = (ImageButton)findViewById(R.id.cameraBut);
mTake = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraBut"));
mTake.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN){
//更改为按下时的背景图片
v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cswitch"));
}else if(event.getAction() == MotionEvent.ACTION_UP){
//改为抬起时的图片
v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cswitch_down"));
}
return false;
}});
mTake.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// mCamera.takePicture(mShutterCallback, null, mJpegCallback);
if(bRecording)
return;
bVidoMode = !bVidoMode;
if(bVidoMode)
{
mRecordTimer.setVisibility(0x00000000);
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
}
else
{
mRecordTimer.setVisibility(0x00000004);//0x00000004
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cphoto"));
}
}
});
// mFlash =(ImageButton)findViewById(R.id.cameraFlash);
mFlash = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraFlash"));
// if(hasflash)
// mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_on"));
// else
// mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_off"));
mFlash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(hasflash)
turnOfflight();
else
turnOnlight();
hasflash=!hasflash;
// if(hasflash)
// mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_on"));
// else
// mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_off"));
}
});
// mZoom = (ImageButton)findViewById(R.id.cameraZoom);
mZoom = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraZoom"));
mZoom.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN){
//更改为按下时的背景图片
v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cback_down"));
}else if(event.getAction() == MotionEvent.ACTION_UP){
//改为抬起时的图片
v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cback"));
}
return false;
}
});
// mZoom.setText(String.valueOf(curZoom));
mZoom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// setZoom();
finish();
}
});
// mPosition = (ImageButton)findViewById(R.id.cameraPosition);
mPosition = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraPosition"));
mPosition.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
int camera_num = Camera.getNumberOfCameras();
if(camera_num<=1)
return;
mCamera.stopPreview();
mCamera.release();
mCamera = null;
try{
if(bFront)
mCamera = Camera.open(0);
else
mCamera = Camera.open(1);
}catch(Exception e)
{
mCamera.stopPreview();
mCamera.release();
mCamera = null;
return;
}
bFront=!bFront;
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Camera.Parameters parameters = mCamera.getParameters();
if(parameters==null)
return ;
int maxZoom=parameters.getMaxZoom();
curZoom=parameters.getZoom();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
});
// mRecord = (ImageButton)findViewById(R.id.cameraRecord);
mRecord = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraRecord"));
if(bVidoMode)
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
else
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cphoto"));
mRecord.setOnClickListener(new View.OnClickListener() {
private File mRecAudioFile;
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(bVidoMode)
{
if(bRecording)
{
//is recording ,need to stop
// if(mediaCount<=2)
// return;
mMediaRecorder.stop();
mRecordTimer.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mCamera.lock();
bRecording=false;
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
mPosition.setEnabled(!bRecording);
}
else
{
//could start record movie
prepareVideoRecorder();
mMediaRecorder.start();
bRecording=true;
mPosition.setEnabled(!bRecording);
mRecordTimer.setBase(SystemClock.elapsedRealtime());
mRecordTimer.start();
mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideopress"));
}
}
else
{
mCamera.takePicture(mShutterCallback, null, mJpegCallback);
}
}
});
// mSurfaceView = (SurfaceView)findViewById(R.id.camera_surfaceView);
mSurfaceView = (SurfaceView)findViewById(MResource.getIdByName(getApplication(), "id", "camera_surfaceView"));
mSurfaceView.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction()==MotionEvent.ACTION_DOWN) {
startX=event.getX();
startY = event.getY();
Log.d("aaa", "down pressed");
return true;
}
else if(event.getAction()==MotionEvent.ACTION_MOVE)
{
Log.i(TAG, Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString());
endX=event.getX();
endY=event.getY();
Log.d("curVAlue", "startX:"+(String.valueOf(startX))+"startY:"+String.valueOf(startY));
Log.d("curVAlue", "endX:"+(String.valueOf(endX))+"endY:"+String.valueOf(endY));
if(endY>startY)
zoomSub();
else
zoomAdd();
return true;
}
else if(event.getAction()==MotionEvent.ACTION_UP)
{
endX=event.getX();
endY=event.getY();
if(startX==endX && startY==endY)
{
if (mCamera != null) {
Rect rect = new Rect();
rect.set((int)startX-15, (int)startY-15, (int)startX+15, (int)(startY+15));
Parameters parameters = mCamera.getParameters();
parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
// parameters.setFocusAreas(Lists.newArrayList(new Camera.Area(rect, 500)));
mCamera.setParameters(parameters);
mCamera.autoFocus(null);
}
}
return true;
}
return true;
}
});
holder = mSurfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
if(mCamera != null)
mCamera.stopPreview();
}
//
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-g/ enerated method stub
try
{
if(mCamera != null){
mCamera.setPreviewDisplay(holder);
}
}catch (IOException exception)
{
Log.e(TAG, "eRRER setting up preview display",exception);
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
if(mCamera == null) return;
mCamera.startPreview();
}
});
}
@Override
public void onResume()
{
bRecording=false;
Intent data = new Intent();
data.putExtra(TAG, 1);
this.setResult(1, data);
super.onResume();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD)
{
try{
if(!bFront)
{
mCamera = Camera.open(0);
}
else
{
mCamera = Camera.open(1);
}
}catch(Exception e)
{
return;
}
}
else
{
try{
mCamera = Camera.open();}catch(Exception e)
{
return ;
}
if(mCamera == null)
return;
}
}
@Override
public void onPause()
{
try {
toJson();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onPause();
if(mCamera != null)
{
mCamera.release();
mCamera = null;
}
}
private boolean prepareVideoRecorder()
{
String albumName="moVdo";
File dir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), albumName);
if(!dir.exists())
if(!dir.mkdir())
Log.e(TAG, "don't create dir");
else
Log.i(TAG, "DIR is created");
if(mCamera != null)
{
mCamera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.reset();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
if(!bFront)
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
else
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
String filename ="video"+newfilename()+".mp4";
mMediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
MediaItem mediaitem= new MediaItem(filename,Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,MediaType.MOVIE);
mediaCount++;
mMediaCount.setText(String.valueOf(mediaCount));
mMedialist.add(mediaitem);
mMediaRecorder.setPreviewDisplay(holder.getSurface());
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mCamera.lock();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mCamera.lock();
return false;
}
return true;
}
return false;
}
public void turnOnlight()
{
if(bFront)
return;
if(mCamera != null)
{
Camera.Parameters parameters = mCamera.getParameters();
if(parameters ==null)
return;
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if(flashMode==null)
return;
if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
// Turn on the flash
if (flashModes.contains(Parameters.FLASH_MODE_TORCH))
{
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
}
else
{
}
}
}
}
public void turnOfflight()
{
if(bFront)
return;
if(mCamera != null)
{
Camera.Parameters parameters = mCamera.getParameters();
if(parameters ==null)
return;
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if(flashMode==null)
return;
if (!Parameters.FLASH_MODE_OFF.equals(flashMode)) {
// Turn on the flash
if (flashModes.contains(Parameters.FLASH_MODE_OFF)) {
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
} else {
Log.e(TAG, "FLASH_MODE_OFF not supported");
}
}
}
}
public void zoomAdd()
{
if(mCamera ==null)
return;
Camera.Parameters parameters = mCamera.getParameters();
if(parameters==null)
return;
int maxZoom=parameters.getMaxZoom();
int curZoom=parameters.getZoom();
if(curZoom<maxZoom)
{
curZoom++;
parameters.setZoom(curZoom);
mCamera.setParameters(parameters);
return;
}
}
public void zoomSub()
{
if(mCamera ==null)
return;
Camera.Parameters parameters = mCamera.getParameters();
if(parameters==null)
return;
int curZoom=parameters.getZoom();
if(curZoom>1)
{
curZoom--;
parameters.setZoom(curZoom);
mCamera.setParameters(parameters);
return;
}
}
private void setFocus(boolean bFocus)
{
if(mCamera!=null)
{
Camera.Parameters parameters = mCamera.getParameters();
if(bFocus)
parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
else
parameters.setFocusMode(Parameters.FOCUS_MODE_MACRO);;
// parameters.setFocusAreas(focusAreas);
// parameters.setFocusMode();
mCamera.setParameters(parameters);
}
}
private boolean toJson() throws JSONException
{
String filename = "movdoMedia.js";
boolean success = false;
try{
File mJsonFile = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
FileOutputStream fops = new FileOutputStream(mJsonFile);
JSONArray js_mediaArray= new JSONArray();
if(mMedialist.isEmpty())
{
fops.write(js_mediaArray.toString().getBytes());
fops.close();
return true;
}
for(MediaItem item:mMedialist)
{
js_mediaArray.put(item.toJson());
}
fops.write(js_mediaArray.toString().getBytes());
fops.close();
}catch(Exception e)
{
Log.e(TAG, "ERRER WRITE to file "+filename,e);
success = false;
}
return true;
}
private String newfilename()
{
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String str=new String();
str=df.format(new Date());
return str;
}
}
按钮 圆形配置文件
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 填充的颜色 -->
<solid android:color="#F5FFFA"/>
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="360dip"/>
<!-- padding: Button 里面的文字与Button边界的间隔 -->
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp"
/>
</shape>