GoogleAccountCredential - [ERROR] имя не должно быть пустым: null - несмотря на разрешения

58
6

Я работал над приложением, которое отправляет небольшое количество данных обратно в Лист Google в определенные моменты, однако я не могу заставить его работать правильно:

public void SheetUpdate() {
GoogleAccountCredential mCredential;

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

mCredential = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName("oscarcookeabbott@gmail.com");

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", "tonyjones@abc.net.au");
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 поскольку он имеет имя unset (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)

'

спросил(а) 2016-12-19T12:35:00+03:00 3 года, 10 месяцев назад
1
Решение
108

Сегодня я получил ту же ошибку. Но, наконец, мне это удалось. Я описал здесь, что я сделал, так что это помогает любому.

Итак, причина в следующем: mCredential.getSelectedAccountName() == null

Итак, я назвал это так, если вызов API является успехом или нет:

 private void getResultsFromApi() {
if (! isGooglePlayServicesAvailable()) {
acquireGooglePlayServices();
} else if (mCredential.getSelectedAccountName() == null) {
chooseAccount();
} else if (! isDeviceOnline()) {
mOutputText.setText("No network connection available.");
} else {

Toast.makeText(this, "API CALL SUCCESS", Toast.LENGTH_SHORT).show();

}
}

И когда я получаю вышеупомянутое сообщение API CALL SUCCESS, тогда я вызываю readData или Append Data Function. И тогда данные читаются или добавляются успешно.

Итак, дважды проверьте ваши коды, инициализации, реализации, разрешения и т.д., mCredential.getSelectedAccountName() != null является успехом.

ответил(а) 2019-05-12T22:23:00+03:00 1 год, 5 месяцев назад
41

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

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


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

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

ответил(а) 2016-12-19T16:39:00+03:00 3 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема