为什么Android应用程序中的帐户选择器被取消?

时间:2013-04-22 07:20:57

标签: android android-manifest google-drive-api launchmode accountpicker

按照"Five minute quick start"文档将文件从Android设备上传到Google云端硬盘后,我编写了一个成功上传文件的测试应用程序,但我尝试将相关代码复制到更大的应用程序时没有上传文件,因为其Google帐号选择器总是被取消:

  • onActivityResult()结果代码为0(即 RESULT_CANCELED),
  • onActivityResult()intent参数为null,
  • logcat(如下所示)显示“Activity正在作为新任务启动,所以 取消活动结果。“
  

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 Lowlatency启用设置混音器控制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,暂停71ms,总计71ms
  04-22 02:04:25.248:D / overlay(159):未设置管道= VG0 dpy = 0;未设置管道= VG1 dpy = 0;未设置管道= RGB1 dpy = 0
  04-22 02:04:25.248:W / InputMethodManagerService(526):窗口已经聚焦,忽略焦点增益:com.android.internal.view.IInputMethodClient$Stub$Proxy@41ebd7e0 attribute = null,token = android.os。 BinderProxy @ 42018140
  04-22 02:04:27.991:D / dalvikvm(526):GC_FOR_ALLOC释放422K,15%免费18564K / 21684K,暂停65ms,总计66ms
  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):设置管道= RGB1 dpy = 0;设管= VG0 dpy = 0;设置管道= VG1 dpy = 0;
  04-22 02:04:28.672:D / overlay(159):未设置管道= VG0 dpy = 0;未设置管道= VG1 dpy = 0;取消设置管道= 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;

测试应用程序和更大的应用程序都是调试版本,包括相同的jar(如下所示),并在同一设备(Nexus 4,OS 4.2.2)上运行,但是,正如五分钟快速入门中所建议的那样应用程序有自己的Google APIs Console生成的客户端ID。

enter image description here

此取消的结果是onActivityResult()会在选择帐户之前立即绘制Google帐户选择器。

更新
经过大约相等数量的反复试验后,发现从AndroidManifest.xml中删除以下内容解决了问题。

android:launchMode="singleInstance"

我最初的问题是为什么现在转向为什么Android中的Google帐户选择器需要创建多个实例?

谢谢,
格雷格

3 个答案:

答案 0 :(得分:4)

如果您使用singleInstance,则不允许其他任何活动成为其任务的一部分。请改用singleTask。

正如http://developer.android.com/guide/topics/manifest/activity-element.html#lmode所述 几段落下。

  

“singleTask”和“singleInstance”模式在一个方面也各不相同:“singleTask”活动允许其他活动成为其任务的一部分。它始终是其任务的根源,但其他活动(必然是“标准”和“单一活动”)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给另一个任务 - 就像FLAG_ACTIVITY_NEW_TASK在意图中一样。

答案 1 :(得分:1)

如问题更新中所述,当我从AndroidManifest.xml中删除singleInstance launchMode时,帐户选择器开始工作。我不知道这个单实例启动模式行为是错误还是缺少文档,但我将其提交给Android问题跟踪器:issue 54656

答案 2 :(得分:0)

由于某种原因,帐户管理器返回的意图具​​有singleTop设置,这会导致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);