<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/white"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<SurfaceView
android:id="@+id/surfaceView"
android:visibility="visible"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</SurfaceView>
</LinearLayout>
string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">欢迎使用</string>
<string name="app_name">拍照</string>
<string name="str_err_nosd">※未发现安装SD记忆卡※</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ethan.photo.activity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".PhotoActivity"
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>
</manifest>
package com.ethan.photo.activity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Logger;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
/*
* 缺陷:想着采用下边菜单控制拍照,但没有解决菜单的方向显示,老是在一边竖着
* 请高手不吝赐教,多谢了!
*/
public class PhotoActivity extends Activity {
private SurfaceView surfaceView;
private Camera camera;
private static final String TAG = "PhotoActivity";
private boolean preview = false;
private static final int ITEM1 = Menu.FIRST;
private static final int ITEM2 = Menu.FIRST+1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
//木有标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//屏幕高亮
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.main);
//检测SD卡是否存在
if(!checkSDCard()) {
mMakeTextToast(getResources().getText(R.string.str_err_nosd).toString(), true);
}
// apiChangeOrientation();
//横屏
// this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
surfaceView.getHolder().setFixedSize(1024, 768);
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new SurfaceCallback());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,ITEM1,0,"拍照");
menu.add(0,ITEM2,0,"退出");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case ITEM1:
if(camera!=null) {
camera.autoFocus(null);
camera.takePicture(null, null, new TakePictureCallback());
Toast.makeText(getApplicationContext(), "拍摄成功!请继续", Toast.LENGTH_SHORT).show();
}
break;
case ITEM2:
if(camera!=null) {
if(preview) {
camera.stopPreview();
}
camera.release();
camera = null;
}
finish();
break;
}
return true;
}
private final class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
/* Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
// You need to choose the most appropriate previewSize for your app
Camera.Size previewSize = (Size) parameters.getSupportedPreviewSizes();// .... select one of previewSizes here
parameters.setPreviewSize(previewSize.width, previewSize.height);
camera.setParameters(parameters);
camera.startPreview();*/
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(camera!=null) {
if(preview) {
camera.stopPreview();
}
camera.release();
camera = null;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(camera!=null&&event.getRepeatCount()==0) {
switch(keyCode) {
case KeyEvent.KEYCODE_SEARCH:
camera.autoFocus(null);
break;
case KeyEvent.KEYCODE_CAMERA:
//中间确认键
case KeyEvent.KEYCODE_DPAD_CENTER:
//提供压缩后的
camera.takePicture(null, null, new TakePictureCallback());
default:
break;
}
}
return super.onKeyDown(keyCode, event);
}
private final class TakePictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
// TODO Auto-generated method stub
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new File(Environment.getExternalStorageDirectory()+"/camera/Pictures",System.currentTimeMillis()+".jpg");
Log.i(TAG,"D----->"+Environment.getExternalStorageDirectory());
FileOutputStream fos;
fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
camera.startPreview();
} catch (FileNotFoundException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
}
public void initCamera() {
try {
if(!preview) {
Log.i(TAG,"preview..............."+preview);
camera = Camera.open();
Log.i(TAG,"camera open................");
}
if(camera!=null&&!preview) {
WindowManager wn = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wn.getDefaultDisplay();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(display.getWidth(), display.getHeight());
parameters.setPreviewFrameRate(3);//每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("jpeg-quality", 85);
camera.setParameters(parameters);
//显示预览画面
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
preview = true;
}
} catch (IOException e) {
// TODO Auto-generated catch block
camera.release();
camera = null;
Log.e(TAG,e.toString());
}
}
public void mMakeTextToast(String str, boolean isLong)
{
if(isLong==true)
{
Toast.makeText(this, str, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(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;
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
if(camera!=null) {
if(preview) {
camera.stopPreview();
}
camera.release();
camera = null;
}
}
}
欢迎拍砖,不吝赐教!