public class MainActivity extends Activity {
private Preview mPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = new Preview(this);
setContentView(mPreview);
}
}
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
String mRootPath;
static final String PICFOLDER = "CameraTest";
Preview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Camera.Parameters params = camera.getParameters();
int w = params.getPreviewSize().width;
int h = params.getPreviewSize().height;
int format = params.getPreviewFormat();
YuvImage image = new YuvImage(data, format, w, h, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
Rect area = new Rect(0, 0, w, h);
image.compressToJpeg(area, 50, out);
Bitmap bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());
Calendar calendar = Calendar.getInstance();
String FileName = String.format("SH%02d%02d%02d-%02d%02d%02d.jpg",
calendar.get(Calendar.YEAR) % 100, calendar.get(Calendar.MONTH) + 1,
calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
mRootPath = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/" + PICFOLDER;
String path = mRootPath + "/" + FileName;
SaveBitmapToFileCache(bm, path);
}
private void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath) {
File fileCacheItem = new File(strFilePath);
OutputStream out = null;
try {
fileCacheItem.createNewFile();
out = new FileOutputStream(fileCacheItem);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e)
{
e.printStackTrace();
} } } });
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
로그캣
09-27 23:25:58.211 4453-4453/codename.humanitas E/Trace﹕ error opening trace file: No such file or directory (2)
09-27 23:25:58.211 4453-4453/codename.humanitas D/ActivityThread﹕ setTargetHeapUtilization:0.25
09-27 23:25:58.211 4453-4453/codename.humanitas D/ActivityThread﹕ setTargetHeapIdealFree:8388608
09-27 23:25:58.211 4453-4453/codename.humanitas D/ActivityThread﹕ setTargetHeapConcurrentStart:2097152
09-27 23:25:58.311 4453-4453/codename.humanitas I/Adreno200-EGL﹕ <qeglDrvAPI_eglInitialize:269>: EGL 1.4 QUALCOMM build: (CL2819715)
09-27 23:25:58.962 4453-4453/codename.humanitas E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at codename.humanitas.Preview$1.SaveBitmapToFileCache(MainActivity.java:131)
at codename.humanitas.Preview$1.onPreviewFrame(MainActivity.java:104)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:815)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4885)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
제 나름대로 이해하고 변형하기는 했는데
오류가 발생하네요
SaveBitmapToFileCache 쪽에 문제가 있는듯 한데 어떻게 해결하죠?