先在 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. }
复制代码 缩略图加载这一块速度特别慢,希望会异步加载缩略图的同学能功能交流一下

更多相关文章

  1. Android总结篇系列:Android 权限
  2. Android Wi-Fi 设置带宽代码流程
  3. Android第一行代码笔记
  4. Android的源代码结构
  5. Android开发常用代码片段(二)
  6. 修改android框架代码
  7. Android有用代码片断(六)
  8. Android自定义权限
  9. Android改变wifi状态必须要的权限

随机推荐

  1. android之listview的item不可点击
  2. android 5.0视频教程
  3. Android Studio Plugins 之 JRebel for A
  4. android初体验 AVD error
  5. 【Android】Android之多页面问答题
  6. 构建Windows版的Android SDK
  7. Android 面试题(重点2)
  8. 无比重要的ListView
  9. Android通知及receiver
  10. Android中EditText点击获得焦点后无法显