저는이 안드로이드 앱 (내 코드 아님)으로 작업하고 있습니다. 이제 사진을 찍을 때 문제가 발견되었습니다. "삼성 노트 10.1 타블렛에서 잘 작동하고있다."그러나 내 휴대폰에서 시도해 보니 앱을 찍을 때 앱이 멈춘다. 나는 지금 해결책을 찾고있는 며칠 동안 여기에 갇혀 있고 더 이상 문제를 추적 할 곳을 모른다.android에서 사진을 찍는 중 이미지 값이 null입니다.
프로그램을 디버깅하고 이미지가 null 인 것을 발견했습니다. 데이터에는 값이 있습니다. 이 코드는 어디에 내가 문제를 발견
private Camera.PictureCallback takePictureCallback = new Camera.PictureCallback(){
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v(TAG,"takePictureCallback.onPictureTaken");
Bitmap image = processImage(data);
if(mTakePictureListener!=null){
mTakePictureListener.onTakePicture(image);
}
}
};
나는 세부 사항을 충분히 설명 할 수 없기 때문에 죄송합니다. 나는 정말로 약간의 도움에 감사 할 것이다. 당신이 원하면 더 많은 정보를 요구할 수 있습니다. 여기
여기10-27 09:02:22.593 1664-1664/com.project.app V/CameraPreview﹕ preview started
10-27 09:02:22.593 1664-1664/com.project.app V/CameraPreview﹕ SurfaceChanged finished
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: left = 0
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: left = 0
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: top = 0
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: right = 480`
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: bottom = 24
10-27 09:02:31.121 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: mProgressDrawable.setBounds()
10-27 09:02:31.431 1664-1664/com.project.app V/CameraPreview﹕ postPreview.onPictureTaken
10-27 09:02:31.461 1664-1664/com.project.app D/skia﹕ --- SkImageDecoder::Factory returned null
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ java.lang.NullPointerException
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview.processImage(CameraPreview.java:90)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview.access$200(CameraPreview.java:27)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview$3.onPictureTaken(CameraPreview.java:65)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at android.os.Looper.loop(Looper.java:176)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5317)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-27 09:02:31.461 1664-1664/com.project.app W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
10-27 09:02:31.471 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: left = 0
10-27 09:02:31.471 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: top = 0
10-27 09:02:31.471 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: right = 480
10-27 09:02:31.471 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: bottom = 0
10-27 09:02:31.471 1664-1664/com.project.app D/ProgressBar﹕ updateDrawableBounds: mProgressDrawable.setBounds()
10-27 09:02:31.852 1664-1664/com.project.app V/CameraPreview﹕ takePictureCallback.onPictureTaken
10-27 09:02:31.902 1664-1664/com.project.app I/dalvikvm-heap﹕ Grow heap (frag case) to 36.449MB for 19660816-byte allocation
10-27 09:02:31.932 1664-1673/com.project.app D/dalvikvm﹕ GC_FOR_ALLOC freed 70K, 13% free 36412K/41608K, paused 37ms, total 37ms
10-27 09:02:31.952 1664-1673/com.project.app D/AbsListView﹕ [unregisterDoubleTapMotionListener]
10-27 09:02:31.952 1664-1673/com.project.app I/MotionRecognitionManager﹕ .unregisterListener :/listener count = 0->0,
10-27 09:02:31.952 1664-1673/com.project.app D/AbsListView﹕ unregisterIRListener() is called
10-27 09:02:31.952 1664-1673/com.project.app D/AbsListView﹕ [unregisterDoubleTapMotionListener]
10-27 09:02:31.952 1664-1673/com.project.app I/MotionRecognitionManager﹕ .unregisterListener :/listener count = 0->0,
10-27 09:02:31.952 1664-1673/com.project.app D/AbsListView﹕ unregisterIRListener() is called
10-27 09:02:31.972 1664-1668/com.project.app E/dalvikvm﹕ adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-27 09:02:31.972 1664-1668/com.project.app D/dalvikvm﹕ GC_CONCURRENT freed 790K, 15% free 35625K/41608K, paused 4ms+3ms, total 41ms
10-27 09:02:32.242 1664-1664/com.project.app D/dalvikvm﹕ GC_FOR_ALLOC freed 4325K, 25% free 31300K/41608K, paused 24ms, total 24ms
10-27 09:02:32.242 1664-1664/com.project.app I/dalvikvm-heap﹕ Forcing collection of SoftReferences for 14745616-byte allocation
10-27 09:02:32.272 1664-1664/com.project.app D/dalvikvm﹕ GC_BEFORE_OOM freed 11K, 25% free 31289K/41608K, paused 30ms, total 30ms
10-27 09:02:32.272 1664-1664/com.project.app E/dalvikvm-heap﹕ Out of memory on a 14745616-byte allocation.
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ "main" prio=5 tid=1 RUNNABLE
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x419199a0 self=0x41909300
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ | sysTid=1664 nice=0 sched=0/0 cgrp=apps handle=1075561948
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ | state=R schedstat=(0 0 0) utm=1561 stm=218 core=0
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.graphics.Bitmap.nativeCreate(Native Method)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:695)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:628)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at capture.CameraPreview.processImage(CameraPreview.java:94)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at capture.CameraPreview.access$200(CameraPreview.java:27)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at capture.CameraPreview$2.onPictureTaken(CameraPreview.java:51)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.hardware.Camera$EventHandler.handleMessage(Camera.java:846)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.os.Looper.loop(Looper.java:176)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at android.app.ActivityThread.main(ActivityThread.java:5317)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at java.lang.reflect.Method.invokeNative(Native Method)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at java.lang.reflect.Method.invoke(Method.java:511)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ at dalvik.system.NativeStart.main(Native Method)
10-27 09:02:32.282 1664-1664/com.project.app I/dalvikvm﹕ [ 10-27 09:02:32.282 1664: 1664 W/System.err ]
java.lang.OutOfMemoryError
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.graphics.Bitmap.nativeCreate(Native Method)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:695)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:628)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview.processImage(CameraPreview.java:94)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview.access$200(CameraPreview.java:27)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at capture.CameraPreview$2.onPictureTaken(CameraPreview.java:51)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.hardware.Camera$EventHandler.handleMessage(Camera.java:846)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.os.Looper.loop(Looper.java:176)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5317)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-27 09:02:32.282 1664-1664/com.project.app W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
10-27 09:02:32.292 1664-1664/com.project.app D/AndroidRuntime﹕ Shutting down VM
10-27 09:02:32.292 1664-1664/com.project.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41918930)
10-27 09:02:32.332 1664-1664/com.project.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at capture.CaptureFragment.bitmapToFile(CaptureFragment.java:544)
at capture.CaptureFragment.access$100(CaptureFragment.java:65)
at capture.CaptureFragment$2.onTakePicture(CaptureFragment.java:117)
at capture.CameraPreview$2.onPictureTaken(CameraPreview.java:54)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:846)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5317)
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:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
가 CameraPreview 여기
private AutoFocusCallback onFocus = new AutoFocusCallback(){
@Override
public void onAutoFocus(boolean success, Camera camera) {
justTakeTheDamPicture();
}
};
private Camera.PictureCallback takePictureCallback = new Camera.PictureCallback(){
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v(TAG,"takePictureCallback.onPictureTaken");
Bitmap image = processImage(data);
if(mTakePictureListener!=null){
mTakePictureListener.onTakePicture(image);
}
}
};
private Camera.PictureCallback postPreviewCallback = new Camera.PictureCallback(){
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v(TAG,"postPreview.onPictureTaken");
if(data!=null){
Bitmap image = processImage(data);
if(mTakePictureListener!=null){
mTakePictureListener.onPostPreview(image);
}
}
}
};
private Bitmap processImage(byte[] data){
try{
Options options = new Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length, options);
long currTime = System.currentTimeMillis();
Bitmap croppedImage = null;
Bitmap resizedImage = null;
Matrix matrix = new Matrix();
matrix.postRotate(90);
if(image.getHeight()>image.getWidth()){
croppedImage = Bitmap.createBitmap(image, 0,(image.getHeight()/2)-(image.getWidth()/2),image.getWidth(), image.getWidth(),matrix,false);
resizedImage = Bitmap.createScaledBitmap(croppedImage, IMAGE_WIDTH, IMAGE_WIDTH, false);
}else{
croppedImage = Bitmap.createBitmap(image, (image.getWidth()/2)-(image.getHeight()/2),0,image.getHeight(), image.getHeight(),matrix,false);
resizedImage = Bitmap.createScaledBitmap(croppedImage, IMAGE_WIDTH, IMAGE_WIDTH, false);
}
long croppingTime = System.currentTimeMillis() - currTime;
Log.v(TAG,"Cropping time: "+croppingTime);
return resizedImage;
}catch(OutOfMemoryError e){
e.printStackTrace();
Toast.makeText(getContext(),R.string.out_of_memory, Toast.LENGTH_LONG);
return null;
}catch(Exception e){
e.printStackTrace();
Toast.makeText(getContext(),e.getMessage(), Toast.LENGTH_LONG);
return null;
}
}
private Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback(){
@Override
public void onShutter() {
if(mTakePictureListener!=null)
mTakePictureListener.onShutter();
}
};
private static String TAG = "CameraPreview";
public interface TakePictureListener{
public void onTakePicture(Bitmap bitmap);
public void onPostPreview(Bitmap image);
public void onShutter();
}
public CameraPreview(Context context,SurfaceView surfaceView,FrameLayout surfaceFrame) {
super(context);
mSurfaceView = surfaceView;
mSurfaceFrame = surfaceFrame;
setFrameSize();
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Log.v(TAG,"Contructor finished");
}
private void justTakeTheDamPicture(){
mCamera.takePicture(shutterCallback, null, postPreviewCallback, takePictureCallback);
}
private void setCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
if(mPreviewSizes==null)
mPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
if(mPreviewSize==null){
for(Camera.Size size : mPreviewSizes){
if(mPreviewSize==null || mPreviewSize.width<size.width){
mPreviewSize = size;
if(mPreviewSize.width>mScreenSize.x) break;
}
}
}
Log.v(TAG,"Preview Size: "+mPreviewSize.width+"x"+mPreviewSize.height);
LayoutParams surfaceViewParams = mSurfaceView.getLayoutParams();
float scaleFactor = 0;
if(android.os.Build.VERSION.SDK_INT >= 8)
{ // If API >= 8 -> rotate display...
mCamera.setDisplayOrientation(90);
// when rotated, need to interchange
scaleFactor = (float)mFrameSize/mPreviewSize.height;
surfaceViewParams.width = (int) (mPreviewSize.height*scaleFactor);
surfaceViewParams.height = (int) (mPreviewSize.width*scaleFactor);
}else{
scaleFactor = (float)mFrameSize/mPreviewSize.width;
surfaceViewParams.width = (int) (mPreviewSize.width*scaleFactor);
surfaceViewParams.height = (int) (mPreviewSize.height*scaleFactor);
}
mSurfaceView.setLayoutParams(surfaceViewParams);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
if(parameters.getFocusMode()!=null){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
if(parameters.getFlashMode()!=null){
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
}
// Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE does not work on some samsung devices
// so try and catch the error and revert to Camera.Parameters.FOCUS_MODE_AUTO
try{
mCamera.setParameters(parameters);
}catch(RuntimeException e){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
e.printStackTrace();
}
}
private void setFrameSize() {
LayoutParams surfaceLayoutParams = mSurfaceFrame.getLayoutParams();
Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
mScreenSize = new Point();
display.getSize(mScreenSize);
mFrameSize = mScreenSize.x;
surfaceLayoutParams.width = mFrameSize;
surfaceLayoutParams.height = mFrameSize;
mSurfaceFrame.setLayoutParams(surfaceLayoutParams);
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int format, int width, int height) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
if(mCamera!=null){
setCameraParameters();
// Important: Call startPreview() to start updating the preview surface.
// Preview must be started before you can take a picture.
mCamera.startPreview();
Log.v(TAG,"preview started");
}
Log.v(TAG,"SurfaceChanged finished");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mCamera != null)
{
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
Log.v(TAG,"SurfaceDestroyed finished");
}
/**
* When this function returns, mCamera will be null.
*/
private void stopPreviewAndFreeCamera() {
if (mCamera != null) {
// Call stopPreview() to stop updating the preview surface.
mCamera.stopPreview();
// Important: Call release() to release the camera for use by other
// applications. Applications should release the camera immediately
// during onPause() and re-open() it during onResume()).
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
stopPreviewAndFreeCamera();
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
setCameraParameters();
} catch (Exception e)
{
if(mCamera!=null){
mCamera.release();
mCamera = null;
}
e.printStackTrace();
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
}
public void takePicture(){
if(mCamera!=null){
try{
if(mCamera.getParameters().getFocusMode()==Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE){
mCamera.autoFocus(onFocus);
}else{
justTakeTheDamPicture();
}
}catch(Exception e){
e.printStackTrace();
justTakeTheDamPicture();
}
}
}
public void setTakePictureListener(TakePictureListener l){
mTakePictureListener = l;
}
public Camera getCamera(){
return mCamera;
}
의 코드 인 로그 캣 것은 캡처 조각
private OnClickListener onCapture = new OnClickListener(){
@Override
public void onClick(View v) {
if(mPreview!=null){
mPreview.takePicture();
}
}
};
private CameraPreview.TakePictureListener takePictureListener = new CameraPreview.TakePictureListener() {
@Override
public void onTakePicture(Bitmap bitmap) {
Capture cap = Capture.getInstance(getActivity());
cap.setUri(bitmapToFile(bitmap));
//cap.save();
showLastCroppped();
changeCaptureStatus(CaptureStatus.HasImageNoFields);
}
@Override
public void onShutter() {
changeCaptureStatus(CaptureStatus.TakingPicture);
}
@Override
public void onPostPreview(Bitmap image) {
imagePreviewContainer.setImageBitmap(image);
imagePreviewContainer.setVisibility(View.VISIBLE);
}
};
private Uri bitmapToFile(Bitmap bmp){
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/Alliwant";
SimpleDateFormat simpleDate = new SimpleDateFormat("ddMMyy-hhmmss.SSS");
File dir = new File(file_path);
if(!dir.exists())
dir.mkdirs();
String filename = simpleDate.format(new Date());
File file = new File(dir, "gift" + filename + ".png");
FileOutputStream fOut;
Uri fileUri = null;
try {
fOut = new FileOutputStream(file);
fileUri = Uri.fromFile(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
bmp.compress(Bitmap.CompressFormat.PNG, 85, fOut);
try {
fOut.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
try {
fOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return fileUri;
}
processImage() 코드 및 로그캣 예외 로그? – blizzard
@Goyzki : java.lang.NullPointerException at capture.CaptureFragment.bitmapToFile (CaptureFragment.java:544)'그 밖의 무엇이 필요할 수 있습니까? – njzk2
@ njzk2, 방금 logcat을 편집했는데 이미지 값이 null이라는 것을 알 수 있지만 이유는 모르겠습니다. – Goyzki