2

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 アカウント ピッカーが複数のインスタンスを作成する必要があるのはなぜですか?

ありがとう、
グレッグ

4

3 に答える 3

4

singleInstance を使用する場合、そのタスクに他のアクティビティを含めることはできません。代わりに singleTask を使用してください。

http://developer.android.com/guide/topics/manifest/activity-element.html#lmodeに記載されているように 、数段落下にあります。

また、「singleTask」モードと「singleInstance」モードは、1 つの点でのみ互いに​​異なります。「singleTask」アクティビティでは、他のアクティビティをそのタスクの一部にすることができます。これは常にそのタスクのルートにありますが、他のアクティビティ (必然的に「標準」および「singleTop」アクティビティ) をそのタスクに起動できます。一方、「singleInstance」アクティビティでは、他のアクティビティをそのタスクの一部にすることはできません。タスク内の唯一のアクティビティです。別のアクティビティを開始すると、そのアクティビティは別のタスクに割り当てられます — FLAG_ACTIVITY_NEW_TASK がインテント内にあるかのように。

于 2014-12-28T21:47:35.130 に答える
1

質問の更新で説明したように、AndroidManifest.xml から singleInstance launchMode を削除すると、アカウント ピッカーが機能し始めました。このシングル インスタンス起動モードの動作がバグなのか、ドキュメントの不足なのかはわかりませんが、Android イシュー トラッカーに提出しました: issue 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 に答える