2016-09-28 19 views
0

したがって、私のAndroidプロジェクトのresフォルダのすぐ下に格納されているファイルSERVICE_ACCT_KEYFILEを渡す必要があります。私はこのようsetServiceAccountPrivateKeyFromP12File()を設定しています:nullオブジェクト参照のjava.net.URL.getFile()

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

アンドロイドリソースおよびJavaリソースは同じものではありません。 doc:https://developer.android.com/guide/topics/resources/providing-resources.html – njzk2

+0

@ njzk2私はそれを理解して翻訳を試みました。しかし、成功はありません。何か案は? –

+0

あなたは 'File'として生のリソースにアクセスすることはできません。しかし、私がリンクしているドキュメントは、ファイルの内容にどのようにアクセスできるかを示しています。 – njzk2

答えて

2

Androidアプリケーションのリソースにアクセスするには、src/main/res/rawまたはsrc/main/assetsディレクトリにある必要があります。 Androidはクラスローダー経由でリソースを読み込みません。

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

は、その後、あなたが必要です:keyfile.p12src/main/assetsディレクトリにある場合

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

p12ファイルは、たとえば、keyfile.p12src/main/res/rawディレクトリにある場合

は、それがこのようにアクセスすることができますInputStreamFileに保存します。 new File(getFilesDir(), "keyfile.p12")またはgetFilesDir()の代わりにファイルストレージ用のディレクトリを返すContextクラスで使用可能な任意のメソッドを使用して、アプリケーションの内部ストレージ内にファイルを作成できます。ファイルコピーのコードを練習として残しておきます。

getResources()getAssets()およびgetFilesDir()はすべてContextクラスのインスタンスメソッドです。

いくつかの参照、および原資産の違いの説明:https://developer.android.com/guide/topics/resources/providing-resources.html

関連する問題