Android デバイスから Google ドライブにファイルをアップロードするための「5 分間のクイック スタート」ドキュメントに従って、ファイルを正常にアップロードするテスト アプリケーションを作成しましたが、関連するコードをより大きなアプリケーションにコピーしようとしてもファイルがアップロードされません。ファイルの Google アカウント ピッカーが常にキャンセルされるためです。
- onActivityResult() の結果コードが 0 (つまり、 RESULT_CANCELED ) である、
- onActivityResult() インテント引数が null であり、かつ
- 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 (エクストラがあります)} pid 3484
04-22 02:04:25.098 から: W/ActivityManager(526): アクティビティは次のように起動されます新しいタスクなので、アクティビティ結果をキャンセルします。
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 attribute=null 、トークン = 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 ): pipe=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) で実行されますが、5 分間のクイックスタートで提案されているように、各アプリケーションにはGoogle APIs Consoleによって生成された独自のクライアント ID 。
このキャンセルの結果、アカウントが選択されるかなり前に、Google アカウント ピッカーが描画されるとすぐに onActivityResult() が実行されます。
更新:
ほぼ同量の試行錯誤の後、AndroidManifest.xml から以下を削除すると問題が解決したことが判明しました。
android:launchMode="singleInstance"
Android の Google アカウント ピッカーが複数のインスタンスを作成する必要があるのはなぜですか?
ありがとう、
グレッグ