您的位置:首页 > 移动开发 > Android开发

android 录像和拍照功能

2015-06-12 09:10 337 查看
http://blog.csdn.net/binyao02123202/article/details/8576916

先在
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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: