您的位置:首页 > 其它

实例教程十三:拍照

2013-07-17 14:44 218 查看
不错的帖子:

仿UCWEB界面源码!
http://www.eoeandroid.com/thread-225509-1-1.html

Android MP3经典案例
http://www.eoeandroid.com/thread-212478-1-1.html

根据奇异高清UI界面源码 添加了一些功能
http://www.eoeandroid.com/thread-212872-1-1.html

Android 3D立体图片旋转
http://www.eoeandroid.com/thread-212512-1-1.html

------------帖子正文-----------------

原文链接:http://www.eoeandroid.com/thread-205293-1-1.html

拍照界面--main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<!-- 父界面 -->

<SurfaceView
android:id="@+id/sfvShow"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

<!-- 子界面 -->

<RelativeLayout
android:id="@+id/btnLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone" >

<Button
android:id="@+id/btnTakePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:onClick="takepicture"
android:text="@string/takepicture" />

<Button
android:id="@+id/btnAutoFocus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/btnTakePicture"
android:layout_marginRight="20dp"
android:layout_toLeftOf="@id/btnTakePicture"
android:onClick="takepicture"
android:text="@string/autoFocus" />
</RelativeLayout>

</FrameLayout>


拍照代码:MainActivity.java

package cn.itcast.picture;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
private RelativeLayout btnLayout;
private SurfaceView sfvShow;
private Camera camera;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE); //设置窗口无标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏
setContentView(R.layout.main);

initView();

}

private void initView() {
btnLayout = (RelativeLayout)this.findViewById(R.id.btnLayout);
//得到SurfaceView显示控件 ,只有得到它,才能捕获摄像头画面
sfvShow = (SurfaceView)this.findViewById(R.id.sfvShow);

sfvShow.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
sfvShow.getHolder().setFixedSize(176, 144);
sfvShow.getHolder().setKeepScreenOn(true); //使摄像头一直保持高亮
sfvShow.getHolder().addCallback(new SurfaceCallback());
}

private final class SurfaceCallback implements Callback{

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
try{
//打开摄像头
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(640, 480);
parameters.setPreviewFrameRate(5);
parameters.setPictureSize(640, 480);
parameters.setJpegQuality(80);
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);

//Log.i("摄像头参数", parameters.flatten());
}catch(Exception e){
e.printStackTrace();
}

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//一定要关闭摄像头,因为摄像头只能被一个使用
if(camera != null){
camera.release();
camera = null;
}

}

}

//拍照
public void takepicture(View v){
if(camera != null){
switch (v.getId()) {
case R.id.btnTakePicture:
camera.takePicture(null, null, new MyPictureCallBack());
break;
case R.id.btnAutoFocus:
//不想得到对焦后的事件,传NULL
camera.autoFocus(null);
break;
default:
break;
}
}
}

//经过压缩处理后的图片数据
private final class MyPictureCallBack implements PictureCallback{
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try{
File jpgFile = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
//输出 流
FileOutputStream outStream = new FileOutputStream(jpgFile);
outStream.write(data);
outStream.close();
//代表摄像头处理完照片了
camera.startPreview(); //开始预览
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
btnLayout.setVisibility(ViewGroup.VISIBLE);
return true; //返回true,销毁该事件,不要再往后传递了
}
return super.onTouchEvent(event);
}
}


清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itcast.picture"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<uses-permission android:name="android.permission.CAMERA" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 在SDCard中写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>


源码下载:takepicture.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: