У меня есть класс с именем «Выполнить», он расширяет Activity и реализует «SurfaceHolder.callback».
Я пытаюсь сделать снимок из cameraPreview и сохранить путь к снятому изображению с помощью MediaStore,Позже я бы сохранил этот путь в таблице БД SQLite.
Мне удалось отобразить cameraPreview, но когда я нажимаю кнопку, чтобы сделать снимок, приложение вылетает, и logCat сообщает, что существует исключение NullPointerException.Она выделяет следующую строку
uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, cv);
Я просмотрел некоторые учебные пособия и все еще не могу найти свою ошибку.
Это правильный способ сохранить путь к изображению, полученному камерой, чтобыЯ могу сохранить путь в БД позже?
Код и logcat указаны ниже
public class Run extends Activity implements SurfaceHolder.Callback{
Button btn01;
private android.hardware.Camera camera;
private SurfaceHolder holder;
SurfaceView sv01;
boolean previewing = false;
Uri uriTarget;
//final CameraSurfacePreviewDemo cameraSurfacePreviewDemo = new CameraSurfacePreviewDemo(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//This line is to, set the orientation of the screen as well as adjust the viewing perspective.
//without this line, the the default orientation is horizontal, and the viewing perspective is reversed.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().setFormat(PixelFormat.UNKNOWN);
sv01 = (SurfaceView) findViewById(R.id.sv01);
//Intialize The Surface Holder Properly
this.holder = sv01.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btn01 = (Button) findViewById(R.id.btn01);
btn01.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
camera.takePicture(myShutterCallback, myPictureCallbackRaw, myPictureCallbackJPG);
}
});
}
ShutterCallback myShutterCallback = new ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
}
};
PictureCallback myPictureCallbackRaw = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
}
};
PictureCallback myPictureCallbackJPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length);
ContentValues cv = new ContentValues();
cv.put(Images.Media.TITLE, "title");
cv.put(Images.Media.BUCKET_ID, "test");
cv.put(Images.Media.DESCRIPTION, "test image taken");
uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, cv);
OutputStream imageFileOS;
try {
imageFileOS = getContentResolver().openOutputStream(uriTarget);
imageFileOS.write(data);
imageFileOS.flush();
imageFileOS.close();
Toast.makeText(getBaseContext(), "ImageSaved" +uriTarget.toString(), Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
};
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if(previewing){
camera.stopPreview();
previewing = false;
}
if (camera != null){
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
previewing = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera = android.hardware.Camera.open();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}
}
LogCat:
03-19 09:25:58.145: E/Surface(8932): Surface::init token -2 identity 285
03-19 09:26:05.115: E/AndroidRuntime(8932): FATAL EXCEPTION: main
03-19 09:26:05.115: E/AndroidRuntime(8932): java.lang.NullPointerException
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.os.Parcel.readException(Parcel.java:1328)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:408)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.content.ContentResolver.insert(ContentResolver.java:604)
03-19 09:26:05.115: E/AndroidRuntime(8932): at com.androidbook.CameraPreviewDemo.Run$3.onPictureTaken(Run.java:95)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:571)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.os.Looper.loop(Looper.java:130)
03-19 09:26:05.115: E/AndroidRuntime(8932): at android.app.ActivityThread.main(ActivityThread.java:3691)
03-19 09:26:05.115: E/AndroidRuntime(8932): at java.lang.reflect.Method.invokeNative(Native Method)
03-19 09:26:05.115: E/AndroidRuntime(8932): at java.lang.reflect.Method.invoke(Method.java:507)
03-19 09:26:05.115: E/AndroidRuntime(8932): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
03-19 09:26:05.115: E/AndroidRuntime(8932): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
03-19 09:26:05.115: E/AndroidRuntime(8932): at dalvik.system.NativeStart.main(Native Method)