2016-12-19 11 views
0

私は、特定の時点で小さなデータをGoogleシートに送り返すアプリを開発していますが、正しく動作させるには:GoogleAccountCredential - [ERROR]名前は空であってはいけません:null - 権限があるにもかかわらず

public void SheetUpdate() { 
    GoogleAccountCredential mCredential; 

    Sheets mService; 
    final String[] SCOPES = { SheetsScopes.SPREADSHEETS }; 

    mCredential = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES)) 
      .setBackOff(new ExponentialBackOff()) 
      .setSelectedAccountName("[email protected]"); 

    Log.e("DEBUG", "SheetUpdate: " + mCredential.getSelectedAccountName()); 

    HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

    mService = new Sheets.Builder(transport, jsonFactory, mCredential) 
      .setApplicationName("Listeau") 
      .build(); 

    /* 
    String range = "[Sheet Name]![Start]:[End]"; 

    mService.spreadsheets().values().update(enumId, range, valueRange) 
      .setValueInputOption("RAW") 
      .execute(); 
    */ 

    ValueRange values = new ValueRange(); 
    values.set("EMAIL", "[email protected]"); 
    values.set("AUTH", "[INSERT DATE]"); 
    values.set("SUB", "[INSERT DATE + MONTH]"); 

    try { 
     mService.spreadsheets().values().append("1meAAvjdPmghn6wl_IKc-_NJx_M85I_yqsn4Nwm_j_X0", "Users", values) 
       .setValueInputOption("RAW") 
       .execute(); 
    } catch(IOException e) { 
     Log.e("BUG", "SheetUpdate: IOException"); 
    } 
} 

そして、私のマニフェストに私が持っている:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.READ_CONTACTS"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 

エラーを私はそれがmService.executeがあるときにキャッチされている名称未設定(null)、だものとしてmCredentialにポイントを受け取りますと呼ばれる。 私は手動で(問題を突き止めるだけで正確に)、Settings-Appsメニューの権限を許可し、Jellybeanで試してみましたが、すべて同じ問題を主張しています。

[EDIT]ここで完全なエラー出力があります: `

E/AndroidRuntime: FATAL EXCEPTION: main 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pybuspr.listeriafoodusa/com.pybuspr.listeau.Master}: java.lang.IllegalArgumentException: the name must not be empty: null 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
         at android.app.ActivityThread.access$600(ActivityThread.java:130) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
         at android.os.Handler.dispatchMessage(Handler.java:99) 
         at android.os.Looper.loop(Looper.java:137) 
         at android.app.ActivityThread.main(ActivityThread.java:4745) 
         at java.lang.reflect.Method.invokeNative(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:511) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
         at dalvik.system.NativeStart.main(Native Method) 
        Caused by: java.lang.IllegalArgumentException: the name must not be empty: null 
         at android.accounts.Account.<init>(Account.java:48) 
         at com.google.android.gms.auth.zze.getToken(Unknown Source) 
         at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
         at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:269) 
         at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:294) 
         at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:868) 
         at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
         at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
         at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
         at com.pybuspr.listeau.Master.SheetUpdate(Master.java:167) 
         at com.pybuspr.listeau.Master.onCreate(Master.java:48) 
         at android.app.Activity.performCreate(Activity.java:5008) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  
         at android.app.ActivityThread.access$600(ActivityThread.java:130)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  
         at android.os.Handler.dispatchMessage(Handler.java:99)  
         at android.os.Looper.loop(Looper.java:137)  
         at android.app.ActivityThread.main(ActivityThread.java:4745)  
         at java.lang.reflect.Method.invokeNative(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:511)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  
         at dalvik.system.NativeStart.main(Native Method) 

`

+0

さらに詳しい情報が役に立ちます - ログ出力は何ですか? –

+0

出力を持つ投稿を編集しました –

答えて

0

あなた​​コールは、作成したGoogleAccountCredentialオブジェクトを介して行く、それが内部的に失敗しています。

オープンソースのAccount.javaのコードを見ると、渡される名前がnullであることがわかります。呼び出し元のGoogleAuthUtilは、Play Servicesライブラリのクローズドソース部分ですが、何が起こっているのかをよく知ることができます。それは電話の設定からGoogleアカウントを取得しようとすると一致するものを見つけることができません。

あなたがすでに疑っているように、アクセス許可はここの要素です。これがあなたの失敗の原因だと思います。 Android 6以上をターゲットとする場合、マニフェストの権限を宣言するだけでは不十分な場合があり、その場合はGET_ACCOUNTSがその影響を受けます。 hereを参照してください。

実行時にアクセス許可を要求する必要があります(ユーザーが拒否したケースをきれいに処理する必要があります)。その方法については、hereを参照してください。あるいは、関連する依存関係がない場合は、ターゲットレベルを5.1以下に下げることができます。少なくとも、現在は古い許可モデルを使用します。

+0

しかし、私は実際に電話からの情報を要求していません。私はちょうどそれに 'name'という名前の静的なメールを与えています と2。とにかく同じエラー? –

関連する問題