我有一個Android應用程序,應該使用谷歌融合表。我使用的是Google服務帳戶,必須獲取我的xxxxxxxxxxxprivatekey.p12的路徑。Android的NetworkOnMainThreadException在谷歌Credential.refreshToken()
public class CredentialProvider {
...
private static String PRIVATE_KEY = "xxxxxxxxxxxprivatekey.p12";
...
public static GoogleCredential getCredential() throws IOException, GeneralSecurityException {
return getCredential(Arrays.asList(SCOPES), SERVICE_ACCOUNT_EMAIL, new File(PRIVATE_KEY), HTTP_TRANSPORT, JSON_FACTORY);
}
...
}
該代碼想從PRIVATE_KEY
路徑中創建一個新文件。我嘗試了各種路徑,但每次我收到FileNotFoundException
和open failed: ENOENT (No such file or directory)
。
我已閱讀關於資產文件夾的一些信息,但我不知道如何使用getCredential方法獲得該工作。
- 哪裏我已經把我的私人密鑰在我的Android項目
- 如何有看起來像和
- 我如何獲得「新的文件(PRIVATE_KEY)」的PRIVATE_KEY路徑工作?
感謝;)
編輯:
現在我重寫GoogleCredential.Builder
在您的鏈接創建自己的setServiceAccountPrivateKeyFromP12File(InputStream p12File)
喜歡它似乎很好地工作。但在getCredential()
中refreshToken()
被調用並崩潰在NetworkOnMainThreadException。 我讀過,我應該使用AsyncTask它。你能給我一個提示,,我必須把那個AsyncTask和什麼應該在doInBackground()
和onPostExecute()
或什麼方法裏面?
這是getCredential()
的代碼。它崩潰的refreshToken()
與NetworkOnMainThreadException:
public static GoogleCredential getCredential(List<String> SCOPE, String SERVICE_ACCOUNT_EMAIL,
InputStream inputStreamFromP12File, HttpTransport HTTP_TRANSPORT, JsonFactory JSON_FACTORY)
throws IOException, GeneralSecurityException {
// Build service account credential.
MyGoogleCredentialBuilder builder = new MyGoogleCredentialBuilder();
builder.setTransport(HTTP_TRANSPORT);
builder.setJsonFactory(JSON_FACTORY);
builder.setServiceAccountId(SERVICE_ACCOUNT_EMAIL);
builder.setServiceAccountScopes(SCOPE);
builder.setServiceAccountPrivateKeyFromP12File(inputStreamFromP12File);
GoogleCredential credential = builder.build();
credential.refreshToken();
return credential;
}
EDIT2: 最後,我解決了這樣的說法:
private static class RefreshTokenTask extends AsyncTask<GoogleCredential, Void, Void> {
@Override
protected Void doInBackground(GoogleCredential... params) {
try {
params[0].refreshToken();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
,並在我的getCredential方法:
new RefreshTokenTask().execute(credential);
您可以使自己的版本,這需要一個InputStream,你可以從資產獲得 - 看https://code.google.com/p/google-api-java-client/issues/細節?id = 857 –
謝謝,這看起來更好。但是我必須把這個方法放在哪裏呢?我無法查看或編輯'com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder'中的代碼。 – rillner
@ChrisStratton查看我的編輯。 – rillner