Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片


最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一个相机,虽然相机这东西,兼容性不敢恭维,但是用到的地方确实很多,所以今天,我们就一起来学习一下吧

参照Google API:http://developer.android.com/guide/topics/media/camera.html

一.Camera的启动方式

1.调用系统方式

2.自定义相机

二.调用系统相机

喜闻乐见,调用系统相机是十分的简单的,我们这里演示的话,还是新建一个工程吧,这里就直接用Eclipse开发了,这里我们新建一个项目——SystemCamera

activity_main.xml

  1. 这里直接一个button就够了
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <Button
  6. android:id="@+id/on_camera"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:text="打开相机" />
  10. </RelativeLayout>

MainActivity

  1. package com.lgl.camera;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.provider.MediaStore;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. public class MainActivity extends Activity {
  10. private Button on_camera;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. on_camera = (Button) findViewById(R.id.on_camera);
  16. on_camera.setOnClickListener(new OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. /**
  20. * 我们使用Intent的方式打开系统相机
  21. * 1.直接跳转相机包名,前提是你知道这个应用的包名
  22. * 2.就是使用隐式Intent了,在这里我们就使用隐式intent
  23. */
  24. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //指定拍照
  25. startActivity(intent);
  26. }
  27. });
  28. }
  29. }

好的,我们来运行一下吧

三.获取拍照图片

说到获取图片,大家应该就立马想到了startActivityForResult,没错,我们就是这样直接拿到传递回来的data,然后通过Bundle转换二进制流的方式获得一个bitmap,好的,这样的话,我们就要新增加一个imageview了

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <Button
  7. android:id="@+id/on_camera"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="打开相机" />
  11. <ImageView
  12. android:id="@+id/iv_photo"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content" />
  15. </LinearLayout>

MainActivity

  1. package com.lgl.camera;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.graphics.Bitmap;
  5. import android.os.Bundle;
  6. import android.provider.MediaStore;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.ImageView;
  11. public class MainActivity extends Activity {
  12. private Button on_camera;
  13. private ImageView iv_photo;
  14. // 返回码
  15. private static final int CODE = 1;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. iv_photo = (ImageView) findViewById(R.id.iv_photo);
  21. on_camera = (Button) findViewById(R.id.on_camera);
  22. on_camera.setOnClickListener(new OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. /**
  26. * 我们使用Intent的方式打开系统相机
  27. * 1.直接跳转相机包名,前提是你知道这个应用的包名
  28. * 2.就是使用隐式Intent了,在这里我们就使用隐式intent
  29. */
  30. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定拍照\
  31. // 拍照返回图片
  32. startActivityForResult(intent, CODE);
  33. }
  34. });
  35. }
  36. @Override
  37. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  38. // TODO Auto-generated method stub
  39. super.onActivityResult(requestCode, resultCode, data);
  40. // 判断是否返回值
  41. if (resultCode == RESULT_OK) {
  42. // 判断返回值是否正确
  43. if (requestCode == CODE) {
  44. // 获取图片
  45. Bundle bundle = data.getExtras();
  46. // 转换图片的二进制流
  47. Bitmap bitmap = (Bitmap) bundle.get("data");
  48. // 设置图片
  49. iv_photo.setImageBitmap(bitmap);
  50. }
  51. }
  52. }
  53. }

好,我们继续运行一下

加载大图片

这里我们要知道一个概念,就是我们返回结果是从data中取出来的,但是这个data不可能存储太多的东西,比如你拍的4K照片,动辄几十M,那不就直接挂了嘛,google是这样设定的,data返回的只是有一个缩略图,但是我们实际开发当中怎么可以使用缩略图,别急,是有办法的

我们再增加一个button和一个imageview为了显示真实大小的图片,这里就直接上完整代码了,思路十分的顺,但是我们所用到的方式是要写sd卡的,我们新增加一个权限

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接着我们就可以在他返回请求的时候请求另一个返回码了

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <Button
  7. android:id="@+id/on_camera"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="打开相机" />
  11. <Button
  12. android:id="@+id/on_camera_big"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="大图片" />
  16. <ImageView
  17. android:id="@+id/iv_photo"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content" />
  20. <ImageView
  21. android:id="@+id/iv_photo_big"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content" />
  24. </LinearLayout>

MainActivity

  1. package com.lgl.camera;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import android.app.Activity;
  7. import android.content.Intent;
  8. import android.graphics.Bitmap;
  9. import android.graphics.BitmapFactory;
  10. import android.net.Uri;
  11. import android.os.Bundle;
  12. import android.os.Environment;
  13. import android.provider.MediaStore;
  14. import android.view.View;
  15. import android.view.View.OnClickListener;
  16. import android.widget.Button;
  17. import android.widget.ImageView;
  18. public class MainActivity extends Activity {
  19. private Button on_camera;
  20. private ImageView iv_photo;
  21. private Button on_camera_big;
  22. private ImageView iv_photo_big;
  23. // 返回码
  24. private static final int CODE = 1;
  25. private static final int CODEBIG = 2;
  26. // 记录文件保存位置
  27. private String mFilePath;
  28. private FileInputStream is = null;
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_main);
  33. // 获取SD卡路径
  34. mFilePath = Environment.getExternalStorageDirectory().getPath();
  35. // 文件名
  36. mFilePath = mFilePath + "/" + "photo.png";
  37. iv_photo = (ImageView) findViewById(R.id.iv_photo);
  38. iv_photo_big = (ImageView) findViewById(R.id.iv_photo_big);
  39. on_camera = (Button) findViewById(R.id.on_camera);
  40. on_camera.setOnClickListener(new OnClickListener() {
  41. @Override
  42. public void onClick(View v) {
  43. /**
  44. * 我们使用Intent的方式打开系统相机
  45. * 1.直接跳转相机包名,前提是你知道这个应用的包名
  46. * 2.就是使用隐式Intent了,在这里我们就使用隐式intent
  47. */
  48. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定拍照
  49. // 拍照返回图片
  50. startActivityForResult(intent, CODE);
  51. }
  52. });
  53. on_camera_big = (Button) findViewById(R.id.on_camera_big);
  54. on_camera_big.setOnClickListener(new OnClickListener() {
  55. @Override
  56. public void onClick(View v) {
  57. // 指定拍照
  58. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  59. // 加载路径
  60. Uri uri = Uri.fromFile(new File(mFilePath));
  61. // 指定存储路径,这样就可以保存原图了
  62. intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  63. // 拍照返回图片
  64. startActivityForResult(intent, CODEBIG);
  65. }
  66. });
  67. }
  68. @Override
  69. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  70. // TODO Auto-generated method stub
  71. super.onActivityResult(requestCode, resultCode, data);
  72. // 判断是否返回值
  73. if (resultCode == RESULT_OK) {
  74. // 判断返回值是否正确
  75. if (requestCode == CODE) {
  76. // 获取图片
  77. Bundle bundle = data.getExtras();
  78. // 转换图片的二进制流
  79. Bitmap bitmap = (Bitmap) bundle.get("data");
  80. // 设置图片
  81. iv_photo.setImageBitmap(bitmap);
  82. // 加载原图
  83. } else if (requestCode == CODEBIG) {
  84. try {
  85. // 获取输入流
  86. is = new FileInputStream(mFilePath);
  87. // 把流解析成bitmap
  88. Bitmap bitmap = BitmapFactory.decodeStream(is);
  89. // 设置图片
  90. iv_photo_big.setImageBitmap(bitmap);
  91. } catch (FileNotFoundException e) {
  92. // TODO Auto-generated catch block
  93. e.printStackTrace();
  94. } finally {
  95. // 关闭流
  96. try {
  97. is.close();
  98. } catch (IOException e) {
  99. // TODO Auto-generated catch block
  100. e.printStackTrace();
  101. }
  102. }
  103. }
  104. }
  105. }
  106. }

好的,最后运行一遍

这是基本的系统相机调用,我们下篇就开始来写自定义相机的API和回调方法

Demo下载地址:Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片的更多相关文章

  1. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  2. Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

    1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...

  3. Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)

    1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...

  4. Android简易实战教程--第二十八话《加载大图片》

    Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出.假设手机内存比较小,而要去加载一张像素很高的图片的时候,就会因为内存不足导致崩溃.这种异常是无法捕获的 内存不足并不 ...

  5. Android(java)学习笔记179:多媒体之加载大图片到内存(Bitmap API)

    1. Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度, ...

  6. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  7. Android 加载大图片到内存

    本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  8. 【Android Developers Training】 56. 更效率地加载大图片

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Android加载大图片OOM异常解决

      尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过 ...

随机推荐

  1. RxJava(四) concatMap操作符用法详解

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533282 本文出自:[余志强的博客] concatMap操作符的 ...

  2. Java进阶(四十五)java 字节流与字符流的区别

    java 字节流与字符流的区别(转载)   字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?   实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...

  3. 全文检索 Lucene(4)

    经过了前面几篇文章的学习,我们基本上可以适用Lucene来开发我们的站内搜索应用了.但是观察一下目前的主流的搜索引擎,我们会发现查询结果会有高亮的显示效果.所以,今天我们就来学习一下,给Lucene添 ...

  4. EXCEL技能之数据去重

    本篇不属于技术类博文,只是想找个地方记录而已,既然是我的博客嘛,那就自己想写什么就写什么了. CRM中有个EXCEL数据导入功能,几千条数据导入CRM后去重,那是死的心都有的.往回想想EXCEL是否有 ...

  5. 4.QPixmap,QTransform,绘图函数的使用

     新建一个项目Painter MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyW ...

  6. 关闭Win10自动更新

    使用过Windows10系统的小伙伴们都清楚,在Windows10中强制开启了自动更新功能,我们无法通过常规的办法关闭自动更新功能,那么我们该怎么去关闭自动更新呢?欢迎速来围观我的经验啦. 工具/原料 ...

  7. (NO.00004)iOS实现打砖块游戏(十一):"一闪一闪亮晶晶,我们都是小星星"

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在一个基本的游戏逻辑已经搭建好了,但是感觉还是缺点什么呢? 蠢 ...

  8. Android Studio科普篇——1.几个个性化设置

    本人未研读过android-studio使用文档,亦未去好好琢磨它的各种使用技巧等.以下内容均来自个人使用经验,如有讹误,还请指正. 1.主题. File->Settings, 搜索Theme, ...

  9. 【如何快速的开发一个简单的iOS直播app】(代码篇)

    开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...

  10. Checksum软件的简单设计

    相信大家平时在测试一些bin文件的时候,经常都会要求计算checksum值,其实就是校验和,非常的简单,比如下图这个软件: