代码是这样的:
package com.example.camera;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.R.string;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Button btn;
private Camera camera;
private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+"img";;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
MainActivity.this.setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback((Callback) this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//首先【检车SD卡是否存在。。
checkSoftStage();
/*拍摄按钮后*/
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//自动开始对焦。。
camera.autoFocus(new AutoFoucus());
}
});
}
/*对焦的实现--内部类*/
private final class AutoFoucus implements AutoFocusCallback{
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
//按下快门,回调函数
camera.takePicture(mShutterCallback, null, mCallback);
}
}
}
/*在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
* 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
*/
private final ShutterCallback mShutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d("ShutterCallback", "...onShutter...");
}
};
/*实例化本界面的一个PictureCallback
* 当用户拍完后出发。这是对图片处理并保存
*/
private final PictureCallback mCallback=new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera){
BufferedOutputStream outputStream = null;
String filename=System.currentTimeMillis()+".jpg";
File file=new File(imgPath, filename);
Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0,data.length);
try {
outputStream=new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outputStream);
outputStream.flush();
outputStream.close();
//下一步,要跳转到另外一个活动。
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
/*
* 检测手机是否存在SD卡,以及网络是否连接正常
*/
private void checkSoftStage() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//String path=Environment.getExternalStorageDirectory().getPath();
File file=new File(imgPath);
if (!file.exists()) {
file.mkdirs();
}
else {
//显示一个对话框:
new AlertDialog.Builder(this).setMessage("检测到手机没有插入内存卡,请插入内"
+"存卡再开启本程序").setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
finish();
}
}).show();
}
}
}
/*
*初始化相机。。
* @see android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder, int, int, int)
*/
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Parameters parameters=camera.getParameters();
parameters.setPreviewFormat(PixelFormat.JPEG);
parameters.setPictureSize(320,400);
camera.setParameters(parameters);
camera.startPreview();
}
/*
开始预览
* @see android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder)
*/
public void surfaceCreated(SurfaceHolder holder) { try {
camera=Camera.open(0);
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
camera.release();
camera=null;
}
} /*
*
* 关闭预览,释放资源
*/
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
if (camera!=null) {
camera.release();
camera=null;
}
}}
错误如下:
parameters
package com.example.camera;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.R.string;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Button btn;
private Camera camera;
private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+"img";;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
MainActivity.this.setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback((Callback) this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//首先【检车SD卡是否存在。。
checkSoftStage();
/*拍摄按钮后*/
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//自动开始对焦。。
camera.autoFocus(new AutoFoucus());
}
});
}
/*对焦的实现--内部类*/
private final class AutoFoucus implements AutoFocusCallback{
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
//按下快门,回调函数
camera.takePicture(mShutterCallback, null, mCallback);
}
}
}
/*在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
* 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
*/
private final ShutterCallback mShutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d("ShutterCallback", "...onShutter...");
}
};
/*实例化本界面的一个PictureCallback
* 当用户拍完后出发。这是对图片处理并保存
*/
private final PictureCallback mCallback=new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera){
BufferedOutputStream outputStream = null;
String filename=System.currentTimeMillis()+".jpg";
File file=new File(imgPath, filename);
Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0,data.length);
try {
outputStream=new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outputStream);
outputStream.flush();
outputStream.close();
//下一步,要跳转到另外一个活动。
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
/*
* 检测手机是否存在SD卡,以及网络是否连接正常
*/
private void checkSoftStage() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//String path=Environment.getExternalStorageDirectory().getPath();
File file=new File(imgPath);
if (!file.exists()) {
file.mkdirs();
}
else {
//显示一个对话框:
new AlertDialog.Builder(this).setMessage("检测到手机没有插入内存卡,请插入内"
+"存卡再开启本程序").setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
finish();
}
}).show();
}
}
}
/*
*初始化相机。。
* @see android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder, int, int, int)
*/
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Parameters parameters=camera.getParameters();
parameters.setPreviewFormat(PixelFormat.JPEG);
parameters.setPictureSize(320,400);
camera.setParameters(parameters);
camera.startPreview();
}
/*
开始预览
* @see android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder)
*/
public void surfaceCreated(SurfaceHolder holder) { try {
camera=Camera.open(0);
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
camera.release();
camera=null;
}
} /*
*
* 关闭预览,释放资源
*/
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
if (camera!=null) {
camera.release();
camera=null;
}
}}
错误如下:
parameters
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
还有我看你这个Activity里面的onCreate函数为什么没有setContentView(布局id). 你这样, 怎么能启动activity?
如你所说,上面的都有。。所以才费解
surfaceView都没实例化,怎么会不空指针