按照将文件从 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 需要创建多个实例?
谢谢,
格雷格