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 ...
随机推荐
- 查看80端口被占用的方法(IIS、apmserv、system)
端口如果被其他程序占用就不能正常启动,比如有时启动时会提示WEB启动失败,其实就是80 端口被占用了,而迅雷等下载软件恰恰就是占用了80端口,关掉就行了.但有时迅雷等都没有开 也启动不了,那就是别的东 ...
- unigui MessageDlg方法调用例子
procedure TfrmEmployee.btnDeleteClick(Sender: TObject);var aBool: Boolean;begin inherited; MessageDl ...
- 接口是干爹, 继承是亲爹 ---JAVA
接口(interface)是干爹, 因为你可以有很多很多的干爹爹... 继承(extends)是亲爹, 因为你只能有一个父类, 只有一个亲生的父亲. 单继承,多接口?./>./..
- 《Spring3.0就这么简单》第1章快速入门
问题 [如何将jsp中传递到HttpServletRequest的参数,自动装配到Java对象中] [成功] public void setUsernAme(String username) < ...
- css 文字超出变 ... 点点点
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
- IIS启用.net2.0
如果先安装.net2.0,后安装iis,则在IIS服务扩展中无法看到.net2.0,按如下方法可启用: C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/as ...
- Codeforces Gym 100803C Shopping 贪心
Shopping 题目连接: http://codeforces.com/gym/100803/attachments Description Your friend will enjoy shopp ...
- Apache的Order Allow Deny心得
Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权. 所以,最常用的是: O ...
- linux C(hello world)最大公约数和最小公倍数
# include <stdio.h> int main(void) { int x, y,temp; int r; printf("请输入两个正整数:\n"); sc ...
- 深入NGINX:我们如何设计它的性能和扩展性
为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...