简体   繁体   English

Android在Facedetection API中敬酒

[英]Android show a toast in Facedetection API

Fairly simple Android trouble: I'm trying to show an Android "Toast" on the Android Cookbook example for the face detection. 相当简单的Android麻烦:我正在尝试在Android Cookbook示例中显示一个Android“ Toast”以进行人脸检测。 However, it seems the Toast method is not allowed in the FaceDetectionView.java I included below towards end of the code. 但是,似乎在代码结尾处下面包含的FaceDetectionView.java中不允许使用Toast方法。 The error code I get is below: 我得到的错误代码如下:

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)

This is the Main.java: 这是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"));
            }
    }

This is the FaceDetectionView.java: 这是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 after applying the solution below even though the code is compiled when running I get this error message: It doesnt seem that the context is still created properly: 应用以下解决方案后,即使在运行时已编译代码,也@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

You can't use a View in your first argument for Toast.makeText . 您不能在Toast.makeText的第一个参数中使用View

Instead try 试一试

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

Try this: Add new variable for saving context 尝试以下操作:添加新变量以保存上下文

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

Store Context in one variable Context存储在一个变量中

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

use context whenever you are trying to show Toast . 尝试显示Toast时,请使用上下文。

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

make sure getFace.confidence() should be string value otherwise concate it with "" 确保getFace.confidence()应该是字符串值,否则将其与“”连接

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM