我正在尝试设计一个从我的谷歌云存储帐户下载适当声音文件的应用程序。该应用程序不访问用户帐户,而是我自己的帐户。
我的阅读使我相信最合适的模型是服务帐户 https://code.google.com/p/google-api-java-client/wiki/OAuth2#Service_Accounts
不幸的是,开发人员决定不提供 Android 示例。他们确实提供了一个简单的 Java 示例,它可以工作 http://samples.google-api-java-client.googlecode.com/hg/storage-serviceaccount-cmdline-sample/instructions.html?r=default
我试图将其用于 Android 并遇到了问题。
GoogleCredential credential =
new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY).setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(STORAGE_SCOPE)
.setServiceAccountPrivateKeyFromP12File(new File("key.p12")).build();
在 Google 的示例中,他们传递了 key.p12 文件,但是在 Android 上,当我将文件放在 res/raw 文件夹中时,我访问它的唯一方法似乎是作为输入流。我找不到将文件传递给 JSON 的优雅方法。
这一切都让我相信我一定做错了什么。我应该使用 key.p12 我应该使用“服务帐户模型”吗?有没有例子/
谢谢瑞恩
更新我设法实现了让它工作的目标,但我的解决方案对我来说感觉很笨拙,我确信这不是预期的方式
我所做的是将 key.p12 添加为作为输入流打开的原始/资源。然后我使用示例中的库将其转换为私钥。
http://www.flexiprovider.de/examples/ExampleSMIMEsign.html
我的代码看起来像这样
Security.addProvider(new de.flexiprovider.core.FlexiCoreProvider());
// Next, we have to read the private PKCS #12 file, since the the
// private key used for signing is contained in this file:
DERDecoder dec = new DERDecoder(getResources().openRawResource(
R.raw.key));
PFX pfx = new PFX();
try {
pfx.decode(dec);
SafeBag safeBag = pfx.getAuthSafe().getSafeContents(0)
.getSafeBag(0);
PKCS8ShroudedKeyBag kBag = (PKCS8ShroudedKeyBag) safeBag
.getBagValue();
char[] password = "my password from google api".toCharArray();
privKey = kBag.getPrivateKey(password);
new AsyncLoadStorage(this).execute();
} catch (ASN1Exception e) {
但整个事情都很丑陋,我想要一个更清洁的解决方案