2010-11-19 54 views
0

我在某些代碼上有NPE,我不知道爲什麼。我相信這是件小事,但我似乎無法找到它 - 這就是我正在嘗試做的事。獲取空指針,我不知道爲什麼

捕捉照片,檢測臉部,如果沒有臉部,則在ImageView上顯示圖像,並允許用戶選擇拍攝其他照片。

這裏是我的代碼:

if (facesFound < 1) { 
    ImageView imageView = (ImageView) findViewById(R.id.false_view); 
    TextView textView = (TextView) findViewById(R.id.badPicText); 
    textView.setText(R.string.noFaceFive); 
    imageView.setImageBitmap(bitmap565); 
} 

這是我的方法中:

private void detectFaces() { 
    //Here is the method I use to snap a photo then detect for faces: 
} 
public void processCameraImage(Intent intent) { 
    setContentView(R.layout.detectlayout); // detectlayout 
    ImageView imageView = (ImageView) findViewById(R.id.image_view); // image_view 
    cameraBitmap = (Bitmap) intent.getExtras().get("data"); 
    imageView.setImageBitmap(cameraBitmap); 
    detectFaces(); 
} 

奇怪的是,當檢測到面部時,它工作得很好 - 並將它們放在圖像一個ImageView說它的確,像這樣

if (facesFound > 0){ 
    //face detection code 
    //write the bmp to an output stream, compress 
    ImageView imageView = (ImageView) findViewById(R.id.image_view); 
    TextView textView = (TextView) findViewById(R.id.textViewGoodPic); 
    textView.setText(R.string.yesFace); 
    imageView.setImageBitmap(bitmap565); 
} 

任何人都知道,我可能會去錯了嗎?

謝謝!

編輯:應用程序崩潰時,應用程序檢測到沒有面孔,我嘗試寫入照片和一些文本到ImageView

編輯:這裏是logcat

11-18 19:42:39.825: ERROR/AndroidRuntime(4244): FATAL EXCEPTION: main 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.project.dtf/com.project.dtf.DTF}: java.lang.NullPointerException 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3589) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3631) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread.access$3000(ActivityThread.java:129) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2137) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.os.Looper.loop(Looper.java:143) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread.main(ActivityThread.java:4701) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at dalvik.system.NativeStart.main(Native Method) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244): Caused by: java.lang.NullPointerException 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at com.project.dtf.DTF.detectFaces(DTF.java:130) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at com.project.dtf.DTF.processCameraImage(DTF.java:90) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at com.project.dtf.DTF.onActivityResult(DTF.java:57) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
11-18 19:42:39.825: ERROR/AndroidRuntime(4244):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3585) 

編輯:問題仍然沒有解決=/

這裏有兩個電話:

if (facesFound < 1) { 
    setContentView(R.layout.detectfalse); 
    ImageView imageView = (ImageView) findViewById(R.id.false_view); 
    TextView textView = (TextView) findViewById(R.id.badPicText); 
    textView.setText(R.string.noFace); 
    imageView.setImageBitmap(bitmap565); 
} 

if (facesFound > 0) { 
    showToast(this, "Face Detected!"); 
    //do stuff 

    setContentView(R.layout.detectlayout); 
    ImageView imageView = (ImageView) findViewById(R.id.image_view); 
    TextView textView = (TextView) findViewById(R.id.textViewGoodPic); 
    textView.setText(R.string.yesFace); 
    imageView.setImageBitmap(bitmap565); 
} 

請記住,我沒有在這個方法setContentView

public void processCameraImage(Intent intent) { 

    setContentView(R.layout.detectlayout); // detectlayout 
    ImageView imageView = (ImageView) findViewById(R.id.image_view); // image_view 
    cameraBitmap = (Bitmap) intent.getExtras().get("data"); 

    imageView.setImageBitmap(cameraBitmap); 
    detectFaces(); 
} 

facedetect類甚至被稱爲前,就是我要去的地方錯了嗎?

+0

NPE的堆棧跟蹤說什麼代碼行是從哪裏來的? – 2010-11-19 00:34:17

+0

這些行:ImageView imageView =(ImageView)findViewById(R.id.false_view); TextView textView =(TextView)findViewById(R.id.badPicText); textView.setText(R.string.noFaceFive); imageView.setImageBitmap(bitmap565); – Sapp 2010-11-19 00:35:07

+0

您確定自己製作了setContentView,並且您將其設置爲的佈局包含R.id.false_view和R.id.badPicText?位圖bitmap565是否設置?你能爲我們提供異常的確切堆棧跟蹤嗎?請複製粘貼整個異常。並告訴我們它所指的確切路線。謝謝:) – 2010-11-19 00:39:23

回答

1

爲什麼你使用兩種佈局?我幾乎可以肯定你的問題是在不調用setContentView(R.layout.blabla_whatever)的情況下使用findViewById(R.id.false_view),其中blabla_whatever.xml包含false_view

你爲什麼不只是這樣做:

ImageView imageView = (ImageView) findViewById(R.id.image_view);  
TextView textView = (TextView) findViewById(R.id.textViewGoodPic); 
if (facesFound > 0){  
    //face detection code  
    //write the bmp to an output stream, compress  
    textView.setText(R.string.yesFace);  
    imageView.setImageBitmap(bitmap565);  
}else{ 
    textView.setText(R.string.noFaceFive);  
    imageView.setImageBitmap(bitmap565);  
} 

再次...除非你展示一個完全不同的佈局,你不會需要使用不同的ImageViews也不TextView顯示結果。

如果您堅持使用不同的佈局,請務必在使用findViewById方法之前致電setContentView(R.layout.noface_layout)

編輯

現在我知道爲什麼你認爲你需要另一個佈局。你可以只使用一種佈局。這是你可以做的:

OnClickListener editPhoto = new OnClickListener(){ 
    public void onClick(){ 
     // edit photo stuff 
    } 
}; 

OnClickListener takePhotoAgain = new OnClickListener(){ 
    public void onClick(){ 
     // take the photo again 
    } 
}; 

ImageView imageView = (ImageView) findViewById(R.id.image_view);  
TextView textView = (TextView) findViewById(R.id.textViewGoodPic); 
Button actionButton = (Button) findViewById(R.id.some_id); 

if (facesFound > 0){  
    //face detection code  
    //write the bmp to an output stream, compress  
    textView.setText(R.string.yesFace);  
    imageView.setImageBitmap(bitmap565);  
    actionButton.setText("Face detected, edit it!"); 
    actionButton.setOnClickListener(editPhoto); 
}else{ 
    textView.setText(R.string.noFaceFive);  
    imageView.setImageBitmap(bitmap565);  
    actionButton.setText("You are too ugly for me, take another picture!"); 
    actionButton.setOnClickListener(takePhotoAgain); 
} 
+0

好吧,我的一個佈局上有一個按鈕,允許再次拍攝照片,並說臉部未檢測到!而另一種佈局說人臉檢測!並且有一個按鈕,允許用戶裁剪臉部並將其用作頭像......所以我真的需要2種不同的佈局......一種用於檢測臉部時,另一種用於臉部未檢測時的佈局。 – Sapp 2010-11-19 00:49:31

+0

不,你不知道。讓我編輯我的答案... – Cristian 2010-11-19 00:55:34

+0

神聖的廢話,對我來說是一個疏忽 - 謝謝克里斯蒂安!編碼有差異嗎?我希望能夠使用其中一個,但每個佈局顯示不同的屬性=/ – Sapp 2010-11-19 00:57:10

相關問題