Android 拍照 代码实例
这是我做的一个简单的利用Android手机的摄像头进行拍照的实例。
在这里我实现了基本的拍照、照片的存储、自动对焦以及闪光灯,后续还需一些工作在以后我会一步步完成。
首先讲讲布局:
没错,就是这么简单的布局。我们先来实现拍照的基本功能,之后若是想要其他功能,一点一点加上去就可以了。
布局文件的代码如下,我们只需放进一个SurfaceView和一个ImageButton就可以了。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <SurfaceView
android:id="@+id/picSV"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</SurfaceView> <ImageButton
android:onClick="tackpic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:src="@android:drawable/ic_menu_camera" /> </FrameLayout>
既然我们使用到了摄像头,因此要增加权限:
<uses-permission android:name="android.permission.CAMERA"/>
由于之后还要把拍摄到的图片存到sdcard中,因此,在这里也一起加上写入sdcard的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后Androimanifest.xml中设置应用为横屏、全屏的:
Ctrl+点击 @style/AppTheme ,在 AppTheme中增加两行:
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
这样,当我们吧应用发布到手机的时候,布局默认就是横屏、全屏的效果。
下面就是要实现拍照功能了。为了方便,我就在代码中进行解读和注释:
package com.dongdong.tackpic; import java.io.FileOutputStream;
import java.io.IOException; import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.app.Activity;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View; public class MainActivity extends Activity { private SurfaceView picSV;
private Camera camera; @SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
picSV = (SurfaceView) findViewById(R.id.picSV);
picSV.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
picSV.getHolder().addCallback(new MyCallback());
} private class MyCallback implements Callback{ @Override
public void surfaceCreated(SurfaceHolder holder) { //我们在SurfaceView创建的时候就要进行打开摄像头、设置预览取景所在的SurfaceView、设置拍照的参数、开启预览取景等操作
try {
camera = Camera.open(); //打开摄像头
camera.setPreviewDisplay(picSV.getHolder()); //设置picSV来进行预览取景 Parameters params = camera.getParameters(); //获取照相机的参数
params.setPictureSize(800, 480); //设置照片的大小为800*480
params.setPreviewSize(800, 480); //设置预览取景的大小为800*480
params.setFlashMode("on"); //开启闪光灯
params.setJpegQuality(50); //设置图片质量为50 camera.setParameters(params); //设置以上参数为照相机的参数
camera.startPreview();
} catch (IOException e) { //开始预览取景,然后我们就可以拍照了
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) { //当SurfaceView销毁时,我们进行停止预览、释放摄像机、垃圾回收等工作
camera.stopPreview();
camera.release();
camera = null;
} }
public void tackpic(View v){
camera.autoFocus(new MyAutoFocusCallback()); //在我们开始拍照前,实现自动对焦
} private class MyAutoFocusCallback implements AutoFocusCallback{ @Override
public void onAutoFocus(boolean success, Camera camera) { camera.takePicture(null, null, null, new MyPictureCallback()); //开始拍照
} } private class MyPictureCallback implements PictureCallback{ @Override
public void onPictureTaken(byte[] data, Camera camera) { //将拍摄到的图片放到"/mnt/sdcard2/DCIM/Camera/"这个文件夹中
try {
FileOutputStream fos = new FileOutputStream("/mnt/sdcard2/DCIM/Camera/"+System.currentTimeMillis()+".jpg");
fos.write(data);
fos.close();
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
} }
}
以上便实现了所说的功能,利用Android手机里的摄像头进行拍照的具体步骤请见:http://blog.csdn.net/dongdong230/article/details/11480863
Android 拍照 代码实例的更多相关文章
- 功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析(转)
功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析 SimpleCropView是github上第一个第三方开源的图片修剪截取利器,功能强大,设计良好.我个人 ...
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...
- Android拍照+方形剪裁——附代码与效果图
本文链接 http://blog.csdn.net/xiaodongrush/article/details/29173567 參考链接 http://stackoverflow.com/ ...
- Intellij idea 和android studio 代码给混淆
Intellij idea 和android studio 代码给混淆 一.指令说明-optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassna ...
- web service上传参数代码实例
web service上传参数代码实例 这次做的项目用到webservice比较多,最开始在网上看的参考dome,发现都不行,后来发现安卓4.0以后有很大的不同,在做传参时,有些东西需要注意: 第一, ...
- 我的Android进阶之旅------>Android拍照小例子
今天简单的学习了一下android拍照的简单实现. 当然该程序是个小例子,非常简单,没有什么复杂的操作,但是可以学习到Android 拍照API流程. 1.在布局文件中添加一个 surfaceView ...
- android——拍照,相册图片剪切其实就这么简单
接触android这么久了.还没有真正的浩浩看看android拍照,相册图片剪切到底是怎么回事,每次都是从别人的代码一扣,就过来了.其实,谷歌提供的API已经很强大.只需要用的好,就那么几句就可以搞定 ...
- Android 常用代码大集合 [转]
[Android]调用字符串资源的几种方法 字符串资源的定义 文件路径:res/values/strings.xml 字符串资源定义示例: <?xml version="1.0&q ...
- 简单的 Android 拍照并显示以及获取路径后上传
简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...
随机推荐
- CCF 201312-2 ISBN号码 (水题)
问题描述 每一本正式出版的图书都有一个ISBN号码与 之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后 ...
- Win8制作和使用恢复盘
制作和使用恢复盘要制作恢复盘,请执行以下操作:注:确保计算机连接到交流电源.1. 将指针移至屏幕的右上角或右下角以显示超级按钮,然后单击搜索.2. 根据操作系统的不同,执行以下某项操作:• 在 Win ...
- 基于TF/IDF的聚类算法原理
一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...
- VS2010 Web网站发布详解
1.项目某一网站 右键 发布 出来对话框后 发布方法选择文件系统,发布前删除所有现有文件(选择此项) ,然后点击发布就OK了. 2.之后如果只修改aspx页面,编译下无需再次发布,如果修改了类库或.c ...
- Oracle复制表结构和表数据
一, 复制表结构及数据 create table z_xudebiao_test as select * from v_topic v where v.adddate > to_date('20 ...
- wpf随笔
因项目需要查找wpf.DataGrid的Binding方法, 由于其属于Dev框架体系内,偏向于winform并无Binding 1.且线程外更改UI控件还需要委托或者action,而Wpf控件仅需要 ...
- 解决 Cocos2d-x 中 Android.mk 手动添加源文件
转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...
- java连接mysql批量写入数据
1.采用公认的MYSQL最快批量提交办法 public void index() throws UnsupportedEncodingException, Exception { //1000个一提交 ...
- hdu 4493 Tutor 水题
Tutor Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4493 D ...
- 在C#中使用全局鼠标、键盘Hook
今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...