您的位置:首页 > 移动开发 > Android开发

android调用相机及拍照的存储和照片处理功能

2014-04-11 13:27 477 查看

import java.[/b]io.[/b]BufferedOutputStream;
import java.[/b]io.[/b]File;
import java.[/b]io.[/b]FileOutputStream;
import java.[/b]io.[/b]IOException;
import java.[/b]lang.[/b]reflect.[/b]Method;
import java.[/b]util.[/b]Calendar;
import java.[/b]util.[/b]Locale;

import android.[/b]app.[/b]Activity;
import android.[/b]content.[/b]res.[/b]Configuration;
import android.[/b]graphics.[/b]Bitmap;
import android.[/b]graphics.[/b]Bitmap.[/b]Config;
import android.[/b]graphics.[/b]BitmapFactory;
import android.[/b]graphics.[/b]Canvas;
import android.[/b]graphics.[/b]Color;
import android.[/b]graphics.[/b]Paint;
import android.[/b]graphics.[/b]Typeface;
import android.[/b]graphics.[/b]PixelFormat;
import android.[/b]graphics.[/b]Rect;
import android.[/b]hardware.[/b]Camera;
import android.[/b]hardware.[/b]Camera.[/b]PictureCallback;
import android.[/b]hardware.[/b]Camera.[/b]ShutterCallback;
import android.[/b]location.[/b]Location;
import android.[/b]os.[/b]Build;
import android.[/b]os.[/b]Bundle;
import android.[/b]text.[/b]format.[/b]DateFormat;
import android.[/b]util.[/b]DisplayMetrics;
import android.[/b]util.[/b]Log;
import android.[/b]view.[/b]SurfaceHolder;
import android.[/b]view.[/b]SurfaceView;
import android.[/b]view.[/b]View;
import android.[/b]view.[/b]Window;
import android.[/b]widget.[/b]Button;
import android.[/b]widget.[/b]ImageView;
import android.[/b]widget.[/b]TextView;
import android.[/b]widget.[/b]Toast;
public class CameraActivity extends Activity implements SurfaceHolder.[/b]Callback{
/* 创建私有Camera对象 */
private Camera mCamera01;
private Button mButton01, mButton02, mButton03;
/* 作为review照下来的相片之用 */
private ImageView mImageView01;
private TextView mTextView01;
private String TAG = "HIPPO";
private SurfaceView mSurfaceView01;
private SurfaceHolder mSurfaceHolder01;
String latLongString;
/* 默认相机预览模式为false */
private boolean bIfPreview = false;
Location location;
/* 将照下来的图片存储在此 */
//private String strCaptureFilePath = "/sdcard/camera_snap.[/b]jpg";
/** Called when the activity is first created.[/b] */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.[/b]onCreate(savedInstanceState);
/* 使应用程序全屏幕运行,不使用title bar */
requestWindowFeature(Window.[/b]FEATURE_NO_TITLE);
setContentView(R.[/b]layout.[/b]camera);

/* 判断存储卡是否存在 */
if(!checkSDCard()){
/* 提醒User未安装存储卡 */
mMakeTextToast(
getResources().[/b]getText(R.[/b]string.[/b]str_err_nosd).[/b]toString(),
true
);
}

/* 取得屏幕解析像素 */
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().[/b]getDefaultDisplay().[/b]getMetrics(dm);

mTextView01 = (TextView) findViewById(R.[/b]id.[/b]myTextView1);
mImageView01 = (ImageView) findViewById(R.[/b]id.[/b]myImageView1);

/* 以SurfaceView作为相机Preview之用 */
mSurfaceView01 = (SurfaceView) findViewById(R.[/b]id.[/b]mSurfaceView1);

/* 绑定SurfaceView,取得SurfaceHolder对象 */
mSurfaceHolder01 = mSurfaceView01.[/b]getHolder();

/* Activity必须实现SurfaceHolder.[/b]Callback */
mSurfaceHolder01.[/b]addCallback(CameraActivity.[/b]this);

/*
* 以SURFACE_TYPE_PUSH_BUFFERS(3)
* 作为SurfaceHolder显示类型
* */
mSurfaceHolder01.[/b]setType(SurfaceHolder.[/b]SURFACE_TYPE_PUSH_BUFFERS);

mButton01 = (Button)findViewById(R.[/b]id.[/b]myButton1);
mButton02 = (Button)findViewById(R.[/b]id.[/b]myButton2);
mButton03 = (Button)findViewById(R.[/b]id.[/b]myButton3);

/* 打开相机及Preview */
mButton01.[/b]setOnClickListener(new Button.[/b]OnClickListener(){
public void onClick(View arg0){
/* 自定义初始化打开相机函数 */
initCamera();
}
});

/* 停止Preview及相机 */
mButton02.[/b]setOnClickListener(new Button.[/b]OnClickListener(){
public void onClick(View arg0){
/* 自定义重置相机,并关闭相机预览函数 */
resetCamera();
}
});

Bundle extras=getIntent().[/b]getExtras();
latLongString=extras.[/b]getString("latLongString");
/* 拍照 */
mButton03.[/b]setOnClickListener(new Button.[/b]OnClickListener(){
public void onClick(View arg0){
/* 当存储卡存在才允许拍照,存储暂存图像文件 */
if(checkSDCard()){
/* 自定义拍照函数 */
takePicture();
}
else {
/* 存储卡不存在显示提示 */
mTextView01.[/b]setText(
getResources().[/b]getText(R.[/b]string.[/b]str_err_nosd).[/b]toString()
);
}
}
});
}
//图片名称自增

/* 自定义初始相机函数 */
private void initCamera(){
if(!bIfPreview){
/* 若相机非在预览模式,则打开相机 */
try{
mCamera01 = Camera.[/b]open();
Log.[/b]i(TAG,"Camera.[/b]open()------------1");
}catch(Exception e){
Log.[/b]i("Camera.[/b]open()-------->", "Exceptione :" + e);
}
}

if (mCamera01 != null && !bIfPreview){
Log.[/b]i(TAG, "inside the camera");

/* 创建Camera.[/b]Parameters对象 */
Camera.[/b]Parameters parameters = mCamera01.[/b]getParameters();
if (Integer.[/b]parseInt(Build.[/b]VERSION.[/b]SDK) >= 8)
setDisplayOrientation(mCamera01, 90);
else {
if (getResources().[/b]getConfiguration().[/b]orientation == Configuration.[/b]ORIENTATION_PORTRAIT) {
parameters.[/b]set("orientation", "portrait");
parameters.[/b]set("rotation", 90);
}
if (getResources().[/b]getConfiguration().[/b]orientation == Configuration.[/b]ORIENTATION_LANDSCAPE) {
parameters.[/b]set("orientation", "landscape");
parameters.[/b]set("rotation", 90);
}
}
/* 设置相片格式为JPEG */
parameters.[/b]setPictureFormat(PixelFormat.[/b]JPEG);

/* 指定preview的屏幕大小 */
parameters.[/b]setPreviewSize(320, 240);

/* 设置图片分辨率大小 */
parameters.[/b]setPictureSize(320, 240);

/* 将Camera.[/b]Parameters设置予Camera */
try{
mCamera01.[/b]setParameters(parameters);
}catch(Exception e){
Log.[/b]i("archermind-------->", "Exceptione :" + e);
}
/* setPreviewDisplay唯一的参数为SurfaceHolder */
try{
mCamera01.[/b]setPreviewDisplay(mSurfaceHolder01);
} catch (IOException e){
e.[/b]printStackTrace();
}

/* 立即运行Preview */
mCamera01.[/b]startPreview();
bIfPreview = true;
}
}

/* 拍照撷取图像 */
private void takePicture(){
if (mCamera01 != null && bIfPreview) {
/* 调用takePicture()方法拍照 */
mCamera01.[/b]takePicture(shutterCallback, rawCallback, jpegCallback);
}
}

/* 相机重置 */
private void resetCamera(){
if (mCamera01 != null && bIfPreview){
mCamera01.[/b]stopPreview();
/* 扩展学习,释放Camera对象 */
bIfPreview = false;
mCamera01.[/b]release();
mCamera01 = null;
}
}

private ShutterCallback shutterCallback = new ShutterCallback(){
public void onShutter() {
}
};

private PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] _data, Camera _camera) {
}
};
private PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] _data, Camera _camera){
/* onPictureTaken传入的第一个参数即为相片的byte */
String name = new DateFormat().[/b]format("yyyyMMdd_hhmmss",Calendar.[/b]getInstance(Locale.[/b]CHINA)) + ".[/b]jpg";
Bitmap bm = BitmapFactory.[/b]decodeByteArray(_data, 0, _data.[/b]length);
bm=generatorContactCountIcon(bm);
/* 创建新文件 */
File myCaptureFile = new File("/sdcard/"+name);
try{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
/* 采用压缩转档方法 */
bm.[/b]compress(Bitmap.[/b]CompressFormat.[/b]JPEG, 100, bos);

/* 调用flush()方法,更新BufferStream */
bos.[/b]flush();

/* 结束OutputStream */
bos.[/b]close();

/* 将拍照下来且存储完毕的图文件,显示出来 */
mImageView01.[/b]setImageBitmap(bm);

/* 显示完图文件,立即重置相机,并关闭预览 */
resetCamera();

/* 再重新启动相机继续预览 */
initCamera();
}
catch (Exception e){
Log.[/b]e(TAG, e.[/b]getMessage());
}
}
};

/* 自定义删除文件函数 */
private void delFile(String strFileName){
try{
File myFile = new File(strFileName);
if(myFile.[/b]exists()){
myFile.[/b]delete();
}
}
catch (Exception e){
Log.[/b]e(TAG, e.[/b]toString());
e.[/b]printStackTrace();
}
}

public void mMakeTextToast(String str, boolean isLong){
if(isLong==true){
Toast.[/b]makeText(CameraActivity.[/b]this, str, Toast.[/b]LENGTH_LONG).[/b]show();
}
else{
Toast.[/b]makeText(CameraActivity.[/b]this, str, Toast.[/b]LENGTH_SHORT).[/b]show();
}
}

private boolean checkSDCard(){
/* 判断存储卡是否存在 */
if(android.[/b]os.[/b]Environment.[/b]getExternalStorageState().[/b]equals(android.[/b]os.[/b]Environment.[/b]MEDIA_MOUNTED)){
return true;
}
else{
return false;
}
}

public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h){
Log.[/b]i(TAG, "Surface surfaceChanged");
}

public void surfaceCreated(SurfaceHolder surfaceholder){
Log.[/b]i(TAG, "Surface surfaceCreated");
}

public void surfaceDestroyed(SurfaceHolder surfaceholder){
/* 当Surface不存在,需要删除图片 */
Log.[/b]i(TAG, "Surface surfaceDestroyed");
try{
//delFile(strCaptureFilePath);
resetCamera();
}
catch(Exception e){
e.[/b]printStackTrace();
}
Log.[/b]i(TAG, "Surface Destroyed");
}
//旋转90度
protected void setDisplayOrientation(Camera camera, int angle) {
Method downPolymorphic;
try {
downPolymorphic = camera.[/b]getClass().[/b]getMethod("setDisplayOrientation", new Class[] { int.[/b]class });
if (downPolymorphic != null)
downPolymorphic.[/b]invoke(camera, new Object[] { angle });
} catch (Exception e1) {
}
}
private Bitmap generatorContactCountIcon(Bitmap icon){
//初始化画布
int iconSize=(int)getResources().[/b]getDimension(android.[/b]R.[/b]dimen.[/b]app_icon_size);
Log.[/b]i(TAG, "the icon size is "+iconSize);
Bitmap contactIcon=Bitmap.[/b]createBitmap(320, 240, Config.[/b]ARGB_8888);
Canvas canvas=new Canvas(contactIcon);
//拷贝图片
Paint iconPaint=new Paint();
iconPaint.[/b]setDither(true);//防抖动
iconPaint.[/b]setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
Rect src=new Rect(0, 0, icon.[/b]getWidth(), icon.[/b]getHeight());
Rect dst=new Rect(0, 0, 320, 240);
canvas.[/b]drawBitmap(icon, src, dst, iconPaint);

//在图片上创建经纬度
String contacyCount="经纬度:"+latLongString;
//启用抗锯齿和使用设备的文本字距
Paint countPaint=new Paint(Paint.[/b]ANTI_ALIAS_FLAG|Paint.[/b]DEV_KERN_TEXT_FLAG);
countPaint.[/b]setColor(Color.[/b]RED);
countPaint.[/b]setTextSize(20f);
countPaint.[/b]setTypeface(Typeface.[/b]DEFAULT_BOLD);
canvas.[/b]drawText(contacyCount, iconSize-60, 25, countPaint);
Log.[/b]i(TAG, "结束==========="+latLongString);
return contactIcon;
}
}

xml层:
<?xml version="1.[/b]0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.[/b]android.[/b]com/apk/res/android"
android:background="@drawable/white"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/myTextView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/blue"
android:text="@string/hello"
/>
<SurfaceView
android:id="@+id/mSurfaceView1"
android:visibility="visible"
android:layout_width="320dp"
android:layout_height="240dp">
</SurfaceView>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/myButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_button1"/>
<Button
android:id="@+id/myButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_button2"/>
<Button
android:id="@+id/myButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_take_picture"/>
</LinearLayout>
<ImageView
android:id="@+id/myImageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>

其中Intent传过来的值是获取经纬度的值。具体没有写出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: