有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Google Cloud Vision API显示空对象引用

我正在尝试构建一个安卓应用程序,我正在使用google cloud vision API来检测人脸。我正在学习this教程。问题是,我无法生成toast message在我单击按钮后应该显示在屏幕上,但logcat显示:

Attempt to invoke virtual method 'com.google.api.services.vision.v1.Vision$Images com.google.api.services.vision.v1.Vision.images()' on a null object reference

以下是代码:

主要活动。java

public class MainActivity extends AppCompatActivity {

private Button upload_button;
private ImageView image_capture;
final int CAMERA_PIC_REQUEST = 100;

private Vision vision;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    upload_button = (Button) findViewById(R.id.uploadb);
    image_capture=(ImageView)findViewById(R.id.capturedImage);

    if (ContextCompat.checkSelfPermission(this, 安卓.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{安卓.Manifest.permission.CAMERA},
                    5);
        }
    }

    Vision.Builder visionBuilder = new Vision.Builder(
            new NetHttpTransport(),
            new AndroidJsonFactory(),
            null);

    visionBuilder.setVisionRequestInitializer(
            new VisionRequestInitializer("AIzaSyAueQjrrY_GiXh7kNGlbDLKWhYP-4q77vI"));
    Vision vision = visionBuilder.build();

    upload_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /*Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);*/
            imageDectection();
        }
    });
}

private void imageDectection() {
    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {
                InputStream inputStream = getResources().openRawResource(R.raw.crewf);
                byte[] photoData = IOUtils.toByteArray(inputStream);

                Image inputImage = new Image();
                inputImage.encodeContent(photoData);

                Feature desiredFeature = new Feature();
                desiredFeature.setType("FACE_DETECTION");

                AnnotateImageRequest request = new AnnotateImageRequest();
                request.setImage(inputImage);
                request.setFeatures(Arrays.asList(desiredFeature));

                BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest();
                batchRequest.setRequests(Arrays.asList(request));

                BatchAnnotateImagesResponse batchResponse =
                        vision.images().annotate(batchRequest).execute();

                List<FaceAnnotation> faces = batchResponse.getResponses()
                        .get(0).getFaceAnnotations();

                int numberOfFaces = faces.size();

                String likelihoods = "";
                for(int i=0; i<numberOfFaces; i++) {
                    likelihoods += "\n It is " +
                            faces.get(i).getJoyLikelihood() +
                            " that face " + i + " is happy";
                }

                final String message =
                        "This photo has " + numberOfFaces + " faces" + likelihoods;

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                message, Toast.LENGTH_LONG).show();
                    }
                });

            } catch(Exception e) {
                Log.d("ERROR", e.getMessage());
            }
        }
    });
}
}

图片作为crewf.jpg存储在/res/raw位置。我尝试过将类型设置为LABEL_DETECTIONTEXT_DETECTIONLANDMARK_DETECTION,但都不起作用

有人能帮我吗


共 (0) 个答案