现在的位置: 首页 > 综合 > 正文

android 录像和拍照功能

2014年12月12日 ⁄ 综合 ⁄ 共 17717字 ⁄ 字号 评论关闭

先在
manifest 里添加权限

  1. <uses-permission android:name="android.permission.CAMERA" />
  2. <!-- 调用摄像头权限 -->
  3.     <uses-permission android:name="android.permission.RECORD_AUDIO" />
  4. <!-- 录制视频/音频权限 -->
  5.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. <!-- sd卡读写权限 -->
  7.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  8. <!-- 挂载sd卡 -->

复制代码

layout
布局预览窗口 camera.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent" >

  5.     <SurfaceView
  6.         android:id="@+id/arc_hf_video_view"
  7.         android:layout_width="fill_parent"
  8.         android:layout_height="fill_parent" />

  9.     <TextView
  10.         android:id="@+id/arc_hf_video_timer"
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:layout_margin="40dp"
  14.         android:textColor="#ffff0000"
  15.         android:textSize="35dp"
  16.         android:textStyle="bold" >
  17.     </TextView>

  18.     <LinearLayout
  19.         android:id="@+id/arc_hf_video_btn"
  20.         android:layout_width="wrap_content"
  21.         android:layout_height="fill_parent"
  22.         android:layout_alignParentRight="true"
  23.         android:gravity="center"
  24.         android:orientation="vertical" >

  25.         <Button
  26.             android:id="@+id/arc_hf_video_start"
  27.             android:layout_width="wrap_content"
  28.             android:layout_height="wrap_content"
  29.             android:background="@drawable/arc_hf_btn_video_start" />

  30.         <Button
  31.             android:id="@+id/arc_hf_img_start"
  32.             android:layout_width="wrap_content"
  33.             android:layout_height="wrap_content"
  34.             android:background="@drawable/arc_hf_btn_img" />
  35.     </LinearLayout>

  36. </RelativeLayout>

复制代码

主Activity
MCamera.java

  1. public class MCamera extends Activity {
  2.     private Button mVideoStartBtn;
  3.     private SurfaceView mSurfaceview;
  4.     private MediaRecorder mMediaRecorder;
  5.     private SurfaceHolder mSurfaceHolder;
  6.     private File mRecVedioPath;
  7.     private File mRecAudioFile;
  8.     private TextView timer;
  9.     private int hour = 0;
  10.     private int minute = 0;
  11.     private int second = 0;
  12.     private boolean bool;
  13.     private int parentId;
  14.     protected Camera camera;
  15.     protected boolean isPreview;
  16.     private Drawable iconStart;
  17.     private Drawable iconStop;
  18.     private boolean isRecording = true; // true表示没有录像,点击开始;false表示正在录像,点击暂停

  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         /*
  23.          * 全屏显示
  24.          */
  25.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  26.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  27.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
  28.         getWindow().setFormat(PixelFormat.TRANSLUCENT);
  29.         setContentView(R.layout.map_video);
  30.         iconStart = getResources().getDrawable(
  31.                 R.drawable.arc_hf_btn_video_start);
  32.         iconStop = getResources().getDrawable(R.drawable.arc_hf_btn_video_stop);

  33.         parentId = getIntent().getIntExtra("parentId", 0);
  34.         timer = (TextView) findViewById(R.id.arc_hf_video_timer);
  35.         mVideoStartBtn = (Button) findViewById(R.id.arc_hf_video_start);
  36.         mSurfaceview = (SurfaceView) this.findViewById(R.id.arc_hf_video_view);

  37.         // 设置计时器不可见
  38.         timer.setVisibility(View.GONE);

  39.         // 设置缓存路径
  40.         mRecVedioPath = new File(Environment.getExternalStorageDirectory()
  41.                 .getAbsolutePath() + "/hfdatabase/video/temp/");
  42.         if (!mRecVedioPath.exists()) {
  43.             mRecVedioPath.mkdirs();
  44.         }

  45.         // 绑定预览视图
  46.         SurfaceHolder holder = mSurfaceview.getHolder();
  47.         holder.addCallback(new Callback() {

  48.             @Override
  49.             public void surfaceDestroyed(SurfaceHolder holder) {
  50.                 if (camera != null) {
  51.                     if (isPreview) {
  52.                         camera.stopPreview();
  53.                         isPreview = false;
  54.                     }
  55.                     camera.release();
  56.                     camera = null; // 记得释放
  57.                 }
  58.                 mSurfaceview = null;
  59.                 mSurfaceHolder = null;
  60.                 mMediaRecorder = null;
  61.             }

  62.             @Override
  63.             public void surfaceCreated(SurfaceHolder holder) {
  64.                 try {
  65.                     camera = Camera.open();
  66.                     Camera.Parameters parameters = camera.getParameters();
  67.                     parameters.setPreviewFrameRate(5); // 每秒5帧
  68.                     parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  69.                     parameters.set("jpeg-quality", 85);// 照片质量
  70.                     camera.setParameters(parameters);
  71.                     camera.setPreviewDisplay(holder);
  72.                     camera.startPreview();
  73.                     isPreview = true;
  74.                 } catch (Exception e) {
  75.                     e.printStackTrace();
  76.                 }
  77.                 mSurfaceHolder = holder;
  78.             }

  79.             @Override
  80.             public void surfaceChanged(SurfaceHolder holder, int format,
  81.                     int width, int height) {
  82.                 mSurfaceHolder = holder;
  83.             }
  84.         });
  85.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  86.         mVideoStartBtn.setOnClickListener(new Button.OnClickListener() {

  87.             @Override
  88.             public void onClick(View v) {
  89.                 if (isRecording) {
  90.                     /*
  91.                      * 点击开始录像
  92.                      */
  93.                     if (isPreview) {
  94.                         camera.stopPreview();
  95.                         camera.release();
  96.                         camera = null;
  97.                     }
  98.                     second = 0;
  99.                     minute = 0;
  100.                     hour = 0;
  101.                     bool = true;
  102.                     if (mMediaRecorder == null)
  103.                         mMediaRecorder = new MediaRecorder();
  104.                     else
  105.                         mMediaRecorder.reset();
  106.                     mMediaRecorder.setPreviewDisplay(mSurfaceHolder
  107.                             .getSurface());
  108.                     mMediaRecorder
  109.                             .setVideoSource(MediaRecorder.VideoSource.CAMERA);
  110.                     mMediaRecorder
  111.                             .setAudioSource(MediaRecorder.AudioSource.MIC);
  112.                     mMediaRecorder
  113.                             .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  114.                     mMediaRecorder
  115.                             .setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  116.                     mMediaRecorder
  117.                             .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  118.                     mMediaRecorder.setVideoSize(320, 240);
  119.                     mMediaRecorder.setVideoFrameRate(15);
  120.                     try {
  121.                         mRecAudioFile = File.createTempFile("Vedio", ".3gp",
  122.                                 mRecVedioPath);
  123.                     } catch (IOException e) {
  124.                         e.printStackTrace();
  125.                     }
  126.                     mMediaRecorder.setOutputFile(mRecAudioFile
  127.                             .getAbsolutePath());
  128.                     try {
  129.                         mMediaRecorder.prepare();
  130.                         timer.setVisibility(View.VISIBLE);
  131.                         handler.postDelayed(task, 1000);
  132.                         mMediaRecorder.start();
  133.                     } catch (Exception e) {
  134.                         e.printStackTrace();
  135.                     }
  136.                     showMsg("开始录制");
  137.                     mVideoStartBtn.setBackgroundDrawable(iconStop);
  138.                     isRecording = !isRecording;
  139.                 } else {
  140.                     /*
  141.                      * 点击停止
  142.                      */
  143.                     try {
  144.                         bool = false;
  145.                         mMediaRecorder.stop();
  146.                         timer.setText(format(hour) + ":" + format(minute) + ":"
  147.                                 + format(second));
  148.                         mMediaRecorder.release();
  149.                         mMediaRecorder = null;
  150.                         videoRename();
  151.                     } catch (Exception e) {
  152.                         e.printStackTrace();
  153.                     }
  154.                     isRecording = !isRecording;
  155.                     mVideoStartBtn.setBackgroundDrawable(iconStart);
  156.                     showMsg("录制完成,已保存");

  157.                     try {
  158.                         camera = Camera.open();
  159.                         Camera.Parameters parameters = camera.getParameters();
  160.                         parameters.setPreviewFrameRate(5); // 每秒5帧
  161.                         parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  162.                         parameters.set("jpeg-quality", 85);// 照片质量
  163.                         camera.setParameters(parameters);
  164.                         camera.setPreviewDisplay(mSurfaceHolder);
  165.                         camera.startPreview();
  166.                         isPreview = true;
  167.                     } catch (Exception e) {
  168.                         e.printStackTrace();
  169.                     }
  170.                 }
  171.             }
  172.         });
  173.         Button btnImgStart = (Button) findViewById(R.id.arc_hf_img_start);
  174.         btnImgStart.setOnClickListener(new OnClickListener() {

  175.             @Override
  176.             public void onClick(View v) {
  177.                 if (mMediaRecorder != null) {
  178.                     try {
  179.                         bool = false;
  180.                         mMediaRecorder.stop();
  181.                         timer.setText(format(hour) + ":" + format(minute) + ":"
  182.                                 + format(second));
  183.                         mMediaRecorder.release();
  184.                         mMediaRecorder = null;
  185.                         videoRename();
  186.                     } catch (Exception e) {
  187.                         e.printStackTrace();
  188.                     }
  189.                     isRecording = !isRecording;
  190.                     mVideoStartBtn.setBackgroundDrawable(iconStart);
  191.                     showMsg("录制完成,已保存");

  192.                     try {
  193.                         camera = Camera.open();
  194.                         Camera.Parameters parameters = camera.getParameters();
  195.                         parameters.setPreviewFrameRate(5); // 每秒5帧
  196.                         parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  197.                         parameters.set("jpeg-quality", 85);// 照片质量
  198.                         camera.setParameters(parameters);
  199.                         camera.setPreviewDisplay(mSurfaceHolder);
  200.                         camera.startPreview();
  201.                         isPreview = true;
  202.                     } catch (Exception e) {
  203.                         e.printStackTrace();
  204.                     }
  205.                 }
  206.                 if (camera != null) {
  207.                     camera.autoFocus(null);
  208.                     camera.takePicture(null, null, new PictureCallback() {
  209.                         @Override
  210.                         public void onPictureTaken(byte[] data, Camera camera) {
  211.                             Bitmap bitmap = BitmapFactory.decodeByteArray(data,
  212. , data.length);
  213.                             Matrix matrix = new Matrix();
  214.                             // 设置缩放
  215.                             matrix.postScale(5f, 4f);
  216.                             bitmap = Bitmap.createBitmap(bitmap, 0, 0,
  217.                                     bitmap.getWidth(), bitmap.getHeight(),
  218.                                     matrix, true);

  219.                             String path = Environment
  220.                                     .getExternalStorageDirectory()
  221.                                     .getAbsolutePath()
  222.                                     + "/hfdatabase/img/"
  223.                                     + String.valueOf(parentId) + "/";
  224.                             String fileName = new SimpleDateFormat(
  225.                                     "yyyyMMddHHmmss").format(new Date())
  226.                                     + ".jpg";
  227.                             File out = new File(path);
  228.                             if (!out.exists()) {
  229.                                 out.mkdirs();
  230.                             }
  231.                             out = new File(path, fileName);
  232.                             try {
  233.                                 FileOutputStream outStream = new FileOutputStream(
  234.                                         out);
  235.                                 bitmap.compress(CompressFormat.JPEG, 100,
  236.                                         outStream);
  237.                                 outStream.close();
  238.                                 camera.startPreview();
  239.                             } catch (Exception e) {
  240.                                 e.printStackTrace();
  241.                             }
  242.                             showMsg("拍照成功");
  243.                         }
  244.                     }); // 拍照
  245.                 }
  246.             }
  247.         });
  248.     }

  249.     /*
  250.      * 消息提示
  251.      */
  252.     private Toast toast;

  253.     public void showMsg(String arg) {
  254.         if (toast == null) {
  255.             toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
  256.         } else {
  257.             toast.cancel();
  258.             toast.setText(arg);
  259.         }
  260.         toast.show();
  261.     }

  262.     /*
  263.      * 生成video文件名字
  264.      */
  265.     protected void videoRename() {
  266.         String path = Environment.getExternalStorageDirectory()
  267.                 .getAbsolutePath()
  268.                 + "/hfdatabase/video/"
  269.                 + String.valueOf(parentId) + "/";
  270.         String fileName = new SimpleDateFormat("yyyyMMddHHmmss")
  271.                 .format(new Date()) + ".3gp";
  272.         File out = new File(path);
  273.         if (!out.exists()) {
  274.             out.mkdirs();
  275.         }
  276.         out = new File(path, fileName);
  277.         if (mRecAudioFile.exists())
  278.             mRecAudioFile.renameTo(out);
  279.     }

  280.     /*
  281.      * 定时器设置,实现计时
  282.      */
  283.     private Handler handler = new Handler();
  284.     private Runnable task = new Runnable() {
  285.         public void run() {
  286.             if (bool) {
  287.                 handler.postDelayed(this, 1000);
  288.                 second++;
  289.                 if (second >= 60) {
  290.                     minute++;
  291.                     second = second % 60;
  292.                 }
  293.                 if (minute >= 60) {
  294.                     hour++;
  295.                     minute = minute % 60;
  296.                 }
  297.                 timer.setText(format(hour) + ":" + format(minute) + ":"
  298.                         + format(second));
  299.             }
  300.         }
  301.     };

  302.     /*
  303.      * 格式化时间
  304.      */
  305.     public String format(int i) {
  306.         String s = i + "";
  307.         if (s.length() == 1) {
  308.             s = "0" + s;
  309.         }
  310.         return s;
  311.     }

  312.     /*
  313.      * 覆写返回键监听
  314.      */
  315.     @Override
  316.     public void onBackPressed() {
  317.         if (mMediaRecorder != null) {
  318.             mMediaRecorder.stop();
  319.             mMediaRecorder.release();
  320.             mMediaRecorder = null;
  321.             videoRename();
  322.         }
  323.         finish();
  324.     }

  325.     @Override
  326.     protected void onPause() {
  327.         super.onPause();
  328.         onBackPressed();
  329.     }
  330. }

复制代码

浏览图片/视频
FileShow.java

  1. public class FileShow extends Activity {

  2.     private static final int MENU_DELETE = Menu.FIRST;
  3.     private static final int MENU_RENAME = Menu.FIRST + 1;
  4.     private File[] files;
  5.     private String[] names;
  6.     private String[] paths;
  7.     private GridView fileGrid;
  8.     private BaseAdapter adapter = null;
  9.     private String path;
  10.     private EditText etRename;
  11.     private File file;

  12.     protected void onCreate(Bundle icicle) {
  13.         super.onCreate(icicle);
  14.         setContentView(R.layout.map_file_show);
  15.         path = getIntent().getStringExtra("path");
  16.         File file = new File(path);
  17.         files = file.listFiles();
  18.         fileGrid = (GridView) findViewById(R.id.arc_hf_file_show);
  19.         adapter = new fileAdapter(this);
  20.         fileGrid.setAdapter(adapter);
  21.         showFileItems();
  22.         fileGrid.setOnItemClickListener(new OnItemClickListener() {

  23.             @Override
  24.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  25.                     long arg3) {
  26.                 File f = new File(paths[arg2]);
  27.                 Intent intent = new Intent();
  28.                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  29.                 intent.setAction(android.content.Intent.ACTION_VIEW);
  30.                 String type = thisFileType(names[arg2]);
  31.                 intent.setDataAndType(Uri.fromFile(f), type);
  32.                 startActivity(intent);
  33.             }
  34.         });

  35.         // 注册上下文菜单
  36.         registerForContextMenu(fileGrid);
  37.     }

  38.     /*
  39.      * 覆写上下文菜单
  40.      */
  41.     @Override
  42.     public void onCreateContextMenu(ContextMenu menu, View v,
  43.             ContextMenuInfo menuInfo) {
  44.         super.onCreateContextMenu(menu, v, menuInfo);
  45.         AdapterView.AdapterContextMenuInfo info = null;

  46.         try {
  47.             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
  48.         } catch (ClassCastException e) {
  49.             return;
  50.         }
  51.         menu.setHeaderTitle(names[info.position]);
  52.         menu.add(0, MENU_DELETE, 1, "删除");
  53.         menu.add(0, MENU_RENAME, 2, "重命名");
  54.     }

  55.     /*
  56.      * 上下文菜单监听
  57.      */
  58.     @Override
  59.     public boolean onContextItemSelected(MenuItem item) {
  60.         AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
  61.                 .getMenuInfo();
  62.         File file = new File(paths[info.position]);
  63.         switch (item.getItemId()) {
  64.         case MENU_DELETE:
  65.             file.delete();
  66.             showFileItems();
  67.             return true;
  68.         case MENU_RENAME:
  69.             fileRename(file);
  70.             return true;
  71.         default:
  72.             return super.onContextItemSelected(item);
  73.         }
  74.     }

  75.     /*
  76.      * 获取文件
  77.      */
  78.     private void showFileItems() {
  79.         File file = new File(path);
  80.         files = file.listFiles();
  81.         int count = files.length;
  82.         names = new String[count];
  83.         paths = new String[count];
  84.         for (int i = 0; i < count; i++) {
  85.             File f = files[i];
  86.             names[i] = f.getName();
  87.             paths[i] = f.getPath();
  88.         }
  89.         adapter.notifyDataSetChanged();
  90.     }

  91.     /*
  92.      * 获取文件类型
  93.      */
  94.     public static String thisFileType(String name) {
  95.         String type = "";
  96.         String end = name.substring(name.lastIndexOf(".") + 1, name.length())
  97.                 .toLowerCase();
  98.         if (end.equals("jpg")) {
  99.             type = "image";
  100.         } else if (end.equals("3gp")) {
  101.             type = "video";
  102.         } else {
  103.             type = "*";
  104.         }
  105.         type += "/*";
  106.         return type;
  107.     }

  108.     /**
  109.      * 重命名
  110.      */
  111.     private void fileRename(File file) {
  112.         this.file = file;
  113.         View view = getLayoutInflater().inflate(R.layout.map_file_rename, null);
  114.         etRename = (EditText) view.findViewById(R.id.arc_hf_file_rename);
  115.         new AlertDialog.Builder(this).setView(view)
  116.                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {

  117.                     @Override
  118.                     public void onClick(DialogInterface dialog, int which) {
  119.                         String newName = etRename.getText().toString().trim();
  120.                         File newFile = new File(path, newName);
  121.                         if (newFile.exists()) {
  122.                             showMsg(newName + "已经存在,请重新输入");
  123.                         } else
  124.                             FileShow.this.file.renameTo(newFile);
  125.                         showFileItems();
  126.                     }
  127.                 }).setNegativeButton("取消", null).show();
  128.     }

  129.     /*
  130.      * 消息提示
  131.      */
  132.     private Toast toast;

  133.     public void showMsg(String arg) {
  134.         if (toast == null) {
  135.             toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
  136.         } else {
  137.             toast.cancel();
  138.             toast.setText(arg);
  139.         }
  140.         toast.show();
  141.     }

  142.     /*
  143.      * File adapter设置
  144.      */
  145.     class fileAdapter extends BaseAdapter {
  146.         Context context;

  147.         public fileAdapter(Context context) {
  148.             this.context = context;
  149.         }

  150.         @Override
  151.         public int getCount() {
  152.             return files.length;
  153.         }

  154.         @Override
  155.         public Object getItem(int arg0) {
  156.             // return files[arg0];
  157.             return names[arg0];
  158.         }

  159.         @Override
  160.         public long getItemId(int position) {
  161.             return position;
  162.         }

  163.         @Override
  164.         public View getView(int position, View convertView, ViewGroup parent) {
  165.             String type = thisFileType(names[position]);
  166.             convertView = getLayoutInflater().inflate(R.layout.map_file_item,
  167.                     null);
  168.             ImageView icon = (ImageView) convertView
  169.                     .findViewById(R.id.arc_hf_file_icon);
  170.             TextView name = (TextView) convertView
  171.                     .findViewById(R.id.arc_hf_file_name);
  172.             if (type.equals("video/*")) {
  173.                 Bitmap videoIcon = ThumbnailUtils.createVideoThumbnail(
  174.                         paths[position], Video.Thumbnails.MINI_KIND);
  175.                 icon.setImageBitmap(videoIcon);
  176.             } else if (type.equals("image/*")) {
  177.                 Bitmap bitmap = BitmapFactory.decodeFile(paths[position]);
  178.                 Bitmap imgIcon = ThumbnailUtils.extractThumbnail(bitmap, 150,
  179. );
  180.                 icon.setImageBitmap(imgIcon);
  181.             }
  182.             name.setText(names[position]);
  183.             return convertView;
  184.         }
  185.     }
  186. }

复制代码

缩略图加载这一块速度特别慢,希望会异步加载缩略图的同学能功能交流一下

抱歉!评论已关闭.