2

После документации для загрузки файла с устройства Android на Google Диск я написал тестовое приложение, которое успешно загружает файл, но моя попытка скопировать соответствующий код в большее приложение не загружает файл, поскольку его Google Выбор учетной записи всегда получать отменен:Почему аккаунт Picker в приложении Android отменяется?

  • onActivityResult() код результата равен 0 (т.е. RESULT_CANCELED)
  • onActivityResult() намерение аргумент имеет нулевое значение, и
  • LogCat (как показано ниже) показывает, что «Активность запускается как новая задача, поэтому отмена активности. "

04-22 02: 04: 25,098 D/alsa_ucm (162): snd_use_case_set(): uc_mgr 0x40e59388 идентификатор _verb значение HiFi Lowlatency
04-22 02: 04: 25,098 D/alsa_ucm (162): Установите регуляторы микшера для разрешения колонок 1
04-22 02: 04: 25.098: D/ACDB-LOADER (162): ACDB -> send_afe_cal
04-22 02: 04: 25.098: I/ActivityManager (526)): START u0 {act = com.google.android.gms.common.account.CHOOSE_ACCOUNT cmp = com.google.android.gms/.common.account.AccountPickerActivity (имеет дополнительные функции)} из pid 3484
04-22 02 : 04: 25.098: W/ActivityManager (526): активность запускается как новая задача, поэтому отмена результата операции.
04-22 02: 04: 25.108: D/alsa_ucm (162): установить элементы управления микшером для разрешения низкого уровня HiFi 1
04-22 02: 04: 25.108: D/ALSAModule (162): Возвращаемое значение устройства: hw: 0,14
04-22 02: 04: 25.118: D/ALSAModule (162): setHardwareParams: reqBuffSize 1024 канала 2 sampleRate 48000
04-22 02: 04: 25.118: D/ALSAModule (162): setHardwareParams: buffer_size 2048, period_size 1024, period_cnt 2
04-22 02: 04: 25.188: D/dalvikvm (526): GC_FOR_ALLOC освобожден 565K, 15% бесплатно 18562K/21684K, приостановлено 71 мс, всего 71 мс
04-22 02:04: 25.248: D/overlay (159): Unset pipe = VG0 dpy = 0; Unset pipe = VG1 dpy = 0; Unset pipe = RGB1 dpy = 0
04-22 02: 04: 25.248: W/InputMethodManagerService (526): окно уже сфокусировано, игнорируя усиление фокусировки: [email protected] атрибут = null, токен = [email protected]
04-22 02: 04: 27.991: D/dalvikvm (526): GC_FOR_ALLOC освобожден 422K, 15% бесплатно 18564K/21684K, приостановлено 65 мс, всего 66 мс
04- 22 02: 04: 28.011: I/ActivityManager (526): больше не требуется com.google.android.marvin.talkback (pid 5301): пустой # 17
04-22 02: 04: 28.241: D/overlay (159): Установить pipe = RGB1 dpy = 0; Set pipe = VG0 dpy = 0; Set pipe = VG1 dpy = 0;
04-22 02: 04: 28.672: D/overlay (159): Unset pipe = VG0 dpy = 0; Unset pipe = VG1 dpy = 0; Unset pipe = RGB1 dpy = 0;

Код, который запускает сборщик учетных записей Google, в обоих приложениях одинаковый, но сборщик отменяется только в более крупном приложении.

// Handle item selection 
case R.id.action_select_account: 
    mCredential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE); 
    Intent intent2 = mCredential.newChooseAccountIntent(); 
    showToast("intent extra: " + intent2.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)); // TODO: remove after test 
    startActivityForResult(intent2, REQUEST_ACCOUNT_PICKER); 
    return true; 
default: 
    return false; 

Тестовое приложение и больше приложений являются обе версии отладки, в том числе тех же банок (как показано ниже), и работает на том же устройстве (Nexus 4, ОС 4.2.2), но, как это было предложено в пяти минутное быстрое начало, каждое приложение имеет свой собственный идентификатор клиента, генерируемый Google APIs Console.

enter image description here

Результат этого отмена является то, что onActivityResult() работает, как только Picker аккаунта Google получает нарисован, задолго до того, выбран счет.

UPDATE:
После приблизительно равного количества проб и ошибок, то получается, что удаление следующих из AndroidManifest.xml исправили проблему.

android:launchMode="singleInstance" 

Мой первоначальный вопрос о том, почему теперь переходит к тому, почему сборщик учетных записей Google в Android должен создавать несколько экземпляров?

Спасибо,
Грег

ответ

1

Как описано в обновлении на вопрос, в ловильного счет начал работать, когда я удалил SingleInstance launchMode из AndroidManifest.xml. Я не знаю, является ли это поведение в режиме одиночного экземпляра ошибкой или отсутствием документации, но я отправил его в Android Issue Tracker: issue 54656

+0

Вы как-то запускали AccountPicker с singleInstance или удалили singleInstance из своего собственного действия, которое использовало код accountmanager? – gleenn

0

По какой-то причине у цели, возвращенной менеджером учетной записи, установлен одноточечный набор, который всегда заставляет ваш onActivityResult сбой сразу и возвращает 0 resultCode (Activity.RESULT_CANCELLED) или что угодно. Я должен был обнуление Намерения флагов, чтобы предотвратить это

// prevent running AccountPicker as SingleTop which fails and calls onActivityResult immediately otherwise 
intent.setFlags(0); 
startActivityForResult(intent, AccountManagerUtils.GOOGLE_AUTH_REQUEST_CODE); 
4

Если вы используете SingleInstance не допускать никаких других мероприятий, чтобы быть частью своей задачи. Вместо этого используйте singleTask.

Как указано на http://developer.android.com/guide/topics/manifest/activity-element.html#lmode несколько абзацев вниз.

Режимы «singleTask» и «SingleInstance» также отличаются друг от друга только в одном отношении: «Активность SingleTask» позволяет другим действиям быть частью его задачи. Это всегда лежит в основе его задачи, но в эту задачу могут быть включены другие действия (обязательно «стандартные» и «одиночные»). С другой стороны, деятельность «singleInstance» не позволяет другим действиям не участвовать в ее задаче. Это единственное занятие в задаче. Если он запускает другое действие, эта деятельность назначается другой задаче - как если бы FLAG_ACTIVITY_NEW_TASK был в намерении.

Смежные вопросы