在APP中使用Camera的两种方式

  1. 调用系统相机,或者是具有相机功能的应用
  2. 自定义相机

1. 调用系统相机

  • 1)隐式调用系统的相机
    XML代码:

    Activity代码:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
  • 2)让Activity可以作为其他程序可调用的拍照程序
    配置Manifest.xml文件
<intent-filter><action android:name="android.media.action.IMAGE_CAPTURE" /><category android:name="android.intent.category.DEFAULT" />
</intent-filter>

  • 3)拍照后返回图片( 返回缩略图 和 返回原图 )
    XML布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mytest.MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="StartCamera"android:text="调用系统拍照" /><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>

Activity代码:

public class MainActivity extends AppCompatActivity {private static  int REQ_1 = 1;private ImageView mInageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mInageView = (ImageView) findViewById(R.id.imageView);}public void StartCamera(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,REQ_1);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == RESULT_OK){if(requestCode == REQ_1){Bundle bundle = data.getExtras();//拍照使用系统自带的相机//可能引起拍照完返回调用onActivityResult()时intent携带的数据过大,android已经将data压缩,返回的是图片的缩略图。Bitmap bitmap = (Bitmap) bundle.get("data");mInageView.setImageBitmap(bitmap);}}}
}

但是:通过调用系统相机拍照获取的图像是缩略图,像素比较低(图片模糊),防止内存溢出。

解决方法:采用另外一种方案(文件路径读取)
XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mytest.MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="StartCamera"android:text="调用系统拍照返回缩略图" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="StartCamera2"android:text="调用系统拍照返回原图" /><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>

Activity代码:

public class MainActivity extends AppCompatActivity {private static  int REQ_1 = 1;private static  int REQ_2 = 2;private ImageView mInageView;private String mFilePath;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mInageView = (ImageView) findViewById(R.id.imageView);// 需要添加SDCard的读取权限mFilePath = Environment.getExternalStorageDirectory().getPath();mFilePath = mFilePath + "/" + "temp.png";}//返回缩略图public void StartCamera(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,REQ_1);}//返回原图public void StartCamera2(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 注意:使用的是 android.net.Uri;Uri photoUri = Uri.fromFile(new File(mFilePath));intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//保存到指定的Uri中startActivityForResult(intent,REQ_2);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == RESULT_OK){if(requestCode == REQ_1){Bundle bundle = data.getExtras();Bitmap bitmap = (Bitmap) bundle.get("data");mInageView.setImageBitmap(bitmap);}else if(requestCode == REQ_2){FileInputStream fis = null;try {fis = new FileInputStream(mFilePath);Bitmap bitmap = BitmapFactory.decodeStream(fis);mInageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {try {fis.close();} catch (IOException e1) {e1.printStackTrace();}e.printStackTrace();}}}}
}

manifest配置文件代码:

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

2. 自定义相机(综合案例)

XML界面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mytest.MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="StartCamera"android:text="调用系统拍照返回缩略图" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="StartCamera2"android:text="调用系统拍照返回原图" /><Buttonandroid:id="@+id/button3"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="CustomCamera"android:text="自定义相机" /><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>

MainActivity代码:

public class MainActivity extends AppCompatActivity {private static  int REQ_1 = 1;private static  int REQ_2 = 2;private ImageView mInageView;private String mFilePath;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mInageView = (ImageView) findViewById(R.id.imageView);// 需要添加SDCard的读取权限mFilePath = Environment.getExternalStorageDirectory().getPath();mFilePath = mFilePath + "/" + "temp.png";}//返回缩略图public void StartCamera(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,REQ_1);}//返回原图public void StartCamera2(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 注意:使用的是 android.net.Uri;Uri photoUri = Uri.fromFile(new File(mFilePath));intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//保存到指定的Uri中startActivityForResult(intent,REQ_2);}//自定义相机public void CustomCamera(View view){Intent intent = new Intent(MainActivity.this, CustomCameraActivity.class);// 注意:使用的是 android.net.Uri;Uri photoUri = Uri.fromFile(new File(mFilePath));intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//保存到指定的Uri中startActivityForResult(intent,REQ_2);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == RESULT_OK){if(requestCode == REQ_1){Bundle bundle = data.getExtras();Bitmap bitmap = (Bitmap) bundle.get("data");mInageView.setImageBitmap(bitmap);}else if(requestCode == REQ_2){FileInputStream fis = null;try {fis = new FileInputStream(mFilePath);Bitmap bitmap = BitmapFactory.decodeStream(fis);mInageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {try {fis.close();} catch (IOException e1) {e1.printStackTrace();}e.printStackTrace();}}}}
}

自定义相机布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mytest.CustomCameraActivity"><Buttonandroid:id="@+id/button4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Capture"android:onClick="capture"/><SurfaceViewandroid:id="@+id/preview"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

CustomCameraActivity代码:

public class CustomCameraActivity extends Activity implements SurfaceHolder.Callback{private Camera mCamera;private SurfaceView mPreview;private SurfaceHolder mHolder;//实现回调方法private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// 参数data存放的是完整的图片数据,不是缩略图File tempFile = new File("/sdcard/temp.png");try {FileOutputStream fos = new FileOutputStream(tempFile);fos.write(data);fos.close();//实行页面跳转,展示拍照结果Intent intent = new Intent(CustomCameraActivity.this, Result.class);intent.putExtra("picPath",tempFile.getAbsolutePath());startActivity(intent);CustomCameraActivity.this.finish();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_custom_camera);mPreview = (SurfaceView) findViewById(R.id.preview);mHolder = mPreview.getHolder();mHolder.addCallback(this);//点击SurfaceView自动对焦mPreview.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCamera.autoFocus(null);}});}public void capture(View view) {//设置拍照参数Camera.Parameters parameters = mCamera.getParameters();parameters.setPictureFormat(ImageFormat.JPEG);parameters.setPreviewSize(800, 400);//预览大小parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦mCamera.autoFocus(new Camera.AutoFocusCallback() { //获取对清晰的对焦照片@Overridepublic void onAutoFocus(boolean success, Camera camera) {if(success){ //如果对焦成功Toast.makeText(getApplicationContext(),"对焦成功",Toast.LENGTH_SHORT).show();mCamera.takePicture(null, null, mPictureCallback);}else{Toast.makeText(getApplicationContext(),"对焦失败",Toast.LENGTH_SHORT).show();}}});}/*** 第一步:创建三个方法*///获取Camera对象,注意Camera包不要导错private Camera getCamera() {//由于是自定义相机,不是系统i相机,需要添加相机权限Camera camera;try {camera = Camera.open();} catch (Exception e) {camera = null;e.printStackTrace();}return camera;}//开始预览相机内容(将相机与SurfaceView进行绑定)private void setStartPreview(Camera camera, SurfaceHolder holder) {try {camera.setPreviewDisplay(holder);//将系统Camera预览角度进行调整camera.setDisplayOrientation(90);camera.startPreview();} catch (IOException e) {e.printStackTrace();}}//释放相机资源 并且将 相机 与 SurfaceView 解除绑定private void releaseCamera() {if(mCamera != null){mCamera.setPreviewCallback(null);mCamera.stopPreview();mCamera.release();;mCamera = null;}}/*** 第二步:将这三个方法与Activity的生命周期绑定*/@Overrideprotected void onResume() {super.onResume();if(mCamera == null){mCamera = getCamera();if(mHolder != null){setStartPreview(mCamera,mHolder);}}}@Overrideprotected void onPause() {super.onPause();releaseCamera();}/***  第三步:实现 implements SurfaceHolder.Callback 的3个方法*/@Overridepublic void surfaceCreated(SurfaceHolder holder) {setStartPreview(mCamera,mHolder);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {mCamera.stopPreview();setStartPreview(mCamera, mHolder);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {releaseCamera();}
}

展示结果的布局界面:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mytest.Result"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Capture Result"android:textSize="30sp"/><ImageViewandroid:id="@+id/pic"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="center"app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>

Result代码

public class Result extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_result);String path = getIntent().getStringExtra("picPath");ImageView imageView = (ImageView) findViewById(R.id.pic);try {FileInputStream fis = new FileInputStream(path);Bitmap bitmap = BitmapFactory.decodeStream(fis);Matrix matrix = new Matrix();//定义一个矩阵matrix.setRotate(90);bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}//        Bitmap bitmap = BitmapFactory.decodeFile(path);
//        imageView.setImageBitmap(bitmap);}

由于是自定义的相机,需要添加权限
manifest.xml添加权限

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

Android 摄像头相关推荐

  1. android 摄像头参数,获取Android设备上的详细的摄像头信息

    原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...

  2. android摄像头的autoFocus-----循环自动聚焦的实现

    参考:http://blog.sina.com.cn/s/blog_7dbac1250101mloj.html 采用重力感应方式已实现 要实现android摄像头的autoFocus,并不难,但要实现 ...

  3. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc

    Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...

  4. 2013新春奉送:Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,查询支持的picturesize, ImageButton按键效果)

    [补充:我已在对此代码进行了全面的升级,升级后代码结构更加利于维护扩展,全面适配所有手机,参见博文.此文中的资源也不要再下载了,请下载升级后的代码,如有问题请留言反馈,谢谢.------------- ...

  5. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

  6. Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,查询支持的picturesize, ImageButton按键效果)

    这个代码几乎涉及到了摄像头开发的所有方面,(除了PreviewCallback,这块东西我会结合android摄像头自动识别人脸/火灾来谈),且力求精简,是杂家的心血阿!相对之前改进之处有: 1,精简 ...

  7. Android摄像头 只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理 底层Surface

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

  8. 2013新春奉送 Android摄像头开发完美demo--- 循环聚焦 缩放大小 旋转picture 查询支持的pict

    [补充:我已在对此代码进行了全面的升级,升级后代码结构更加利于维护扩展,全面适配所有手机,参见博文.此文中的资源也不要再下载了,请下载升级后的代码,如有问题请留言反馈,谢谢.------------- ...

  9. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)...

    Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...

  10. Android摄像头调用失败问题

    Android摄像头调用失败问题 问题描述: 之前在机顶盒上面对接视频会议APK时,发现第三方应用调用Camera.open()无法打开通过usb外接的摄像头. 定位分析: 我们通过阅读Android ...

最新文章

  1. 学计算机专业需要考的证有哪些科目,自考计算机专业的考试科目有哪些?
  2. Java实用教程笔记 类与对象
  3. 《系统集成项目管理工程师》必背100个知识点-54冲突解决方法
  4. 解决pip使用异常No module named 'pip'
  5. 《Java程序设计》实验报告——Java的基本程序设计结构
  6. display属性_CSS之使用display:inline-block来布局
  7. mysql pdo 读取字段名_PHP使用PDO从mysql读取大量数据处理详解
  8. python3.X 使用pip 离线安装whl包(转载)
  9. 科普文:服务器上如何 Node 多版本共存 #31
  10. 字符串匹配BF/RK/BM/KMP算法
  11. Python+matplotlib数据可视化鼠标悬停自动标注功能实现
  12. 推理游戏---个人解答
  13. JQuery datatables - column ordering, searching with multi header lines
  14. MAC使用青花瓷(charles)抓包
  15. @DependsOn或depends-on配置的使用
  16. 京东价格监控软件开发技术探讨一:C#实现获取京东商品信息(价格、库存)
  17. android上如何多开微信,手机微信多开怎么弄 安卓手机微信多开教程
  18. 【63测试20161111】【BFS】【DP】【字符串】
  19. 微型6轴惯性导航姿态传感器(IMU)LPMS-BE2 OEM
  20. java multi tenancy_MybatisPlus 多租户架构(Multi-tenancy)实现详解

热门文章

  1. Linux后台启动脚本
  2. Intel DCM 携手DELL共同推出关于DCIM的联合调研
  3. 【Elasticsearch】Mapping APIs
  4. ECMAScript6 新特性——“数组的扩展”
  5. AC自动机1030 [JSOI2007]文本生成器
  6. 使用Sublime Text 2 编辑Markdown
  7. Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
  8. java socket网络编程
  9. 镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵_守护灵重置方法_3DM手游...
  10. 后台传一个状态值,如果在vue设置成正常停用?