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

奇妙なことは、顔が検出されたときに、それだけで正常に動作している - と、画像上にそれらを置きますように

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はどこ私は間違っているかもしれませんか?

ありがとうございます!

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

なぜ2つのレイアウトを使用しますか?私はあなたの問題が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);  
} 

...あなたは完全に異なるレイアウトを示していない限り、あなたはImageViewsTextViewが結果を表示するためにさまざまな使用する必要はありません。

なぜあなただ​​けのような何かをしません。

異なるレイアウトを主張する場合は、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

私のレイアウトの1つに、写真を再び撮るためのボタンがあり、「顔が検出されません」と表示されています。別のレイアウトでは「顔が検出されました!そして、ユーザーが顔をトリミングしてアバターとして使用できるようにするボタンがあります...私は本当に2つの異なるレイアウトが必要です...顔が検出されたときと顔が検出されないときのための2つのレイアウトが本当に必要です。 – Sapp

+0

いいえ、そうではありません。私の答えを編集させてください... – Cristian

+0

聖なるもの、私の一部の監視はどうですか?ありがとうクリスチャン!異なるレイアウトのコーディングが貧弱ですか?私は1つを使用できるようにしたいが、それぞれのレイアウトは異なる属性を表示する=/ – Sapp

関連する問題