android摄像头开发

来源:互联网 发布:php文件上传 编辑:程序博客网 时间:2024/05/18 00:28

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() {@Overridepublic void onShutter() {// TODO Auto-generated method stub}};private Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// TODO Auto-generated method stubString 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();}};@Overridepublic 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 fileString 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");elseLog.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(){@Overridepublic 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() {@Overridepublic 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);//0x00000004mRecord.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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif(hasflash)turnOfflight();elseturnOnlight();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(){@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubint camera_num = Camera.getNumberOfCameras();if(camera_num<=1)return;mCamera.stopPreview();mCamera.release();mCamera = null;try{if(bFront)mCamera = Camera.open(0);elsemCamera = 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 blocke.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"));elsemRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cphoto"));mRecord.setOnClickListener(new View.OnClickListener() {private File mRecAudioFile;@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif(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 movieprepareVideoRecorder();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(){@Overridepublic 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() {@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stubif(mCamera != null)mCamera.stopPreview();}//@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// TODO Auto-g/                                                                                                                                                                                                                                                                                                                                      enerated method stubtry{if(mCamera != null){mCamera.setPreviewDisplay(holder);}}catch (IOException exception){Log.e(TAG, "eRRER setting up preview display",exception);}}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {// TODO Auto-generated method stubif(mCamera == null) return;mCamera.startPreview();}});}@Overridepublic 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;}}@Overridepublic void onPause(){try {toJson();} catch (JSONException e) {// TODO Auto-generated catch blocke.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");elseLog.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 flashif (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 flashif (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);elseparameters.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"?><shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><!-- 填充的颜色 --><solid android:color="#F5FFFA"/><!-- 设置按钮的四个角为弧形 --><!-- android:radius 弧形的半径 --><corners android:radius="360dip"/><!-- padding: Button 里面的文字与Button边界的间隔 --><paddingandroid:left="10dp"android:top="10dp"android:right="10dp"android:bottom="10dp"/></shape>


0 0
原创粉丝点击