Получение нулевого указателя, и я понятия не имею, почему - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть 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 класс даже называется, это где я идунеправильно?

1 Ответ

1 голос
/ 19 ноября 2010

Почему вы используете два макета? Я почти уверен, что ваша проблема использует findViewById(R.id.false_view) без вызова setContentView (R.layout.blabla_whwhat), где blabla_whever.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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...