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"/> 

ошибка я получаю указывает на mCredential как имеющие это имя не установлено (null), который будучи пойманным, когда mService.execute является называется. У меня есть (просто чтобы попытаться определить проблему), разрешив разрешения в меню «Настройки-Приложения», а также попробовав его на 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

Ваш execute() вызов проходит через GoogleAccountCredential объект, который вы создали, и что не удается внутренне.

Рассматривая код для Account.java, который с открытым исходным кодом, вы можете видеть, что переданное имя равно null. Вызывающий, GoogleAuthUtil, является закрытой частью библиотеки Play Services, но мы можем хорошо догадываться о том, что происходит. Он пытается получить учетную запись Google из настроек телефона и не сможет найти совпадение.

Как вы уже подозреваете, разрешения здесь являются фактором, и я думаю, что это причина вашей неудачи. При настройке на Android 6 и выше объявления разрешений в манифесте могут быть недостаточными, и в вашем случае это влияет на GET_ACCOUNTS. См. here.

Необходимо запросить разрешения во время выполнения (и четко обрабатывать случай, когда пользователь отказывается от него). См. here, как это сделать. Альтернативно, если у вас нет каких-либо релевантных зависимостей, вы можете снизить целевой уровень до 5.1 или ниже, и на данный момент, по крайней мере, он будет использовать более раннюю модель разрешения.

+0

Но, 1. Я на самом деле не запрашиваю какую-либо информацию с телефона, я просто даю ему статическое электронное письмо как «имя» и 2. Когда я пробую его на Jellybean, он возвращает такая же ошибка? –