此代码是在Android上调用“credential.json”文件并获取“访问令牌”的代码 .

这个应用程序的服务器是python并通过http进行通信 . (用于处理app数据的服务器而不是用于访问令牌的服务器)

https://github.com/GoogleCloudPlatform/android-docs-samples/tree/master/speech/Speech

上面链接中的描述告诉您将身份验证委派给服务器 .

我想用python代码编写那部分 . 我该怎么办?

private class AccessTokenTask extends AsyncTask<Void, Void, AccessToken> {

@Override
protected AccessToken doInBackground(Void... voids) {

    final SharedPreferences prefs = mContext.getSharedPreferences(PREFS, Context.MODE_PRIVATE);
    String tokenValue = prefs.getString(PREF_ACCESS_TOKEN_VALUE, null);
    long expirationTime = prefs.getLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, -1);

    // Check if the current token is still valid for a while
    if (tokenValue != null && expirationTime > 0) {
        if (expirationTime > System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION_TOLERANCE) {
            return new AccessToken(tokenValue, new Date(expirationTime));
        }
    }

    final InputStream stream = mContext.getResources().openRawResource(R.raw.credential);
    try {
        final GoogleCredentials credentials = GoogleCredentials.fromStream(stream).createScoped(SCOPE);
        final AccessToken token = credentials.refreshAccessToken();
        prefs.edit()
                .putString(PREF_ACCESS_TOKEN_VALUE, token.getTokenValue())
                .putLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, token.getExpirationTime().getTime())
                .apply();
        return token;
    } catch (IOException e) {
        Log.e(TAG, "Failed to obtain access token.", e);
    }
    return null;
}

@Override
protected void onPostExecute(AccessToken accessToken) {
    mAccessTokenTask = null;
    final ManagedChannel channel = new OkHttpChannelProvider()
            .builderForAddress(GOOGLE_API_HOSTNAME, GOOGLE_API_PORT)
            .nameResolverFactory(new DnsNameResolverProvider())
            .intercept(new GoogleCredentialsInterceptor(new GoogleCredentials(accessToken)
                    .createScoped(SCOPE)))
            .build();
    mApi = SpeechGrpc.newStub(channel);

    // Schedule access token refresh before it expires
    if (mHandler != null) {
        mHandler.postDelayed(mFetchAccessTokenRunnable,
                Math.max(accessToken.getExpirationTime().getTime() - System.currentTimeMillis() - ACCESS_TOKEN_FETCH_MARGIN, ACCESS_TOKEN_EXPIRATION_TOLERANCE));
    }
}

}

此应用程序从原始目录中读取credential.json文件,并在我的应用程序中创建一个Access令牌以使用google cloud speech api .

但是,它在一个用户使用时效果很好,但在多个用户同时使用它时不起作用 .

例如,只有一个用户可用或全部不可用 .

服务帐户密钥的权限是项目所有者 .