2010-11-19 20 views
0

J'ai un NPE sur un code et je n'ai aucune idée pourquoi. Je suis sûr que c'est quelque chose de trivial, mais je n'arrive pas à le trouver - voici ce que j'essaie de faire.Obtenir Null Pointer et je ne sais pas pourquoi

Prendre une photo, détecter des visages, s'il n'y a pas de visages, puis afficher l'image sur un ImageView et permettre à l'utilisateur de prendre une autre photo.

Voici mon code:

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); 
} 

c'est dans ma méthode:

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(); 
} 

La chose étrange est, lorsqu'un visage est détecté, il fonctionne très bien - et les met image un ImageView disant qu'il a fait, comme si

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); 
} 

Quelqu'un sait où je pourrais aller mal?

Merci!

EDIT: l'application se bloque lorsque l'application détecte aucun visage et je tente d'écrire la photo et du texte à l'ImageView.

EDIT: Voici le 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: Vous avez encore des problèmes =/

Voici les deux appels:

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); 
} 

ET

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); 
} 

Gardez à l'esprit, je l'ai fait setContentView dans cette méthode:

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(); 
} 

avant la classe facedetect est même appelée, est que là où je me trompe?

+0

De quelle ligne de code la trace de pile de NPE dit-elle qu'elle provient? –

+0

ces lignes: 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

êtes-vous sûr que vous avez créé setContentView et que la disposition que vous avez définie contient R.id.false_view et R.id.badPicText? Le bitmap bitmap565 est-il défini? pouvez-vous nous fournir la piletrace exacte de l'exception? s'il vous plaît copiez coller l'exception entière. Et dites-nous la ligne exacte à laquelle il se réfère. Merci :) –

Répondre

1

Pourquoi utilisez-vous deux dispositions? Je suis presque sûr que votre problème utilise findViewById(R.id.false_view) sans appeler setContentView (R.layout.blabla_whatever), où blabla_whatever.xml contient false_view.

Pourquoi ne pas faire quelque chose comme:

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);  
} 

Encore une fois ... sauf si vous affichez une présentation complètement différente, vous auriez pas besoin d'utiliser différents ImageViews ni TextView pour montrer le résultat.

Si vous insistez pour avoir des dispositions différentes, veillez à appeler le setContentView(R.layout.noface_layout) avant d'utiliser la méthode findViewById.

Modifier

Maintenant je sais pourquoi vous pensez que vous avez besoin d'une autre mise en page. Vous pouvez cependant utiliser une seule mise en page. Voici ce que vous pouvez faire:

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

Eh bien, une de mes mises en page a un bouton qui permet de reprendre l'image, et qui dit Face Not Detected! Alors qu'une autre disposition dit Face détectée! Et a un bouton qui permet à l'utilisateur de recadrer le visage et de l'utiliser comme un avatar ... donc j'ai vraiment besoin de 2 mises en page différentes ... une pour les moments où les visages sont détectés, et un autre pour quand ils ne le sont pas. – Sapp

+0

Non, vous ne le faites pas. Laisse-moi éditer ma réponse ... – Cristian

+0

Merde, quelle erreur de ma part - merci Cristian! Est-ce que le fait d'avoir différentes mises en page est un mauvais codage? Je veux être capable d'en utiliser un, mais chaque mise en page affiche des attributs différents =/ – Sapp