Android有两种拍照方法,一种是直接调用系统的照相Intent,使用 onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。

一、第一种方法

1、设计界面

  (1)、布局文件

  打开activity_main.xml文件。

  输入以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/bysystem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用系统相机不返回结果" />
<Button
android:id="@+id/byself"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用系统相机并返回结果" />
<ImageView
android:id="@+id/photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

2、程序文件

  打开“src/com.genwoxue.camera/MainActivity.java”文件。

  然后输入以下代码:

package com.genwoxue.camera;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSystem=null;
private Button btnSelf=null;
private File file=null;
private static final String FILENAME="photo.jpg";
private static String path="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSystem=(Button)super.findViewById(R.id.bysystem);
btnSelf=(Button)super.findViewById(R.id.byself);
//调用系统照相机,不返回结果
btnSystem.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
}
});
//调用系统照相机,返回结果
btnSelf.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
//判断外部存储卡是否存在
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(getApplicationContext(), "读取失败,SD存储卡不存在!", Toast.LENGTH_LONG).show();
return;
}
//判断文件是否存在
path=Environment.getExternalStorageDirectory().toString()+File.separator+"genwoxue"+File.separator+FILENAME;
file=new File(path);
if(!file.exists()){
File vDirPath = file.getParentFile();
vDirPath.mkdirs();
Toast.makeText(getApplicationContext(), "photo.jpg文件不存在!", Toast.LENGTH_LONG).show();
return;
}
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 1);
}
});
}
}

3、运行结果

   

  

二、第二种方法。

1、设计界面

  (1)、布局文件

  打开activity_main.xml文件。

  输入以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/byself"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照(自定义相机)" />
<SurfaceView
android:id="@+id/photo"
android:layout_width="300dip"
android:layout_height="400dip" />
</LinearLayout>

2、程序文件

  打开“src/com.genwoxue.cameradiy/MainActivity.java”文件。

  然后输入以下代码:

package com.genwoxue.cameradiy;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSelf=null;
private Camera camera=null;
private static final String TAG="PhotoDIY";
private String path="";
private boolean previewRuning=true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化SurfaceView
SurfaceView mpreview = (SurfaceView) this.findViewById(R.id.photo);
SurfaceHolder mSurfaceHolder = mpreview.getHolder();
mSurfaceHolder.addCallback(new SurfaceViewCallback());
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnSelf=(Button)super.findViewById(R.id.byself);
//拍照(自定义相机)
btnSelf.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
if(camera!=null){
camera.autoFocus(new AutoFocusCallbackimpl());
}
}
});
}
public class SurfaceViewCallback implements SurfaceHolder.Callback{
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int heith){
}
@Override
public void surfaceCreated(SurfaceHolder holder){
//现在智能机可能会有多个镜头:一般前置为1;后置为0
MainActivity.this.camera=Camera.open(0);
//设置参数
Parameters param=camera.getParameters();
param.setPictureFormat(PixelFormat.JPEG);
param.set("jpeg-quality",85);
param.setPreviewFrameRate(5);
camera.setParameters(param);
try {
camera.setPreviewDisplay(holder);   //成像在SurfaceView
} catch (IOException e) {
e.printStackTrace();
}
//开始预览
camera.startPreview();
previewRuning=true;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
if(camera!=null){
if(previewRuning){
camera.stopPreview();
previewRuning=false;
}
camera.release();
}
}
}
//调用takePicture()方法时,自动执行pictureCallback回调方法
public PictureCallback picture=new PictureCallback(){
@Override
public void onPictureTaken(byte[] data,Camera camera){
Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
//判断外部存储卡是否存在
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(getApplicationContext(), "读取失败,SD存储卡不存在!", Toast.LENGTH_LONG).show();
return;
}
//判断文件是否存在
path=Environment.getExternalStorageDirectory().toString()
+File.separator
+"genwoxue"
+File.separator
+System.currentTimeMillis()
+".jpg";
File file=new File(path);
if(!file.exists()){
File vDirPath = file.getParentFile();
vDirPath.mkdirs();
Toast.makeText(getApplicationContext(), "photo.jpg文件不存在!", Toast.LENGTH_LONG).show();
return;
}
try {
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);
try {
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
camera.stopPreview();
camera.startPreview();
}
};
//对焦回回调
public class AutoFocusCallbackimpl implements AutoFocusCallback{
public void onAutoFocus(boolean success,Camera camera){
if(success){
camera.takePicture(shutter, null, picture);
camera.stopPreview();
}
}
}
//快门回调
public ShutterCallback shutter=new ShutterCallback(){
public void onShutter(){
}
};
}

3、运行结果

  

第58章、拍照功能实现(从零开始学Android)相关推荐

  1. 从零开始学android:Android中的基本控件(上)

    从零开始学android:Android中的基本控件(上) 本章内容较多,下面只贴代码,大家只需要贴到自己eclipse里就知道作用^^! View组件简介 Android中的View组件包含了几乎所 ...

  2. 第88章、系统服务之NOTIFICATION_SERVICE服务(从零开始学Android)

    Notification通知将一个图标(包含一条可选的提示文本信息)填加到系统的状态栏(一般来说,Android手机的状态栏是在顶部,非底部,要注意噢)中,并将一条展开信息添加到通知窗口中.当用户选中 ...

  3. 从零开始学android编程_小白也能学得会!谷歌推出免费的Kotlin和Android开发课程...

    程序员书库(ID:CodingBook) 猿妹编译 链接:https://android-developers.googleblog.com/2020/07/learn-android-and-kot ...

  4. android拍照功能无预览,Android快速实现无预览拍照功能

    本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下 实现思路: 把预览的SurfaceView的宽高设置为肉眼看不出的值,例如0.1dp,其他的就是自定义相机的标 ...

  5. 从零开始学android编程_android初学者的入门秘籍

    大概是去年年底开始接触android 原本是学习嵌入式的我,领导让我看看能不能搞一下这个android APP. 一开始的我懵逼得很... 这android APP 不是得用java写吗??? 现在我 ...

  6. 第1章、从零开始学Android

    引子 滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 都付笑谈中 --------------------------- ...

  7. 第15章、布局Layouts之TableLayout表格布局(从零开始学Android)

    TableLayout表格布局 TableLayout是指将子元素的位置分配到行或列中.Android的一个TableLayout有许多TableRow组成,每一个TableRow都会定义一个Row. ...

  8. 第52章,bitmap图像处理(从零开始学android),第52章、Bitmap图像处理(从零开始学Android)...

    1.Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitma ...

  9. 第89章、系统服务之SMS服务(从零开始学Android)

    每逢佳节,中国移动.电信.联通都是偷偷笑的日子,又不知道多少短信费用纳入囊中,尽管微信.QQ.飞信漫天飞,但仍然阻挡不了节日祝福短信的火爆,但群发实在没有意义,你是不是想来一个既个性而又群发呢? 譬如 ...

  10. 第8章、下拉列表框Spinner(从零开始学Android)

    在Android App应用中,下拉列表框Spinner的使用频次是相当高的,如果你对Spinner陌生,你一定不会对HTML中的SELECT陌生,他们的作用是一样的,都是多选一.我们需要学习Andr ...

最新文章

  1. zigbee协议技术无线模块对智能家居市场前景分析
  2. zookeeper的acl权限控制_Zookeeper 权限控制 ACL介绍
  3. 改变idetity的值
  4. linux代理过载命令_我们基于Linux的机器人的未来,数据过载和管理以及更多新闻
  5. Win10 64位安装SQL2000(个人版)
  6. 离职潮来袭,但为什么HR还是很难招到人?
  7. 【OCR一】字符识别技术总览(转)
  8. 编写时间的php,PHP如何实现简单日历类编写 PHP实现简单日历类编写代码
  9. 集成学习——机器学习(周志华)
  10. 查看文件和文件夹大小
  11. 股票大作手回忆录投机感悟
  12. 9.mysql SQL面试题
  13. aid learning安装应用_aid learning更换源
  14. stm32f103 ds18B20 驱动及芯片资料
  15. 大自然的印钞机农夫山泉是如何干过一群互联网与电商大佬的
  16. 如何创建Vue脚手架以及关闭语法检查
  17. ClickHouse技术分享第二弹(英文讲义)
  18. 卡通鱼(cartoon fish)
  19. 马克思主义哲学(哲学概论)
  20. 由Finalizer和SocksSocketImpl引起的Fullgc问题盘点

热门文章

  1. OpenCL学习入门
  2. DoIP协议一致性测试
  3. 计算机硬盘驱动器可以删吗,有关删除存储驱动器上的数据的注意事项
  4. Java实现:归并排序
  5. android nfc MifareUltralight读写
  6. Python项目--飞机作战完整版(附带图片素材)
  7. win10微信多开bat
  8. 创维E900V21E机顶盒刷机固件 解决:不用设置有线自动连网
  9. python验证软件签名
  10. 用python自制一个简单的答题程序