android 拍照+拍照button 以及返回按钮布局

公司最近做一个项目拍照总是崩溃,所以决定自己写一个拍照的方法,在网上调研一番,写了一个简单demo,现共享如下

主要CameraActivity

CameraActivity


package com.wondertek.video.camera;

import java.io.FileOutputStream;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;

import com.wondertek.xsgj.R;
/**
*

* @Description:TODO 拍照优化

* @author:skyCc

* @time:2014-6-6 下午5:03:10
*/
public class CameraActivity extends Activity {

public static final int CAMERA_RESULT = 1234;
public static final int REQUEST_PICKER_ALBUM = 2345;
private static String TAG = "CameraObserver";
public static String photopath = "";
Button buttonExit;
Button buttonCapture;
private Camera mCamera;
private CameraViewNew mPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// CameraObserver已经将photopath路径传过来了
Log.d(TAG, "CameraActivity onCreate photopath = " + photopath);
getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.capture_activity);
mCamera = getCameraInstance();
// 创建预览类,并与Camera关联,最后添加到界面布局中
mPreview = new CameraViewNew(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
// requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置横屏模式以及全屏模式
// setContentView(new CameraView(this,photopath)); //设置View
buttonCapture = (Button) findViewById(R.id.button_capture);
buttonCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
// TODO Auto-generated method stub
mCamera.takePicture(null, null, myPicture);

}
});
}

});
buttonExit=(Button) findViewById(R.id.button_exit);
buttonExit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}

/** 打开一个Camera */
public static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
Log.d(TAG, "打开Camera失败失败");
}
return c;
}

private PictureCallback myPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Log.d(TAG, " onPictureTaken = " + photopath);
try {
if (photopath.length() > 0)
data2file(data, photopath);
} catch (Exception e) {
}
camera.stopPreview();

}

private void data2file(byte[] w, String fileName) throws Exception {// 将二进制数据转换为文件的函数
FileOutputStream out = null;
try {
out = new FileOutputStream(fileName);
out.write(w);
out.close();
} catch (Exception e) {
if (out != null)
out.close();
throw e;
}
}
};
}

CameraViewNew


package com.wondertek.video.camera;

import java.io.IOException;

import org.jivesoftware.smack.sasl.SASLMechanism.Success;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

/**

* @Description:TODO重新布局拍照的界面

* @author:skyCc

* @time:2014-6-5 下午11:33:11

*/

public class CameraViewNew extends SurfaceView implements Callback{
private final static String TAG="CameraView";
private Camera mCamera;
private SurfaceHolder mHolder;
public CameraViewNew(Context context,Camera camera) {
super(context);
mCamera=camera;
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// TODO Auto-generated constructor stub
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if(mHolder.getSurface()==null){
return ;
}
mCamera.stopPreview();
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera =null;
}
}

capture_activity.xm


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
<Button
android:id="@+id/button_capture"
android:text="拍照"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<Button
android:text="返回"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button_exit"
android:layout_gravity="center"
/>
</LinearLayout>

时间: 2024-10-14 23:42:06

android 拍照+拍照button 以及返回按钮布局的相关文章

Android开发 更改返回按钮的图标

很多的Android应用左上角都有返回按钮 在默认的情况下 ADT会默认给一个返回图标 而作为开发需求 很多都要求定制一个新的图标 在Android的网站上 发现了2种可以更改的方法 1. 在java代码环境中设置 actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.back); 如果有错误提示 Call requires

Android Camera2拍照(一)——使用SurfaceView

原文:Android Camera2拍照(一)--使用SurfaceView Camera2 API简介 Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的android.hardware.Camera被废弃(下面称为Camera1),还有一个android.graphics.Camera,这个android.graphics.Camera不是用来照相的,是用来处理图像的,可以做出3D的图像效果之类的,之前的Camera1则由android.hardwa

android Camera拍照

通过Camera进行拍照步骤: 调用Camera的open()方法打开相机.该方法默认打开后置摄像头.如果需要打开指定摄像头,可以为该方法传入摄像头ID. 调用Camera的getParameters()方法获取拍照参数.该方法返回一个Camera.Parameters对象 调用Camera.Parameters对象方法设置拍照参数 调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder

Android扩展 - 拍照篇(Camera)

1.调用系统摄像头 1.声明常量和变量 2.按钮点击事件,打开系统摄像头 3.重写onActivityResult事件接收拍照返回 4.生成文件名返回路径 5.保存图片 [java] view plaincopy private static final int TAKE_PICTURE = 1; class btnGotoActivity02Listener implements OnClickListener { public void onClick(View v) { Intent in

Android选择/拍照 剪裁 base64/16进制/byte上传图片+PHP接收图片

转载请注明出处:http://blog.csdn.net/iwanghang/article/details/65633129觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧: 完整项目下载地址:http://download.csdn.net/detail/iwanghang/9792768 贴代码: 1.PHP: <?php namespace app\index\controller; class Upl

Android系统拍照源码

个人对于Android系统拍照的一些总结:一种自定义图片拍照路径 ,另一种直接利用Android拍照后经过处理的缩略图 特别注意第一种方式需要增加SDK读写权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 下面直接上源码 1 package com.example.camerademo; 2 3 import java.io.File; 4 import java.

Android学习起步 - Button按钮及事件处理

按钮和文本框算是比较简单的控件了,以下主要讲按钮的事件响应,三种写法(匿名内部类响应事件.外部类响应事件.本类直接响应事件) 点击按钮后文本框中会显示 ”按钮被单击了”,先看效果: 以下是这个界面的布局文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q

Android设置拍照或者上传本地图片

效果例如以下: 看代码: MainActivity类中: package com.example.ceshidemo; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Calendar; import android.app.Activity; import android.app.AlertDialog; import and

Android中设置半个屏幕大小且居中的按钮布局 (layout_weight属性)

先看如下布局 : 上图中,按钮的大小为屏幕的一半,然后居中显示在布局中央,每个人心中都有自己的答案,看看我的方法吧,布局布局xml如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout&