2011-12-22 4 views
1

내 코드는 작고 큰 장치 (Motorola Xoom, Samsung Galaxy Player 4.0, Kyocera Digno)에서 예상대로 작동하지만, 삼성 갤럭시 탭 7.0의 경우 ACTION_IMAGE_CAPTURE 의도를 시작한 후 단지 onActivityResult() 호출해야합니다 - 그리고 사진을 찍을 물론 원치 않는의 인 앱이 반환 onDestroy()은 다음onActivityResult()를 호출, onCreate() 다음에,라고, 그리고 마지막으로, onDestroy()onCreate() 다시 호출됩니다.Samsung Galaxy Tab 7.0은 카메라 의도에서 돌아와서 앱을 다시 시작합니다.

Possibles 단서 :

갤럭시 탭 7.0은 명시 적으로 매니페스트 파일에서 지원되지 않는 화면 크기가 (이 내가 지원되지 않는 화면 크기로 테스트 한 유일한 장치), 그래서 사용자
  • scretch-to-fit 또는 zoom-to-fit을 선택할 수 있습니다. 두 UI는 모두 같은 (나쁜) 동작을합니다.
  • 사진을 미리 볼 때 카메라 동작이 방향을 전환하는 것처럼 보입니다. 내 응용 프로그램은 세로 모드 (작은 화면에서는편집 : xlarge가 아닌 화면에서는 방향 변경을 지원함) 만 지원합니다. 어쩌면 오리엔테이션 변화가 어떻게 든 내 활동을 파괴하고있는 것일 수 있습니다.
  • 나는 다른 인 텐트 (이메일 의도)에서 실행 및 반환을 시도했으며,이 경우 내 앱이 파괴되지 않고 다시 작성되지 않았습니다.

자세한 정보 나 코드 샘플이 필요한지 알려주세요.

편집 : 오리 엔테이션 변경 사항의 문제가 좁혀졌습니다. Karthik의 대답에 따라 android:configChanges="orientation"으로 설정하면 문제가 해결됩니다. 유일한 문제는 내 앱이 xlarge 화면에서 방향 변경을 지원한다는 것입니다. 이 설정은 해당 장치에서이 기능을 해제합니다. android:configChanges="@string/config_changes"을 사용하고 화면 크기에 따라 다른 문자열을 제공하려했지만 이제는 "설치 오류 : INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION"이 표시됩니다. 이에 따르면 Android Activity, how to override manifest's android:configChanges with Java code?, 프로그래밍 방식으로 설정할 수있는 방법이 없습니다. 내 앱의 모든 방향 변경 사항을 수동으로 처리 할 수있는 유일한 옵션이 있습니까?

+0

는 당신이 초대형 스크린을 위해 수동으로 활동의 방향 변경을 처리해야 할 것 같아요. 또는 xlarge 기기에 대해 (가장 명확한 변경 사항이있는) 별도의 APK를 사용합니다. – Karthik

답변

2

카메라 앱을 시작할 때 장치 메모리가 부족하여 OS가 내 주요 활동을 재활용했기 때문에 내 앱이 다시 시작되는 이유를 발견했습니다. 그것은 단편화 된 레이아웃을 가지고 있고 어떤 조각 초기화가 savedInstanceState에 관계없이 onCreate()에서 수행되고 있다는 것을 제외하고는 문제가되지 않습니다. 이로 인해 자동 조각 복원이 삭제되고 사실상 복원하려고 시도했을 때 처음부터 다시 시작한 것처럼 보이게되었습니다.

예 : savedInstanceState가 null이 아니었고 상태가 onSaveInstanceState()에 올바르게 저장 및 onCreate()에 복원되는 것을 확인했다,과의 정상 처리를 구현하는 경우

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // add main menu -- WRONG! 
    MainMenuFragment mainMenu = new MainMenuFragment(); 
    FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.contents, mainMenu); 
    ft.commit(); 

    if (savedInstanceState != null) { 
     // <restore state> 
    } 
    else { 
     // <initialize stuff> 
    } 
} 

이 문제를 해결하려면, 나는 조각 초기화를 생략 onActivityResult().

예 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState != null) { 
     // <restore state> 
    } 
    else { 
     // <initialize stuff> 

     // add main menu -- CORRECT! 
     MainMenuFragment mainMenu = new MainMenuFragment(); 
     FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.contents, mainMenu); 
     ft.commit(); 
    } 
} 
2

맞아요, 방향 변경 때문입니다. 카메라는 갤럭시 탭의 가로 모드에서 작동합니다.
따라서 명백한 파일의 <activity> 태그에 android:configChanges="orientation"을 추가 할 수 있습니다.

이렇게하면 문제가 해결됩니다. onDestroy()onCreate()은 카메라에서 반환 할 때 호출되지 않습니다.

+0

이 [Link] (http://developer.android.com/guide/topics/manifest/activity-element.html#config)에 따라'screenSize'를 추가해야 할 수도 있습니다. – Karthik

+0

감사합니다. 덕분에 많은 도움이되었습니다. 그러나 이것은 또 다른 문제를 야기한다. 내 편집 내용을 확인하십시오. – Ken