1

我有一个安卓应用,应该使用谷歌融合表。我正在使用谷歌服务帐户,并且必须获取我的 xxxxxxxxxxxprivatekey.p12 的路径。

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路径中创建一个新文件。我尝试了各种路径,但每次我得到一个FileNotFoundExceptionand open failed: ENOENT (No such file or directory)

我已经阅读了一些关于 assets 文件夹的内容,但我不知道如何使用 getCredential 方法来完成这项工作。

  • 我必须将我的私钥放在我的android项目中
  • PRIVATE_KEY 路径的外观如何?
  • 我如何获得“新文件(PRIVATE_KEY)”的工作

谢谢 ;)


编辑:

现在我在你的链接GoogleCredential.Builder中创建我自己setServiceAccountPrivateKeyFromP12File(InputStream p12File)的,它似乎工作正常。但是 ingetCredential() 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);
4

1 回答 1

1

您无法像访问常规文件那样访问资产,因为这些文件与应用程序捆绑在一起。这就是为什么new File(PRIVATE_KEY)行不通的原因,并且没有任何路径可以让它发挥作用。

您可以做的是为该文件获取 InputStream :

AssetManager assetManager = context.getAssets();
InputStream input = assetManager.open(PRIVATE_KEY);

如果您需要以文件的形式访问它,您可以在首次启动应用程序时将其复制到应用程序的内部存储中。我不确定这是最好的解决方案(出于安全原因,您可能不想将私钥存储在设备的内部存储中),但它应该可以工作。然后您可以从context.getFilesDir ()文件夹中访问它。

InputStream fis = assetManager.open(PRIVATE_KEY);
FileOutputStream fos = openFileOutput(PRIVATE_KEY, Context.MODE_PRIVATE);
byte buf[] = new byte[1024];
int len;
while ((len = fis.read(buf)) > 0) {
  fos.write(buf, 0, len);
}
fis.close();
fos.close();
于 2014-05-07T16:44:26.700 回答