2016-09-28 43 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

相關問題