2016-01-04 40 views
0

相當簡單的Android麻煩:我試圖表現出對Android食譜例如面部檢測的Android的「吐司」。但是,在FaceDetectionView.java中,我不認爲Toast方法在代碼結束時包含在下面。錯誤代碼我得到的是如下:安卓顯示人臉檢測API舉杯

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的最後一行下添加了下面的代碼(「Face」,i +「is 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

你試試這個,看到不同的構造器和Toast.makeText(); –

1

你不能在你的第一個參數使用ViewToast.makeText

而是嘗試

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

我得到同樣的錯誤。 – Amir

+0

它,除非代碼是不正確重新編譯不能確切的同樣的錯誤。請發佈新錯誤。 –

+0

不知道你是否知道足夠的Android,這裏的問題不是你在這裏放置什麼文本,問題在於Toast不允許在這個類中由於Android知道的任何東西,getContext()或FaceDetectionView.this或this或context中的回答下面都做同樣的事情。但是,這個問題是另一回事。 – Amir