2016-01-04 6 views
0

Довольно простая проблема с Android: я пытаюсь показать Android «Toast» на примере Android Cookbook для обнаружения лица. Тем не менее, кажется, что метод Toast не разрешен в FaceDetectionView.java, который я включил ниже в конец кода. Код ошибки я получаю ниже:Android показывает тост в API Facedetection

Error:(113, 22) error: no suitable method found for makeText(FaceDetectionView,float,int) 
method Toast.makeText(Context,int,int) is not applicable 
(actual argument FaceDetectionView cannot be converted to Context by method invocation conversion) 
method Toast.makeText(Context,CharSequence,int) is not applicable 
(actual argument FaceDetectionView cannot be converted to Context by method invocation conversion) 

Это Main.java:

package com.examples.androface; 

import android.app.Activity; 
import android.os.Bundle; 

public class Main extends Activity 
    { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
      { 
       super.onCreate(savedInstanceState); 
       setContentView(new FaceDetectionView(this, "face5.JPG")); 
      } 
    } 

Это FaceDetectionView.java:

package com.examples.androface; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.graphics.Rect; 
import android.media.FaceDetector; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

/** 
* @author wdavid01 
* 
*/ 
public class FaceDetectionView extends View 
    { 
    private static final String tag = FaceDetectionView.class.getName(); 
    private static final int NUM_FACES = 10; 
    private FaceDetector arrayFaces; 
    private final FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES]; 
    private FaceDetector.Face getFace = null; 

    private final PointF eyesMidPts[] = new PointF[NUM_FACES]; 
    private final float eyesDistance[] = new float[NUM_FACES]; 

    private Bitmap sourceImage; 

    private final Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private final Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private final Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); 

    private int picWidth, picHeight; 
    private float xRatio, yRatio; 
    private ImageLoader mImageLoader = null; 

    public FaceDetectionView(Context context, String imagePath) 
     { 
     super(context); 
     init(); 
     mImageLoader = ImageLoader.getInstance(context); 
     sourceImage = mImageLoader.loadFromFile(imagePath); 
     detectFaces(); 

     } 

    private void init() 
     { 
     Log.d(tag, "Init()..."); 
     pInnerBullsEye.setStyle(Paint.Style.FILL); 
     pInnerBullsEye.setColor(Color.RED); 
     pOuterBullsEye.setStyle(Paint.Style.STROKE); 
     pOuterBullsEye.setColor(Color.RED); 
     tmpPaint.setStyle(Paint.Style.STROKE); 
     tmpPaint.setTextAlign(Paint.Align.CENTER); 
     BitmapFactory.Options bfo = new BitmapFactory.Options(); 
     bfo.inPreferredConfig = Bitmap.Config.RGB_565; 

     } 

    private void loadImage(String imagePath) 
     { 
     sourceImage = mImageLoader.loadFromFile(imagePath); 
     } 

    @Override 
    protected void onDraw(Canvas canvas) 
     { 
     Log.d(tag, "onDraw()..."); 

     xRatio = getWidth() * 1.0f/picWidth; 
     yRatio = getHeight() * 1.0f/picHeight; 
     canvas.drawBitmap(sourceImage, null, new Rect(0, 0, getWidth(), getHeight()), tmpPaint); 
     for (int i = 0; i < eyesMidPts.length; i++) 
      { 
      if (eyesMidPts[i] != null) 
       { 
       pOuterBullsEye.setStrokeWidth(eyesDistance[i]/6); 
       canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y * yRatio, eyesDistance[i]/2, pOuterBullsEye); 
       canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y * yRatio, eyesDistance[i]/6, pInnerBullsEye); 
       } 
      } 
     } 

    private void detectFaces() 
     { 
     Log.d(tag, "detectFaces()..."); 

     picWidth = sourceImage.getWidth(); 
     picHeight = sourceImage.getHeight(); 

     arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES); 
     arrayFaces.findFaces(sourceImage, getAllFaces); 

     for (int i = 0; i < getAllFaces.length; i++) 
      { 
      getFace = getAllFaces[i]; 
      try 
       { 
       PointF eyesMP = new PointF(); 
       getFace.getMidPoint(eyesMP); 
       eyesDistance[i] = getFace.eyesDistance(); 
       eyesMidPts[i] = eyesMP; 

       Log.i("Face", i + " " + getFace.confidence() + " " + getFace.eyesDistance() + " " + "Pose: (" + getFace.pose(FaceDetector.Face.EULER_X) + "," + getFace.pose(FaceDetector.Face.EULER_Y) + "," + getFace.pose(FaceDetector.Face.EULER_Z) + ")" + "Eyes Midpoint: (" + eyesMidPts[i].x + "," + eyesMidPts[i].y + ")"); 
       Toast.makeText(FaceDetectionView.this, getFace.confidence(), 
         Toast.LENGTH_LONG).show(); 
       } 
      catch (Exception e) 
       { 
       Log.e("Face", i + " is null"); 
       } 
      } 
     } 
    } 

@RRR после нанесения раствора ниже даже если код скомпилирован при запуске, я получаю это сообщение об ошибке: Не кажется, что контекст все еще создан правильно:

20106-20106/com.examples.androface E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.examples.androface, PID: 20106 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.examples.androface/com.examples.androface.Main}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5257) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                      at android.widget.Toast.<init>(Toast.java:101) 
                      at android.widget.Toast.makeText(Toast.java:258) 
                      at com.examples.androface.FaceDetectionView.detectFaces(FaceDetectionView.java:122) 
                      at com.examples.androface.FaceDetectionView.<init>(FaceDetectionView.java:52) 
                      at com.examples.androface.Main.onCreate(Main.java:13) 
                      at android.app.Activity.performCreate(Activity.java:5990) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)  
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:135)  
                      at android.app.ActivityThread.main(ActivityThread.java:5257)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at java.lang.reflect.Method.invoke(Method.java:372)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  
01-04 05:27:26.006 20106-20112/com.examples.androface W/art: Suspending all threads took: 16.056ms 
01-04 05:27:49.109 20106-20106/? I/Process: Sending signal. PID: 20106 SIG: 9 

ответ

0

Context магазин в одной переменной

Context context; 
public FaceDetectionView(Context context, String imagePath) 
{ 
    this.context=context; 
    //rest of your code 
} 

контекст использования всякий раз, когда вы пытаетесь показать Toast.

Toast.makeText(context, getFace.confidence(), 
        Toast.LENGTH_LONG).show(); 

убедитесь getFace.confidence() должно быть строковое значение в противном случае concate его с «»

Toast.makeText(context, ""+getFace.confidence(), 
        Toast.LENGTH_LONG).show(); 
+1

Отлично, как вы указали, я добавил контекст контекста; и this.context = context; к моему существующему классу, а затем добавьте «» к числу. Большое спасибо – Amir

+0

@Amir Добро пожаловать, счастливое кодирование! –

+0

жаль, что это все еще происходит. Несмотря на то, что программа скомпилирована в порядке. Я все еще получаю сообщение об ошибке при попытке запустить программу. Я добавил код под последней строкой кода Log.e («Лицо», i + «равно null»); и я получил ошибку при работе на устройстве и AVD Toast.makeText (контекст, «Не работает», Toast.LENGTH_LONG) .show(); – Amir

0

Попробуйте это: Добавить новую переменную для сохранения контекста

package com.examples.androface; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.graphics.Rect; 
import android.media.FaceDetector; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

/** 
* @author wdavid01 
* 
*/ 
public class FaceDetectionView extends View 
{ 
private static final String tag = FaceDetectionView.class.getName(); 
private static final int NUM_FACES = 10; 
private FaceDetector arrayFaces; 
private final FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES]; 
private FaceDetector.Face getFace = null; 

private final PointF eyesMidPts[] = new PointF[NUM_FACES]; 
private final float eyesDistance[] = new float[NUM_FACES]; 

private Bitmap sourceImage; 

private final Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
private final Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); 
private final Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); 

private int picWidth, picHeight; 
private float xRatio, yRatio; 
private ImageLoader mImageLoader = null; 
private Context context; 

public FaceDetectionView(Context context, String imagePath) 
    { 
    super(context); 
    init(); 
    this.context = context; 
    mImageLoader = ImageLoader.getInstance(context); 
    sourceImage = mImageLoader.loadFromFile(imagePath); 
    detectFaces(); 

    } 

private void init() 
    { 
    Log.d(tag, "Init()..."); 
    pInnerBullsEye.setStyle(Paint.Style.FILL); 
    pInnerBullsEye.setColor(Color.RED); 
    pOuterBullsEye.setStyle(Paint.Style.STROKE); 
    pOuterBullsEye.setColor(Color.RED); 
    tmpPaint.setStyle(Paint.Style.STROKE); 
    tmpPaint.setTextAlign(Paint.Align.CENTER); 
    BitmapFactory.Options bfo = new BitmapFactory.Options(); 
    bfo.inPreferredConfig = Bitmap.Config.RGB_565; 

    } 

private void loadImage(String imagePath) 
    { 
    sourceImage = mImageLoader.loadFromFile(imagePath); 
    } 

@Override 
protected void onDraw(Canvas canvas) 
    { 
    Log.d(tag, "onDraw()..."); 

    xRatio = getWidth() * 1.0f/picWidth; 
    yRatio = getHeight() * 1.0f/picHeight; 
    canvas.drawBitmap(sourceImage, null, new Rect(0, 0, getWidth(), getHeight()), tmpPaint); 
    for (int i = 0; i < eyesMidPts.length; i++) 
     { 
     if (eyesMidPts[i] != null) 
      { 
      pOuterBullsEye.setStrokeWidth(eyesDistance[i]/6); 
      canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y * yRatio, eyesDistance[i]/2, pOuterBullsEye); 
      canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y * yRatio, eyesDistance[i]/6, pInnerBullsEye); 
      } 
     } 
    } 

private void detectFaces() 
    { 
    Log.d(tag, "detectFaces()..."); 

    picWidth = sourceImage.getWidth(); 
    picHeight = sourceImage.getHeight(); 

    arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES); 
    arrayFaces.findFaces(sourceImage, getAllFaces); 

    for (int i = 0; i < getAllFaces.length; i++) 
     { 
     getFace = getAllFaces[i]; 
     try 
      { 
      PointF eyesMP = new PointF(); 
      getFace.getMidPoint(eyesMP); 
      eyesDistance[i] = getFace.eyesDistance(); 
      eyesMidPts[i] = eyesMP; 

      Log.i("Face", i + " " + getFace.confidence() + " " + getFace.eyesDistance() + " " + "Pose: (" + getFace.pose(FaceDetector.Face.EULER_X) + "," + getFace.pose(FaceDetector.Face.EULER_Y) + "," + getFace.pose(FaceDetector.Face.EULER_Z) + ")" + "Eyes Midpoint: (" + eyesMidPts[i].x + "," + eyesMidPts[i].y + ")"); 
      Toast.makeText(context, getFace.confidence() + "", 
        Toast.LENGTH_LONG).show(); 
      } 
     catch (Exception e) 
      { 
      Log.e("Face", i + " is null"); 
      } 
     } 
    } 
} 
+0

Как любой различию из приведенного выше кода? – Amir

+0

Вы пытаетесь это сделать, см. Различные в Contructor и Toast.makeText(); –

1

Вы не можете использовать View в первом аргументе для Toast.makeText.

Вместо этого попробуйте

Toast.makeText(getContext(), getFace.confidence(), 
        Toast.LENGTH_LONG).show(); 
+0

У меня такая же ошибка. – Amir

+0

Это не может быть той же самой ошибкой, если коды не были перекомпилированы должным образом. Пожалуйста, опубликуйте новую ошибку. –

+0

Не уверен, что вы знаете достаточно Android. Проблема здесь не в том, какой текст вы здесь помешали, проблема в том, что Toast не допускается в этом классе из-за того, что Android знает, getContext() или FaceDetectionView.this или это или контекст в ответ ниже все делают то же самое. Однако проблема в другом. – Amir