android 录像和拍照功能

先在 manifest 里添加权限 <uses-permission android:name="android.permission.CAMERA" />
  <!-- 调用摄像头权限 -->
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <!-- 录制视频/音频权限 -->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <!-- sd卡读写权限 -->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  <!-- 挂载sd卡 -->
  layout 布局预览窗口 camera.xml
<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >
  <SurfaceView
  android:id="@+id/arc_hf_video_view"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" />
  <TextView
  android:id="@+id/arc_hf_video_timer"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_margin="40dp"
  android:textColor="#ffff0000"
  android:textSize="35dp"
  android:textStyle="bold" >
  </TextView>
  <LinearLayout
  android:id="@+id/arc_hf_video_btn"
  android:layout_width="wrap_content"
  android:layout_height="fill_parent"
  android:layout_alignParentRight="true"
  android:gravity="center"
  android:orientation="vertical" >
  <Button
  android:id="@+id/arc_hf_video_start"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/arc_hf_btn_video_start" />
  <Button
  android:id="@+id/arc_hf_img_start"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/arc_hf_btn_img" />
  </LinearLayout>
  </RelativeLayout>
  Activity MCamera.java public class MCamera extends Activity {
  private Button mVideoStartBtn;
  private SurfaceView mSurfaceview;
  private MediaRecorder mMediaRecorder;
  private SurfaceHolder mSurfaceHolder;
  private File mRecVedioPath;
  private File mRecAudioFile;
  private TextView timer;
  private int hour = 0;
  private int minute = 0;
  private int second = 0;
  private boolean bool;
  private int parentId;
  protected Camera camera;
  protected boolean isPreview;
  private Drawable iconStart;
  private Drawable iconStop;
  private boolean isRecording = true; // true表示没有录像,点击开始;false表示正在录像,点击暂停
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  /*
  * 全屏显示
  */
  this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);
  getWindow().setFormat(PixelFormat.TRANSLUCENT);
  setContentView(R.layout.map_video);
  iconStart = getResources().getDrawable(
  R.drawable.arc_hf_btn_video_start);
  iconStop = getResources().getDrawable(R.drawable.arc_hf_btn_video_stop);
  parentId = getIntent().getIntExtra("parentId", 0);
  timer = (TextView) findViewById(R.id.arc_hf_video_timer);
  mVideoStartBtn = (Button) findViewById(R.id.arc_hf_video_start);
  mSurfaceview = (SurfaceView) this.findViewById(R.id.arc_hf_video_view);
  // 设置计时器不可见
  timer.setVisibility(View.GONE);
  // 设置缓存路径
  mRecVedioPath = new File(Environment.getExternalStorageDirectory()
  .getAbsolutePath() + "/hfdatabase/video/temp/");
  if (!mRecVedioPath.exists()) {
  mRecVedioPath.mkdirs();
  }
  // 绑定预览视图
  SurfaceHolder holder = mSurfaceview.getHolder();
  holder.addCallback(new Callback() {
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
  if (camera != null) {
  if (isPreview) {
  camera.stopPreview();
  isPreview = false;
  }
  camera.release();
  camera = null; // 记得释放
  }
  mSurfaceview = null;
  mSurfaceHolder = null;
  mMediaRecorder = null;
  }
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
  try {
  camera = Camera.open();
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewFrameRate(5); // 每秒5帧
  parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  parameters.set("jpeg-quality", 85);// 照片质量
  camera.setParameters(parameters);
  camera.setPreviewDisplay(holder);
  camera.startPreview();
  isPreview = true;
  } catch (Exception e) {
  e.printStackTrace();
  }
  mSurfaceHolder = holder;
  }
  @Override
  public void surfaceChanged(SurfaceHolder holder, int format,
  int width, int height) {
  mSurfaceHolder = holder;
  }
  });
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  mVideoStartBtn.setOnClickListener(new Button.OnClickListener() {
  @Override
  public void onClick(View v) {
  if (isRecording) {
  /*
  * 点击开始录像
  */
  if (isPreview) {
  camera.stopPreview();
  camera.release();
  camera = null;
  }
  second = 0;
  minute = 0;
  hour = 0;
  bool = true;
  if (mMediaRecorder == null)
  mMediaRecorder = new MediaRecorder();
  else
  mMediaRecorder.reset();
  mMediaRecorder.setPreviewDisplay(mSurfaceHolder
  .getSurface());
  mMediaRecorder
  .setVideoSource(MediaRecorder.VideoSource.CAMERA);
  mMediaRecorder
  .setAudioSource(MediaRecorder.AudioSource.MIC);
  mMediaRecorder
  .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  mMediaRecorder
  .setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  mMediaRecorder
  .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  mMediaRecorder.setVideoSize(320, 240);
  mMediaRecorder.setVideoFrameRate(15);
  try {
  mRecAudioFile = File.createTempFile("Vedio", ".3gp",
  mRecVedioPath);
  } catch (IOException e) {
  e.printStackTrace();
  }
  mMediaRecorder.setOutputFile(mRecAudioFile
  .getAbsolutePath());
  try {
  mMediaRecorder.prepare();
  timer.setVisibility(View.VISIBLE);
  handler.postDelayed(task, 1000);
  mMediaRecorder.start();
  } catch (Exception e) {
  e.printStackTrace();
  }
  showMsg("开始录制");
  mVideoStartBtn.setBackgroundDrawable(iconStop);
  isRecording = !isRecording;
  } else {
  /*
  * 点击停止
  */
  try {
  bool = false;
  mMediaRecorder.stop();
  timer.setText(format(hour) + ":" + format(minute) + ":"
  + format(second));
  mMediaRecorder.release();
  mMediaRecorder = null;
  videoRename();
  } catch (Exception e) {
  e.printStackTrace();
  }
  isRecording = !isRecording;
  mVideoStartBtn.setBackgroundDrawable(iconStart);
  showMsg("录制完成,已保存");
  try {
  camera = Camera.open();
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewFrameRate(5); // 每秒5帧
  parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  parameters.set("jpeg-quality", 85);// 照片质量
  camera.setParameters(parameters);
  camera.setPreviewDisplay(mSurfaceHolder);
  camera.startPreview();
  isPreview = true;
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
  }
  });
  Button btnImgStart = (Button) findViewById(R.id.arc_hf_img_start);
  btnImgStart.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  if (mMediaRecorder != null) {
  try {
  bool = false;
  mMediaRecorder.stop();
  timer.setText(format(hour) + ":" + format(minute) + ":"
  + format(second));
  mMediaRecorder.release();
  mMediaRecorder = null;
  videoRename();
  } catch (Exception e) {
  e.printStackTrace();
  }
  isRecording = !isRecording;
  mVideoStartBtn.setBackgroundDrawable(iconStart);
  showMsg("录制完成,已保存");
  try {
  camera = Camera.open();
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewFrameRate(5); // 每秒5帧
  parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
  parameters.set("jpeg-quality", 85);// 照片质量
  camera.setParameters(parameters);
  camera.setPreviewDisplay(mSurfaceHolder);
  camera.startPreview();
  isPreview = true;
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
  if (camera != null) {
  camera.autoFocus(null);
  camera.takePicture(null, null, new PictureCallback() {
  @Override
  public void onPictureTaken(byte[] data, Camera camera) {
  Bitmap bitmap = BitmapFactory.decodeByteArray(data,
  , data.length);
  Matrix matrix = new Matrix();
  // 设置缩放
  matrix.postScale(5f, 4f);
  bitmap = Bitmap.createBitmap(bitmap, 0, 0,
  bitmap.getWidth(), bitmap.getHeight(),
  matrix, true);
  String path = Environment
  .getExternalStorageDirectory()
  .getAbsolutePath()
  + "/hfdatabase/img/"
  + String.valueOf(parentId) + "/";
  String fileName = new SimpleDateFormat(
  "yyyyMMddHHmmss").format(new Date())
  + ".jpg";
  File out = new File(path);
  if (!out.exists()) {
  out.mkdirs();
  }
  out = new File(path, fileName);
  try {
  FileOutputStream outStream = new FileOutputStream(
  out);
  bitmap.compress(CompressFormat.JPEG, 100,
  outStream);
  outStream.close();
  camera.startPreview();
  } catch (Exception e) {
  e.printStackTrace();
  }
  showMsg("拍照成功");
  }
  }); // 拍照
  }
  }
  });
  }
  /*
  * 消息提示
  */
  private Toast toast;
  public void showMsg(String arg) {
  if (toast == null) {
  toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
  } else {
  toast.cancel();
  toast.setText(arg);
  }
  toast.show();
  }
  /*
  * 生成video文件名字
  */
  protected void videoRename() {
  String path = Environment.getExternalStorageDirectory()
  .getAbsolutePath()
  + "/hfdatabase/video/"
  + String.valueOf(parentId) + "/";
  String fileName = new SimpleDateFormat("yyyyMMddHHmmss")
  .format(new Date()) + ".3gp";
  File out = new File(path);
  if (!out.exists()) {
  out.mkdirs();
  }
  out = new File(path, fileName);
  if (mRecAudioFile.exists())
  mRecAudioFile.renameTo(out);
  }
  /*
  * 定时器设置,实现计时
  */
  private Handler handler = new Handler();
  private Runnable task = new Runnable() {
  public void run() {
  if (bool) {
  handler.postDelayed(this, 1000);
  second++;
  if (second >= 60) {
  minute++;
  second = second % 60;
  }
  if (minute >= 60) {
  hour++;
  minute = minute % 60;
  }
  timer.setText(format(hour) + ":" + format(minute) + ":"
  + format(second));
  }
  }
  };
  /*
  * 格式化时间
  */
  public String format(int i) {
  String s = i + "";
  if (s.length() == 1) {
  s = "0" + s;
  }
  return s;
  }
  /*
  * 覆写返回键监听
  */
  @Override
  public void onBackPressed() {
  if (mMediaRecorder != null) {
  mMediaRecorder.stop();
  mMediaRecorder.release();
  mMediaRecorder = null;
  videoRename();
  }
  finish();
  }
  @Override
  protected void onPause() {
  super.onPause();
  onBackPressed();
  }
  }
  浏览图片/视频 FileShow.java
public class FileShow extends Activity {
  private static final int MENU_DELETE = Menu.FIRST;
  private static final int MENU_RENAME = Menu.FIRST + 1;
  private File[] files;
  private String[] names;
  private String[] paths;
  private GridView fileGrid;
  private BaseAdapter adapter = null;
  private String path;
  private EditText etRename;
  private File file;
  protected void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.map_file_show);
  path = getIntent().getStringExtra("path");
  File file = new File(path);
  files = file.listFiles();
  fileGrid = (GridView) findViewById(R.id.arc_hf_file_show);
  adapter = new fileAdapter(this);
  fileGrid.setAdapter(adapter);
  showFileItems();
  fileGrid.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  long arg3) {
  File f = new File(paths[arg2]);
  Intent intent = new Intent();
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.setAction(android.content.Intent.ACTION_VIEW);
  String type = thisFileType(names[arg2]);
  intent.setDataAndType(Uri.fromFile(f), type);
  startActivity(intent);
  }
  });
  // 注册上下文菜单
  registerForContextMenu(fileGrid);
  }
  /*
  * 覆写上下文菜单
  */
  @Override
  public void onCreateContextMenu(ContextMenu menu, View v,
  ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  AdapterView.AdapterContextMenuInfo info = null;
  try {
  info = (AdapterView.AdapterContextMenuInfo) menuInfo;
  } catch (ClassCastException e) {
  return;
  }
  menu.setHeaderTitle(names[info.position]);
  menu.add(0, MENU_DELETE, 1, "删除");
  menu.add(0, MENU_RENAME, 2, "重命名");
  }
  /*
  * 上下文菜单监听
  */
  @Override
  public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
  .getMenuInfo();
  File file = new File(paths[info.position]);
  switch (item.getItemId()) {
  case MENU_DELETE:
  file.delete();
  showFileItems();
  return true;
  case MENU_RENAME:
  fileRename(file);
  return true;
  default:
  return super.onContextItemSelected(item);
  }
  }
  /*
  * 获取文件
  */
  private void showFileItems() {
  File file = new File(path);
  files = file.listFiles();
  int count = files.length;
  names = new String[count];
  paths = new String[count];
  for (int i = 0; i < count; i++) {
  File f = files[i];
  names[i] = f.getName();
  paths[i] = f.getPath();
  }
  adapter.notifyDataSetChanged();
  }
  /*
  * 获取文件类型
  */
  public static String thisFileType(String name) {
  String type = "";
  String end = name.substring(name.lastIndexOf(".") + 1, name.length())
  .toLowerCase();
  if (end.equals("jpg")) {
  type = "image";
  } else if (end.equals("3gp")) {
  type = "video";
  } else {
  type = "*";
  }
  type += "/*";
  return type;
  }
  /**
  * 重命名
  */
  private void fileRename(File file) {
  this.file = file;
  View view = getLayoutInflater().inflate(R.layout.map_file_rename, null);
  etRename = (EditText) view.findViewById(R.id.arc_hf_file_rename);
  new AlertDialog.Builder(this).setView(view)
  .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
  String newName = etRename.getText().toString().trim();
  File newFile = new File(path, newName);
  if (newFile.exists()) {
  showMsg(newName + "已经存在,请重新输入");
  } else
  FileShow.this.file.renameTo(newFile);
  showFileItems();
  }
  }).setNegativeButton("取消", null).show();
  }
  /*
  * 消息提示
  */
  private Toast toast;
  public void showMsg(String arg) {
  if (toast == null) {
  toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
  } else {
  toast.cancel();
  toast.setText(arg);
  }
  toast.show();
  }
  /*
  * File adapter设置
  */
  class fileAdapter extends BaseAdapter {
  Context context;
  public fileAdapter(Context context) {
  this.context = context;
  }
  @Override
  public int getCount() {
  return files.length;
  }
  @Override
  public Object getItem(int arg0) {
  // return files[arg0];
  return names[arg0];
  }
  @Override
  public long getItemId(int position) {
  return position;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
  String type = thisFileType(names[position]);
  convertView = getLayoutInflater().inflate(R.layout.map_file_item,
  null);
  ImageView icon = (ImageView) convertView
  .findViewById(R.id.arc_hf_file_icon);
  TextView name = (TextView) convertView
  .findViewById(R.id.arc_hf_file_name);
  if (type.equals("video/*")) {
  Bitmap videoIcon = ThumbnailUtils.createVideoThumbnail(
  paths[position], Video.Thumbnails.MINI_KIND);
  icon.setImageBitmap(videoIcon);
  } else if (type.equals("image/*")) {
  Bitmap bitmap = BitmapFactory.decodeFile(paths[position]);
  Bitmap imgIcon = ThumbnailUtils.extractThumbnail(bitmap, 150,
  );
  icon.setImageBitmap(imgIcon);
  }
  name.setText(names[position]);
  return convertView;
  }
  }
  }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值