GOOGLE_APPLICATION_CREDENTIALS를 내 JSON 파일로 지정하는 방법은 무엇입니까?

레자

내가 사용하고자하는 구글에게 텍스트 음성을 내 안드로이드 응용 프로그램에서.

문서 에 따르면 다음 단계를 모두 거쳤습니다.

  1. Cloud Console에서 서비스 계정 키 만들기 페이지로 이동합니다.
  2. 서비스 계정 목록에서 새 서비스 계정을 선택합니다.
  3. 서비스 계정 이름 필드에 이름을 입력합니다.
  4. 역할 목록에서 프로젝트> 소유자를 선택하십시오.
  5. 생성을 클릭합니다. 컴퓨터에 다운로드 한 키가 포함 된 JSON 파일입니다.

Google 코드사용하여 다운로드 한 JSON 파일 인 자격 증명을 전달하고 있습니다.

public void main(String... args) throws Exception {
    // You can specify a credential file by providing a path to GoogleCredentials.
    // Otherwise credentials are read from the GOOGLE_APPLICATION_CREDENTIALS environment variable.
    InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
    GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(String.valueOf(stream)))
            .createScoped(Lists.newArrayList(Collections.singleton("https://www.googleapis.com/auth/cloud-platform")));
    Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

    System.out.println("Buckets:");
    Page<Bucket> buckets = storage.list();
    for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
    }
}

어쨌든 Gradle을 정리하고 Android Studio를 다시 시작했지만 여전히이 로그가 표시됩니다.

java.io.IOException : 애플리케이션 기본 자격 증명을 사용할 수 없습니다. Google Compute Engine에서 실행중인 경우 사용할 수 있습니다. 그렇지 않으면 사용자 인증 정보를 정의하는 파일을 가리키는 환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 정의해야합니다. 자세한 내용은 https://developers.google.com/accounts/docs/application-default-credentials참조 하세요 .

내가 도대체 ​​뭘 잘못하고있는 겁니까?

최신 정보

버튼을 클릭 할 때만이 로그 메시지가 표시된다는 것을 깨달았습니다. 버튼을 클릭하면 메소드 hello()가 실행됩니다. 전체 코드보기 :

package ch.yourclick.kitt;

import android.os.Build;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
import com.google.api.client.util.Lists;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.gax.paging.Page;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.texttospeech.v1.AudioConfig;
import com.google.cloud.texttospeech.v1.AudioEncoding;
import com.google.cloud.texttospeech.v1.SsmlVoiceGender;
import com.google.cloud.texttospeech.v1.SynthesisInput;
import com.google.cloud.texttospeech.v1.SynthesizeSpeechResponse;
import com.google.cloud.texttospeech.v1.TextToSpeechClient;
import com.google.cloud.texttospeech.v1.TextToSpeechSettings;
import com.google.cloud.texttospeech.v1.VoiceSelectionParams;
import com.google.protobuf.ByteString;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.ViewPager;
import androidx.appcompat.app.AppCompatActivity;
import android.os.StrictMode;
import android.view.View;

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;

import ch.yourclick.kitt.ui.main.SectionsPagerAdapter;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        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 main(String... args) throws Exception {
        // You can specify a credential file by providing a path to GoogleCredentials.
        // Otherwise credentials are read from the GOOGLE_APPLICATION_CREDENTIALS environment variable.
        InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
        GoogleCredentials credentials = GoogleCredentials.fromStream(stream)
                .createScoped(Lists.newArrayList(Collections.singleton("https://www.googleapis.com/auth/cloud-platform")));
        Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

        System.out.println("Buckets:");
        Page<Bucket> buckets = storage.list();
        for (Bucket bucket : buckets.iterateAll()) {
            System.out.println(bucket.toString());
        }
    }



    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onClick(View view) {
        int SDK_INT = android.os.Build.VERSION.SDK_INT;
        if (SDK_INT > 8)
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);

            try {
                hello();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    /** Demonstrates using the Text-to-Speech API. */
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void hello() throws Exception {
        InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
        GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
        TextToSpeechSettings textToSpeechSettings =
                TextToSpeechSettings.newBuilder()
                        .setCredentialsProvider(
                                FixedCredentialsProvider.create(credentials)
                        ).build()
                ;


        // Instantiates a client
        try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create(textToSpeechSettings)) {
            // Set the text input to be synthesized
            SynthesisInput input = SynthesisInput.newBuilder().setText("Hello, World!").build();

            // Build the voice request, select the language code ("en-US") and the ssml voice gender
            // ("neutral")
            VoiceSelectionParams voice =
                    VoiceSelectionParams.newBuilder()
                            .setLanguageCode("en-US")
                            .setSsmlGender(SsmlVoiceGender.NEUTRAL)
                            .build();

            // Select the type of audio file you want returned
            AudioConfig audioConfig =
                    AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

            // Perform the text-to-speech request on the text input with the selected voice parameters and
            // audio file type
            SynthesizeSpeechResponse response =
                    textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

            // Get the audio contents from the response
            ByteString audioContents = response.getAudioContent();

            // Write the response to the output file.
            try (OutputStream out = new FileOutputStream("output.mp3")) {
                out.write(audioContents.toByteArray());
                System.out.println("Audio content written to file \"output.mp3\"");
            }
        }
    }

}

의존성

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation group: 'io.grpc', name: 'grpc-okhttp', version: '1.0.1'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'com.google.cloud:google-cloud-storage:1.113.3'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.cloud:libraries-bom:4.3.0'
    implementation 'com.google.cloud:google-cloud-texttospeech:1.2.1'
    implementation 'com.google.android.gms:play-services:12.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
jccampanero

아마도 GoogleCredentials클래스는 제공되는 방식으로 인해 유효한 자격 증명 JSON 파일을 찾을 수 없습니다.

대신 :

InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(String.valueOf(stream)))
            .createScoped(Lists.newArrayList(Collections.singleton("https://www.googleapis.com/auth/cloud-platform")));

시험:

InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
GoogleCredentials credentials = GoogleCredentials.fromStream(stream)
            .createScoped(Lists.newArrayList(Collections.singleton("https://www.googleapis.com/auth/cloud-platform")));

getResources().openRawResource이미 stream필요한 정보 를 제공 하며 stream이를 사용하여 GoogleCredentials다음 을 생성 할 수 있습니다 .

GoogleCredentials.fromStream(stream)

업데이트와 관련하여 TextToSpeechClient명시적인 자격 증명을 제공하지 않고을 만드는 것으로 보이며 결과적으로 라이브러리는 환경에서이를 찾고 있습니다.

TechToSpeechClientjavadocs 에서 볼 수 있듯이 클라이언트에 자격 증명을 제공 할 수 있습니다.

대신 :

TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()

다음과 유사한 것으로 클라이언트를 초기화하십시오 (적절하다고 생각하는대로 수정하십시오).

import com.google.api.gax.core.FixedCredentialsProvider;

// In your method...

InputStream stream = getResources().openRawResource(R.raw.credential); // R.raw.credential is credential.json
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
TextToSpeechSettings textToSpeechSettings =
  TextToSpeechSettings.newBuilder()
    .setCredentialsProvider(
      FixedCredentialsProvider.create(credentials)
    ).build()
;

TextToSpeechClient textToSpeechClient =
  TextToSpeechClient.create(textToSpeechSettings);

// The rest of your code

서비스 계정 사용자 인증 정보가 요청 된 API에 액세스 할 수있는 올바른 권한을 부여하는지 확인하세요.

실제로 질문에서 깨달았 듯이 프로젝트 소유자 역할을 서비스 계정에 부여하면 이미 이러한 권한이있는 것입니다. 어쨌든 프로젝트 소유자 역할은 프로젝트의 모든 리소스에 대한 모든 권한을 부여합니다. 서비스 계정의 경우 항상 더 제한적인 것이 좋습니다. 이상적으로는 생성 된 작업을 수행하는 데 필요한 권한 만 부여되어야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Chopper를 사용하여 파일을 보내는 방법은 무엇입니까?

분류에서Dev

splunk forwarder docker 이미지를 사용하여 로컬 파일을 보내는 방법은 무엇입니까?

분류에서Dev

파이썬 내장 클래스 (예 : int)를 JSON으로 직렬화하는 방법은 무엇입니까?

분류에서Dev

스타일 구성 요소를 하나의 파일로 내보내는 방법은 무엇입니까?

분류에서Dev

모든 Sapper 경로를 정적 파일로 내보내는 방법은 무엇입니까?

분류에서Dev

반응에서 파일 경로를 사용하여 파일 내용을 읽는 방법은 무엇입니까?

분류에서Dev

하이브 쿼리 결과를 단일 로컬 파일로 내보내는 방법은 무엇입니까?

분류에서Dev

Intake로 JSON 파일을 여는 방법은 무엇입니까?

분류에서Dev

SSIS를 사용하여 SQL 결과를 여러 CSV 파일로 내보내는 방법은 무엇입니까?

분류에서Dev

파일에서 텍스트를 읽고 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

Android에서 JSON으로 파일을 보내는 방법은 무엇입니까?

분류에서Dev

Android에서 JSON으로 파일을 보내는 방법은 무엇입니까?

분류에서Dev

WebSQL 데이터베이스를 .sql 파일로 내보내는 방법은 무엇입니까? (mysqldump와 같은)

분류에서Dev

파일 내에서 선언 된 변수를 다른 파일로 호출하는 방법은 무엇입니까?

분류에서Dev

SQLite에서 파일 또는 execl로 BLOB 이미지 (PNG)를 내보내는 방법은 무엇입니까?

분류에서Dev

파일을 업로드하는 동안 데이터를 서버로 보내는 방법은 무엇입니까?

분류에서Dev

내보기를 내 TableViewheader로 설정하는 방법은 무엇입니까?

분류에서Dev

ControlsFx SpreadsheetView를 내 FXML 파일로 가져 오는 방법은 무엇입니까?

분류에서Dev

두 번째 파일의 정보를 기반으로 파일 내 행의 일부를 유지하는 방법은 무엇입니까?

분류에서Dev

마지막으로 수정 된 날짜를 기준으로 디렉토리의 텍스트 파일 내용을 에코하는 방법은 무엇입니까?

분류에서Dev

serde_json-내 구조체를 /에서 json으로 변환하는 방법은 무엇입니까?

분류에서Dev

IC 파일의 데이터를 내보내는 방법은 무엇입니까?

분류에서Dev

내 테마를 파괴하지 않고 ListViewItem을 진정으로 숨기는 방법은 무엇입니까?

분류에서Dev

Laravel에서 HTML 페이지를 이미지 파일로 내보내는 방법은 무엇입니까?

분류에서Dev

디렉토리의 여러 파일에 대한 통계를 확인하고 클라이언트에 json으로 보내는 방법은 무엇입니까?

분류에서Dev

정보를 파일로 보내는 방법은 무엇입니까?

분류에서Dev

헤더 내용 유형 json 데이터를 PHP의 csv 파일에 쓰는 방법은 무엇입니까?

분류에서Dev

Google Apps Script : 내 페이지로 돌아 가기를 설정하는 방법은 무엇입니까?

분류에서Dev

json 파일의 콘텐츠를 프런트 엔드로 보내는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Chopper를 사용하여 파일을 보내는 방법은 무엇입니까?

  2. 2

    splunk forwarder docker 이미지를 사용하여 로컬 파일을 보내는 방법은 무엇입니까?

  3. 3

    파이썬 내장 클래스 (예 : int)를 JSON으로 직렬화하는 방법은 무엇입니까?

  4. 4

    스타일 구성 요소를 하나의 파일로 내보내는 방법은 무엇입니까?

  5. 5

    모든 Sapper 경로를 정적 파일로 내보내는 방법은 무엇입니까?

  6. 6

    반응에서 파일 경로를 사용하여 파일 내용을 읽는 방법은 무엇입니까?

  7. 7

    하이브 쿼리 결과를 단일 로컬 파일로 내보내는 방법은 무엇입니까?

  8. 8

    Intake로 JSON 파일을 여는 방법은 무엇입니까?

  9. 9

    SSIS를 사용하여 SQL 결과를 여러 CSV 파일로 내보내는 방법은 무엇입니까?

  10. 10

    파일에서 텍스트를 읽고 내림차순으로 정렬하는 방법은 무엇입니까?

  11. 11

    Android에서 JSON으로 파일을 보내는 방법은 무엇입니까?

  12. 12

    Android에서 JSON으로 파일을 보내는 방법은 무엇입니까?

  13. 13

    WebSQL 데이터베이스를 .sql 파일로 내보내는 방법은 무엇입니까? (mysqldump와 같은)

  14. 14

    파일 내에서 선언 된 변수를 다른 파일로 호출하는 방법은 무엇입니까?

  15. 15

    SQLite에서 파일 또는 execl로 BLOB 이미지 (PNG)를 내보내는 방법은 무엇입니까?

  16. 16

    파일을 업로드하는 동안 데이터를 서버로 보내는 방법은 무엇입니까?

  17. 17

    내보기를 내 TableViewheader로 설정하는 방법은 무엇입니까?

  18. 18

    ControlsFx SpreadsheetView를 내 FXML 파일로 가져 오는 방법은 무엇입니까?

  19. 19

    두 번째 파일의 정보를 기반으로 파일 내 행의 일부를 유지하는 방법은 무엇입니까?

  20. 20

    마지막으로 수정 된 날짜를 기준으로 디렉토리의 텍스트 파일 내용을 에코하는 방법은 무엇입니까?

  21. 21

    serde_json-내 구조체를 /에서 json으로 변환하는 방법은 무엇입니까?

  22. 22

    IC 파일의 데이터를 내보내는 방법은 무엇입니까?

  23. 23

    내 테마를 파괴하지 않고 ListViewItem을 진정으로 숨기는 방법은 무엇입니까?

  24. 24

    Laravel에서 HTML 페이지를 이미지 파일로 내보내는 방법은 무엇입니까?

  25. 25

    디렉토리의 여러 파일에 대한 통계를 확인하고 클라이언트에 json으로 보내는 방법은 무엇입니까?

  26. 26

    정보를 파일로 보내는 방법은 무엇입니까?

  27. 27

    헤더 내용 유형 json 데이터를 PHP의 csv 파일에 쓰는 방법은 무엇입니까?

  28. 28

    Google Apps Script : 내 페이지로 돌아 가기를 설정하는 방법은 무엇입니까?

  29. 29

    json 파일의 콘텐츠를 프런트 엔드로 보내는 방법은 무엇입니까?

뜨겁다태그

보관