将相机图像传递到Google Vision API

时间:2019-02-26 23:55:54

标签: java android android-activity google-vision android-fileprovider

我绝对坚持下面的活动,我试图制作一个相机图片,将其保存,然后将其发送到Google Vision API,以便对其进行进一步处理。

使图像正常工作,将其保存到图库中; API请求也可以正常工作,因为我没有收到任何错误消息。但是,包含“图像分析”的Toast只是没有显示,我绝对不知道为什么。我非常确定,API请求不会失败,因为我在Logcat中可以看到诸如“ 400”之类的响应。但是,现在它根本不只是响应。

我尝试制作图片,将其保存到设备中,打开它,并将其作为Inputstream传递给Google Vision API。

任何提示或帮助将不胜感激,在此先感谢您!

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.services.vision.v1.Vision;
import com.google.api.services.vision.v1.VisionRequestInitializer;
import com.google.api.services.vision.v1.model.AnnotateImageRequest;
import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest;
import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse;
import com.google.api.services.vision.v1.model.FaceAnnotation;
import com.google.api.services.vision.v1.model.Feature;
import com.google.api.services.vision.v1.model.Image;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;


public class VisionAPIActivity extends AppCompatActivity {

    ImageView imageView2;
    ImageView imageView1;
    static final int REQUEST_TAKE_PHOTO = 1;
    String currentPhotoPath;
    final Uri photoURI = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vision_api);
        Toolbar toolbar = findViewById(R.id.toolbar);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });


    }

    public void imageClick(View view) throws FileNotFoundException {
        imageView2 = findViewById(R.id.imageView2);
        open();
    }

    public void open() throws FileNotFoundException {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                Toast.makeText(this,
                        "Photo file can't be created, please try again",
                        Toast.LENGTH_SHORT).show();
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                 final Uri photoURI = FileProvider.getUriForFile(this,
                        "xxx.xxxx.xxxx.provider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                Toast.makeText(this,
                        "Photo URI has been created",
                        Toast.LENGTH_SHORT).show();

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

            visionBuilder.setVisionRequestInitializer(
                    new VisionRequestInitializer("xxx"));
            final Vision vision = visionBuilder.build();

            Log.i("log-", "passed VisionBuilder Initialisation");

            // TODO:
            // Convert photo to byte array
            ImageView mImageView;
            mImageView = findViewById(R.id.imageView1);
            InputStream ims = getContentResolver().openInputStream(Uri.fromFile(photoFile));
            // just display image in imageview
            mImageView.setImageBitmap(BitmapFactory.decodeStream(ims));

            byte[] photoData = new byte[0];
            Log.i("log-", "Content of Photo Data" + photoData);

            Image inputImage = new Image();
            inputImage.encodeContent(photoData);
            Feature desiredFeature = new Feature();
            desiredFeature.setType("FACE_DETECTION");
            AnnotateImageRequest request = new AnnotateImageRequest();
            request.setImage(inputImage);
            Log.i("log-", "Content of inputImage" + inputImage);
            request.setFeatures(Arrays.asList(desiredFeature));
            BatchAnnotateImagesRequest batchRequest =
                    new BatchAnnotateImagesRequest();

            batchRequest.setRequests(Arrays.asList(request));
            BatchAnnotateImagesResponse batchResponse =
                    null;
            try {
                batchResponse = vision.images().annotate(batchRequest).execute();
                List<FaceAnnotation> faces = batchResponse.getResponses()
                        .get(0).getFaceAnnotations();

                // Count faces
                int numberOfFaces = faces.size();
                Log.i("log-", "number Of Faces" + numberOfFaces);

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

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

                // Display toast on UI thread
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                message, Toast.LENGTH_LONG).show();
                    }
                });
            }
            catch (IOException e) {
                e.printStackTrace();
            }


        }
        return;
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        Bitmap bitmap=(Bitmap)data.getExtras().get("data");
        // imageView2.setImageBitmap(bitmap);
    }
}

0 个答案:

没有答案