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 ...
随机推荐
- 使用timer8秒读取一次方法进行操作
public void TestofTimer() { System.Timers.Timer tt = new System.Timers.Timer(); //获取或设置引发 Elapsed 事件 ...
- WEB数据挖掘(十六)——Aperture数据抽取(9):数据源
One of the central concepts of Aperture is the notion of a DataSource. A DataSource contains all inf ...
- Unity3d:加载Gif格式图片
unity里不支持Gif格式的图片,网上搜索也没有相关资料,殊不知我们已经太相信度娘了,而没有了自己的分析,我们知道Gif图是由多个静态图做成的,那我们就回归本土,第一步:把gif拆成n个静态图放在集 ...
- 如何设置Grunt
原文地址: Step 1: Install Node.js Download a Node installer and run it. Installation packages are availa ...
- Angular JS 使用的注意事项
标签中ng-app,什么情况需要指定名称,什么时候又不需要呢? 1.ng-app="" <div ng-app="" ng-controller='myC ...
- axTE3DWindowEx双屏对比控件白屏解决方法以及网上方法的校正(CreateControlOveride)
环境:vs2012,TE 6.5.1,winfrom C# 要做skyline的双屏显示功能,网上找到方法是用axTE3DWindowEx控件实现,把控件拖进去,运行,发现axTE3DWindow是正 ...
- Winform学习手册(目录)
一.基础: WINFORM学习笔记——创建Winform项目 WINFORM学习手册——TextBox.Lable.Button WINFORM学习笔记——窗体生命周期 WINFORM学习手册——对话 ...
- Java浮点值拒绝服务漏洞危害分析
By 空虚浪子心 http://www.inbreak.net/ JAVA出了漏洞,CVE-2010-4476,会导致拒绝服务攻击.大家能从公告上,看到这样一段代码,挺长的.意思是只有开发人员写出这样 ...
- java学习路线(好资源大家分享)
对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...
- Android+Jquery Mobile学习系列(4)-页面跳转及参数传递
关于页面转场,这个必须得专门列出来说明一下,因为Jquery Mobile与普通的Web发开有一些区别,这个对于新手如果不了解的话,就会钻到死胡同.撸主前段时间就是很急躁地上手开发程序,结果在页面转场 ...