MainActivity.java
package com.example.tphone; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Locale; import android.app.Activity; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.PixelFormat; import android.graphics.Rect; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.location.Location; import android.os.Build; import android.os.Bundle; import android.text.format.DateFormat; import android.util.DisplayMetrics; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements SurfaceHolder.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.jpg"; /** Called when the activity is first created. */ @SuppressWarnings("deprecation") @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); /* 使应用程序全屏幕运行,不使用title bar */ requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); /* 判断存储卡是否存在 */ if(!checkSDCard()){ /* 提醒User未安装存储卡 */ mMakeTextToast( getResources().getText(R.string.str_err_nosd).toString(), true ); } /* 取得屏幕解析像素 */ DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); mTextView01 = (TextView) findViewById(R.id.myTextView1); mImageView01 = (ImageView) findViewById(R.id.myImageView1); /* 以SurfaceView作为相机Preview之用 */ mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); /* 绑定SurfaceView,取得SurfaceHolder对象 */ mSurfaceHolder01 = mSurfaceView01.getHolder(); /* Activity必须实现SurfaceHolder.Callback */ mSurfaceHolder01.addCallback(MainActivity.this); /* * 以SURFACE_TYPE_PUSH_BUFFERS(3) * 作为SurfaceHolder显示类型 * */ mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mButton01 = (Button)findViewById(R.id.myButton1); mButton02 = (Button)findViewById(R.id.myButton2); mButton03 = (Button)findViewById(R.id.myButton3); /* 打开相机及Preview */ mButton01.setOnClickListener(new Button.OnClickListener(){ public void onClick(View arg0){ /* 自定义初始化打开相机函数 */ initCamera(); } }); /* 停止Preview及相机 */ mButton02.setOnClickListener(new Button.OnClickListener(){ public void onClick(View arg0){ /* 自定义重置相机,并关闭相机预览函数 */ resetCamera(); } }); Bundle extras=getIntent().getExtras(); // latLongString=extras.getString("latLongString"); /* 拍照 */ mButton03.setOnClickListener(new Button.OnClickListener(){ public void onClick(View arg0){ /* 当存储卡存在才允许拍照,存储暂存图像文件 */ if(checkSDCard()){ /* 自定义拍照函数 */ takePicture(); } else { /* 存储卡不存在显示提示 */ mTextView01.setText( getResources().getText(R.string.str_err_nosd).toString() ); } } }); } //图片名称自增 /* 自定义初始相机函数 */ private void initCamera(){ if(!bIfPreview){ /* 若相机非在预览模式,则打开相机 */ try{ mCamera01 = Camera.open(); Toast.makeText(this, "Camera.open()------------1", 5000).show(); Log.i(TAG,"Camera.open()------------1"); }catch(Exception e){ Log.i("Camera.open()-------->", "Exceptione :" + e); Toast.makeText(this, "Camera.open()--Exceptione"+e, 5000).show(); } } if (mCamera01 != null && !bIfPreview){ Log.i(TAG, "inside the camera"); /* 创建Camera.Parameters对象 */ Camera.Parameters parameters = mCamera01.getParameters(); if (Integer.parseInt(Build.VERSION.SDK) >= 8) setDisplayOrientation(mCamera01, 90); else { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { parameters.set("orientation", "portrait"); parameters.set("rotation", 90); } if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "landscape"); parameters.set("rotation", 90); } } /* 设置相片格式为JPEG */ parameters.setPictureFormat(PixelFormat.JPEG); /* 指定preview的屏幕大小 */ parameters.setPreviewSize(320, 240); /* 设置图片分辨率大小 */ parameters.setPictureSize(320, 240); /* 将Camera.Parameters设置予Camera */ try{ mCamera01.setParameters(parameters); }catch(Exception e){ Log.i("archermind-------->", "Exceptione :" + e); } /* setPreviewDisplay唯一的参数为SurfaceHolder */ try{ mCamera01.setPreviewDisplay(mSurfaceHolder01); } catch (IOException e){ e.printStackTrace(); } /* 立即运行Preview */ mCamera01.startPreview(); bIfPreview = true; } } /* 拍照撷取图像 */ private void takePicture(){ if (mCamera01 != null && bIfPreview) { /* 调用takePicture()方法拍照 */ mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback); } } /* 相机重置 */ private void resetCamera(){ if (mCamera01 != null && bIfPreview){ mCamera01.stopPreview(); /* 扩展学习,释放Camera对象 */ bIfPreview = false; mCamera01.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().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg"; Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length); bm=generatorContactCountIcon(bm); /* 创建新文件 */ File myCaptureFile = new File("/sdcard/"+name); try{ BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); /* 采用压缩转档方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 100, bos); /* 调用flush()方法,更新BufferStream */ bos.flush(); /* 结束OutputStream */ bos.close(); /* 将拍照下来且存储完毕的图文件,显示出来 */ mImageView01.setImageBitmap(bm); /* 显示完图文件,立即重置相机,并关闭预览 */ resetCamera(); /* 再重新启动相机继续预览 */ initCamera(); } catch (Exception e){ Log.e(TAG, e.getMessage()); } } }; /* 自定义删除文件函数 */ private void delFile(String strFileName){ try{ File myFile = new File(strFileName); if(myFile.exists()){ myFile.delete(); } } catch (Exception e){ Log.e(TAG, e.toString()); e.printStackTrace(); } } public void mMakeTextToast(String str, boolean isLong){ if(isLong==true){ Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show(); } else{ Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); } } private boolean checkSDCard(){ /* 判断存储卡是否存在 */ if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){ return true; } else{ return false; } } public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h){ Log.i(TAG, "Surface surfaceChanged"); } public void surfaceCreated(SurfaceHolder surfaceholder){ Log.i(TAG, "Surface surfaceCreated"); } public void surfaceDestroyed(SurfaceHolder surfaceholder){ /* 当Surface不存在,需要删除图片 */ Log.i(TAG, "Surface surfaceDestroyed"); try{ //delFile(strCaptureFilePath); resetCamera(); } catch(Exception e){ e.printStackTrace(); } Log.i(TAG, "Surface Destroyed"); } //旋转90度 protected void setDisplayOrientation(Camera camera, int angle) { Method downPolymorphic; try { downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class }); if (downPolymorphic != null) downPolymorphic.invoke(camera, new Object[] { angle }); } catch (Exception e1) { } } private Bitmap generatorContactCountIcon(Bitmap icon){ //初始化画布 int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size); Log.i(TAG, "the icon size is "+iconSize); Bitmap contactIcon=Bitmap.createBitmap(320, 240, Config.ARGB_8888); Canvas canvas=new Canvas(contactIcon); //拷贝图片 Paint iconPaint=new Paint(); iconPaint.setDither(true);//防抖动 iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果 Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight()); Rect dst=new Rect(0, 0, 320, 240); canvas.drawBitmap(icon, src, dst, iconPaint); //在图片上创建经纬度 String contacyCount="经纬度:"+latLongString; //启用抗锯齿和使用设备的文本字距 Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG); countPaint.setColor(Color.RED); countPaint.setTextSize(20f); countPaint.setTypeface(Typeface.DEFAULT_BOLD); canvas.drawText(contacyCount, iconSize-60, 25, countPaint); Log.i(TAG, "结束==========="+latLongString); return contactIcon; } }
activity_main.xml
<RelativeLayout 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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/myTextView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <SurfaceView android:id="@+id/mSurfaceView1" android:layout_width="320dp" android:layout_height="240dp" android:visibility="visible" > </SurfaceView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <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_alignLeft="@+id/mSurfaceView1" android:layout_alignRight="@+id/mSurfaceView1" android:layout_below="@+id/mSurfaceView1" android:layout_marginTop="26dp" /> </RelativeLayout>
string.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">TPhone</string> <string name="action_settings">Settings</string> <string name="hello">Hello world!</string> <string name="str_err_nosd">您没有安装内存卡</string> <string name="str_button1">打开相机</string> <string name="str_button2">停止相机</string> <string name="str_take_picture">拍照</string> </resources>
开放权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.CAMERA" />