2

按照将文件从 Android 设备上传到 Google Drive 的“五分钟快速入门”文档,我编写了一个成功上传文件的测试应用程序,但我尝试将相关代码复制到更大的应用程序并没有上传文件,因为它的 Google Account Picker 总是被取消:

  • onActivityResult() 结果代码为 0(即 RESULT_CANCELED),
  • onActivityResult() 意图参数为空,并且
  • logcat(如下所示)显示“活动正在作为新任务启动,因此取消活动结果。”

04-22 02:04:25.098: D/alsa_ucm(162): snd_use_case_set(): uc_mgr 0x40e59388 identifier _verb value 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 (has extras)} from pid 3484
04-22 02:04:25.098: W/ActivityManager(526): Activity 启动为一个新任务,因此取消活动结果。
04-22 02:04:25.108: D/alsa_ucm(162): 设置 HiFi Lowlatency enable 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;取消设置 pipe=RGB1 dpy=0
04-22 02:04:25.248: W/InputMethodManagerService(526): 窗口已经聚焦,忽略焦点增益:com.android.internal.view.IInputMethodClient$Stub$Proxy@41ebd7e0 属性=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): empty #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): Unset pipe=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;

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

在此处输入图像描述

取消的结果是 onActivityResult() 在 Google Account Picker 被绘制后立即运行,远在选择帐户之前。

更新:
经过大致等量的试验和错误后,事实证明,从 AndroidManifest.xml 中删除以下内容可以解决问题。

android:launchMode="singleInstance"

我最初的问题是为什么现在转向为什么 Android 中的 Google Account Picker 需要创建多个实例?

谢谢,
格雷格

4

3 回答 3

4

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

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

“singleTask”和“singleInstance”模式也仅在一个方面彼此不同:“singleTask”活动允许其他活动成为其任务的一部分。它始终位于其任务的根部,但其他活动(必须是“标准”和“singleTop”活动)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动被分配给不同的任务——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。

于 2014-12-28T21:47:35.130 回答
1

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

于 2013-04-23T18:51:32.843 回答
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);
于 2014-11-19T12:32:54.557 回答