2016-09-28 44 views
0

所以我需要传递一个密钥(.p12)文件SERVICE_ACCT_KEYFILE,它直接存储在我的Android项目中的res文件夹下。我设置了setServiceAccountPrivateKeyFromP12File()就象这样:java.net.URL.getFile()null对象引用

private static GoogleCredential authorize() throws Exception { 
     return new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(SERVICE_ACCT_EMAIL) 
       .setServiceAccountPrivateKeyFromP12File(new File(
         PredictionSample.class.getResource("/" + SERVICE_ACCT_KEYFILE).getFile())) 
       .setServiceAccountScopes(Arrays.asList(PredictionScopes.PREDICTION, 
         StorageScopes.DEVSTORAGE_READ_ONLY)) 
       .build(); 
    } 

这个例子完美的作品在Java中,但我想实现它在Android和我有以下错误:

Attempt to invoke virtual method 'java.lang.String java.net.URL.getFile()' on a null object reference

即使做它失败:

String keyPath = "android.resource://" + MainActivity.PACKAGE_NAME + "/" + R.raw.pretense307cf970d6b1; 

     return new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(SERVICE_ACCT_EMAIL) 
       .setServiceAccountPrivateKeyFromP12File(new File(
         PredictionSample.class.getResource(keyPath).getFile())) 
       .setServiceAccountScopes(Arrays.asList(PredictionScopes.PREDICTION, 
         StorageScopes.DEVSTORAGE_READ_ONLY)) 
       .build(); 
    } 

我该如何解决?

谢谢。

+0

的Android资源和Java资源是不一样的东西。看到文档:https://developer.android.com/guide/topics/resources/providing-resources.html – njzk2

+0

@ njzk2我意识到这一点,我试图翻译。但没有成功。有任何想法吗? –

+0

您无法以“文件”的形式访问原始资源。但是,我链接的文档告诉你如何访问文件的内容。 – njzk2

回答

2

为了访问Android应用程序中的资源,它应该位于src/main/res/rawsrc/main/assets目录中。 Android不通过类加载器加载资源。

如果p12文件,比方说,keyfile.p12src/main/res/raw目录,可以访问这种方式:

InputStream rawIs = getResources().openRawResource(R.raw.keyfile); 

如果keyfile.p12src/main/assets目录:

InputStream assetIs = getAssets().open("keyfile.p12"); 

然后你需要将InputStream保存为File。您可以使用new File(getFilesDir(), "keyfile.p12")Context类中的任何可用方法在应用内部存储器中创建一个文件,该类将返回文件存储目录而不是getFilesDir()。我将文件复制代码作为练习:)

所有的getResources(),getAssets()getFilesDir()都是Context类的实例方法。

一些参考,并说明原料和资产之间的差别:https://developer.android.com/guide/topics/resources/providing-resources.html

相关问题