Как установить GOOGLE_APPLICATION_CREDENTIALS в Android studio - PullRequest
0 голосов
/ 02 августа 2020

Итак, я пытаюсь заставить свое мобильное приложение идентифицировать различные разделы в изображении текста, абзацев, предложений и т. Д., И я пытаюсь использовать код, найденный в https://cloud.google.com/vision/docs/ocr#vision_text_detection - java , но следующая строка всегда терпит неудачу.

try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) 

Я получаю эту ошибку: java .io.IOException: учетные данные приложения по умолчанию недоступны. Они доступны, если запущены в Google Compute Engine. В противном случае необходимо определить переменную среды GOOGLE_APPLICATION_CREDENTIALS, указывающую на файл, определяющий учетные данные. См. https://developers.google.com/accounts/docs/application-default-credentials для получения дополнительной информации.

Я выполнил шаги, описанные здесь https://docs.kony.com/konylibrary/visualizer/visualizer_user_guide/Content/SUG_Android.htm в разделе «Установка переменной Android SDK Home Environment», но это не помогло разница.

Любая помощь приветствуется.

Основная деятельность

package com.thesis.fixmyphysics;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.Block;
import com.google.cloud.vision.v1.EntityAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.cloud.vision.v1.Page;
import com.google.cloud.vision.v1.Paragraph;
import com.google.cloud.vision.v1.Symbol;
import com.google.cloud.vision.v1.TextAnnotation;
import com.google.cloud.vision.v1.Word;
import com.google.protobuf.ByteString;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.provider.MediaStore;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import androidx.core.content.FileProvider;

import static android.os.Environment.getExternalStoragePublicDirectory;

public class MainActivity extends AppCompatActivity {

    Button picture_btn;
    ImageView display;
    String pathToFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picture_btn = findViewById(R.id.capture_image);
        if (Build.VERSION.SDK_INT >=23){
            requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);
        }
        picture_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchPictureTakerAction();
            }
        });
        display = findViewById(R.id.imageView4);

        Button temp = findViewById(R.id.temp_btn);
        temp.setOnClickListener(new View.OnClickListener(){
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onClick(View v){
                try {
                    detectDocumentText(pathToFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Log.d("Message", "Here5");
            }
        });

    }

    //Camera
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK) {
            Bitmap imageBitmap = BitmapFactory.decodeFile(pathToFile);
            display.setImageBitmap(imageBitmap);
        }
    }
    private void dispatchPictureTakerAction(){
        Intent takePic = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePic.resolveActivity(getPackageManager()) !=null){
            File photoFile = null;
            photoFile = createImageFile();

            if (photoFile != null){
                pathToFile = photoFile.getAbsolutePath();
                Uri photoURI = FileProvider.getUriForFile(MainActivity.this, "com.fixmyphysics.fileprovider", photoFile);
                Log.d("Test", "Worked");
                takePic.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePic, 1);
            }
        }
    }
    private File createImageFile() {
        String name = new SimpleDateFormat("yyyyMMdd__HHmmss").format(new Date());
        File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File image = null;
        try {
            image = File.createTempFile(name,".jpg", storageDir);
        } catch (IOException e){
            Log.d("mylog", "Excep : " + e.toString());
        }
        return image;
    }


    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public static void detectDocumentText(String filePath) throws IOException {
        List<AnnotateImageRequest> requests = new ArrayList<>();

        ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));

        Image img = Image.newBuilder().setContent(imgBytes).build();
        Feature feat = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build();
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
        requests.add(request);
        Log.d("Message", "Here1");

        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests. After completing all of your requests, call
        // the "close" method on the client to safely clean up any remaining background resources.
        try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
                 Log.d("Message", "Here 2");
                 BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
                 List<AnnotateImageResponse> responses = response.getResponsesList();
                 client.close();
                 Log.d("Message", "Here 3");
                 for (AnnotateImageResponse res : responses) {
                 if (res.hasError()) {
                 //System.out.format("Error: %s%n", res.getError().getMessage());
                 Log.d("Message", "Error 1");
                 return;
                 }
                 Log.d("Message", "Here 4");
                 // For full list of available annotations, see http://g.co/cloud/vision/docs
                 TextAnnotation annotation = res.getFullTextAnnotation();
                 for (Page page : annotation.getPagesList()) {
                 String pageText = "";
                 for (Block block : page.getBlocksList()) {
                 String blockText = "";
                 for (Paragraph para : block.getParagraphsList()) {
                 String paraText = "";
                 for (Word word : para.getWordsList()) {
                 String wordText = "";
                 for (Symbol symbol : word.getSymbolsList()) {
                 wordText = wordText + symbol.getText();
                 System.out.format(
                 "Symbol text: %s (confidence: %f)%n",
                 symbol.getText(), symbol.getConfidence());
                 }
                 System.out.format(
                 "Word text: %s (confidence: %f)%n%n", wordText, word.getConfidence());
                 paraText = String.format("%s %s", paraText, wordText);
                 }
                 // Output Example using Paragraph:
                 System.out.println("%nParagraph: %n" + paraText);
                 System.out.format("Paragraph Confidence: %f%n", para.getConfidence());
                 blockText = blockText + paraText;
                 }
                 pageText = pageText + blockText;
                 }
                 }
                 System.out.println("%nComplete annotation:");
                 System.out.println(annotation.getText());
                 }
        }catch(Exception e){
            Log.d("Message", "Failed Here");
        }
    }
}
...