2

Android 기기에서 Google 드라이브로 파일을 업로드하는 데 대한 "Five minute quick start" 문서에 따라 파일을 성공적으로 업로드하는 테스트 애플리케이션을 작성했지만 관련 코드를 더 큰 애플리케이션에 복사하려는 시도는 파일을 업로드하지 않으므로 Google 계정 선택기는 항상 취소지고 :Android 애플리케이션의 계정 선택기가 취소되는 이유는 무엇입니까?

  • 하여 onActivityResult() 결과 코드 0 (즉, RESULT_CANCELED),
  • 하여 onActivityResult() 의도 인수가 null이며,
  • 로그 캣은 (아래 그림 참조)는 "활동이 새로운 과제로 시작하므로 취소 활동 결과. "

2월 4일부터 22일까지 : 04 : 25.098 : D/alsa_ucm (162) snd_use_case_set() uc_mgr 0x40e59388 식별자 _verb 값 고음질 Lowlatency
2월 4일부터 22일까지 : 04 : 25.098 : D/alsa_ucm (162) : 04 : 스피커 설정 믹서 컨트롤 1
2월 4일부터 22일까지 활성화 25.098 : D/ACDB 로더 (162) ACDB -> send_afe_cal
2월 4일에서 22일까지 : 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 (부가 기능 있음}) from pid 3484
04-22 02 : 04 : 25.098 : W/ActivityManager (526) : 활동이 다음과 같이 시작됩니다. 새로운 작업, 그래서 활동 결과를 취소. D/ALSAModule (162) : 반환 된 장치 값은 hw : 04-22 02 : 04 : 25.108 : D/alsa_ucm (162) : HiFi Lowlatency 사용에 대한 믹서 컨트롤 설정 1
04-22 02 : 04 : 25.108 : 0/14
04-22 02 : 04 : 25.118 : D/ALSAModule (162) : setHardwareParams : reqBuffSize 1024 채널 2 샘플 레이트 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/오버레이 (159) : 설정되지 않은 파이프 = VG0 dpy = 0; 설정되지 않은 파이프 = VG1 dpy = 0; 설정되지 않은 파이프 = RGB1 dpy = 0
04-22 02 : 04 : 25.248 : W/InputMethodManagerService (526) : 포커스가 이미 무시 된 창 : [email protected] 속성 NULL = 토큰 = [email protected]
2월 4일에서 22일까지 : 04 : 27.991 : D/dalvikvm (526)는 422K GC_FOR_ALLOC 총 무료 18564K/21684K, 65ms의 일시를 15 %, 해방 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/오버레이 (159) : 해제 된 파이프 = VG0 dpy = 0; 설정되지 않은 파이프 = VG1 dpy = 0; unset pipe = 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; 

테스트 애플리케이션 및 더 큰 애플리케이션 (아래 참조)와 동일한 병을 포함 모두 디버깅 버전이며, 동일한 장치 (넥서스 4, OS 4.2.2)에서 실행되지만 분 빠른 시작, 각 응용 프로그램은 Google APIs Console에 의해 생성 된 자체 클라이언트 ID를가집니다.

enter image description here

이 취소의 결과는 onActivityResult를()가 계정을 선택도 전에 즉시 Google 계정 선택기이 그려지기로 실행한다는 것입니다.

UPDATE : 시행 착오에 거의 동일한 시간 후에
, 그것을 제거의 AndroidManifest.xml에서 다음 문제를 해결하는 것이 밝혀졌다.

android:launchMode="singleInstance" 

Android의 Google 계정 선택기가 왜 여러 인스턴스를 만들어야하는 이유가 궁금한가요? 내가의 AndroidManifest.xml에서 singleInstance launchMode를 제거 할 때

감사합니다,
그렉 문제의 업데이트에 설명 된 바와 같이

답변

1

는 계정 선택기는 작업을 시작했다. 이 단일 인스턴스 실행 모드 동작이 버그인지 문서 부족인지는 모르겠지만 안드로이드 이슈 트래커에 제출했습니다 : issue 54656

+0

어쨌든 singleInstance를 사용하여 AccountPicker를 시작 했습니까? 아니면 accountManager 코드를 사용하여 자신의 활동에서 singleInstance를 제거 했습니까? – gleenn

0

어떤 이유로 든 계정 관리자가 반환 한 인 텐트는 singleTop 세트이며, 항상 onActivityResult가 실패하여 가 바로이되고 0 resultCode (Activity.RESULT_CANCELLED) 또는 무엇이든 반환합니다. 이 문제를 방지하기 위해 의도 플래그를 0으로 설정해야했습니다.

// prevent running AccountPicker as SingleTop which fails and calls onActivityResult immediately otherwise 
intent.setFlags(0); 
startActivityForResult(intent, AccountManagerUtils.GOOGLE_AUTH_REQUEST_CODE); 
4

singleInstance를 사용하면 다른 작업을 해당 작업의 일부로 할 수 없습니다. 대신에 singleTask를 사용하십시오.

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode 아래에 몇 단락이 나와 있습니다.

"singleTask"및 "singleInstance"모드도 한 가지 측면에서만 서로 다릅니다. "singleTask"활동은 다른 활동을 해당 작업의 일부로 허용합니다. 그것은 항상 그 업무의 근원이지만 다른 활동들 (필연적으로 "표준"및 "단일 탑"활동들)은 그 일에 착수 될 수 있습니다. 반면에 "singleInstance"액티비티는 다른 액티비티를 그 작업의 일부로 허용하지 않습니다. 그것은 작업의 유일한 활동입니다. 다른 활동을 시작하면 FLAG_ACTIVITY_NEW_TASK가 의도 한 것처럼 해당 활동이 다른 태스크에 지정됩니다.