2010-11-19 3 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); 
} 

Кто-нибудь знает, где я мог бы быть неправильно?

Спасибо!

EDIT: приложение сбой, когда приложение не обнаруживает лица, и я стараюсь писать фото и текст к ImageView.

EDIT: Вот 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) 

EDIT: Тем не менее, имеющие проблемы =/

Вот оба вызова:

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 говорит, что это происходит? –

+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

+0

Вы уверены, что создали setContentView и что в макете, который вы установили для него, содержатся R.id.false_view и R.id.badPicText? Установлен ли битмап bitmap565? можете ли вы предоставить нам точную стеклу исключения? скопируйте все исключение. И скажите нам точную строку, на которую она ссылается. Спасибо :) –

ответ

1

Почему вы используете два макета? Я почти уверен, что ваша проблема заключается в использовании findViewById(R.id.false_view) без вызова setContentView (R.layout.blabla_whatever), где 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, чтобы показать результат.

Если вы настаиваете на наличии разных макетов, обязательно используйте setContentView(R.layout.noface_layout) перед использованием метода findViewById.

Редактировать

Теперь я знаю, почему вы думаете, нужен другой макет. Однако вы можете использовать только один макет. Это то, что вы можете сделать:

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

Ну, у одного из моих макетов есть кнопка на нем, которая позволяет снова снимать pic и говорит, что Face Not Detected! В то время как другой макет говорит Face Detected! И имеет кнопку, которая позволяет пользователю обрезать лицо и использовать его в качестве аватара ... так что мне действительно нужны 2 разных макета ... один для того, когда лица обнаружены, а другой - когда нет. – Sapp

+0

Нет, нет. Позвольте мне отредактировать мой ответ ... – Cristian

+0

Святое дерьмо, какой надзор с моей стороны - спасибо Кристиану! Имеет ли разные макеты плохое кодирование? Я хочу, чтобы иметь возможность использовать один, но каждый макет отображает разные атрибуты =/ – Sapp

Смежные вопросы