일모도원(日暮途遠) 개발자
[안드로이드개발] ExoPlayer 백그라운드에 오래있으면 화면 먹통되는 현상 본문
ExoPlayer를 이용해서 동영상플레이어를 개발하고 있다.
백그라운드에서 동영상을 플레이하고 있으면 시간이 좀 지나면 재생이 멈추는 현상이 발생한다.
이는 Service를 만들어서 해결했다. (오래되어서 서비스를 만들었다는 기억도 잘안난다.)
한참 잘 쓰고 있는데, 동영상을 정지상태에서 다른 앱을 열어서 좀 보다가 다시 돌아오면 플레이버튼이 작동을 안하는 현상을 발견했었다. 다른 모든 기능은 되는데... 자세히 보니 동영상 화면도 검다. 다른앱을 가기전에는 분명히 화면이 보인상태에서 재생만 정지했는데...
exoPlayer.setPlayWhenReady(true)를 실행해도 실행이 되지 않는다. exoPlayer는 분명 null이 아닌데, 다시 exoplayer를 init해도 안된다...
귀찮아서 그냥 두었는데, 동영상 플레이어에서 챗GPT를 사용하기 위해서 CustomTab(웹뷰는 Auth이슈때문에 사용불가)을 사용하니 똑 같은 문제가 발생한다. 이는 CustomTab은 앱내에 포함되어 있지 않기 때문이다. 챗GPT에게 오래 물어보고 다시 앱으로 돌아오면 ExoPlayer를 재생할수 없기 때문에... 어쩔수 없이 디버깅을 해보니 백그라운드 상태에서 몇십초 정도 지나면 Service 클래스가 Destroy가 되는걸 볼수 있다. Destroy되기 전에 동영상앱으로 돌아오면 문제가 없다.
public class PlayerService extends Service {
exoplayer를 다시 초기화하는 방법으로는 해결을 못했는데, 백그라운드 모드에서 배터리 사용량 최적화 목록에서 제외 하는걸로 해결했다.즉 앱이 백그라운드로 가면, 배터리리를 아낄려고 일정 시간이 지나면 리소스를 회수하거나 죽이는걸. 안하겠다는 얘기다.
public static void checkAndAskIgnoreBatteryOptimization(Activity activity) {
if (!SharedPreferencesDB.getInstance(activity).isAskedIgnoreBatteryOptimization()) {
SharedPreferencesDB.getInstance(activity).setAskedToIgnoreBatteryOptimization(true);
Utils.askIgnoreBatteryOptimization(activity);
}
}
public static void askIgnoreBatteryOptimization(Activity activity) {
PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
if ((activity.getPackageName() != null)
&& (powerManager.isIgnoringBatteryOptimizations(activity.getPackageName()) == false)) {
final YesNoDialog dialog = new YesNoDialog(activity, R.string.info, R.string.messsage_ask_to_ignore_battery_optimiszations, null, new OnYesNoClickListener() {
@Override
public void onYesClick(View view, Object object) {
SharedPreferencesDB.getInstance(activity).setAskedToIgnoreBatteryOptimization(true);
String fileNameWithoutExt = (String) object;
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
@Override
public void onNoClick(View view, Object object) {
SharedPreferencesDB.getInstance(activity).setAskedToIgnoreBatteryOptimization(true);
}
});
dialog.show();
}
}
왼쪽 화면은 내 앱에서 띄우는거고, 오른쪽 화면이 안드로이드에서 띄우는 팝업이다. "최적화 중지"를 허용해야 한다.
(좀 헷갈리긴 한다. 최적화를 한다고 하면 좋은거 같은데 안한다고 해야 하니까)
이렇게 하니 저 onDestroy메소드도 호출되지 않고, 백그라운드로 갔다가 몇분 뒤에 정지되어 있는 동영상 화면으로 돌아와도 다시 재생을 해도 잘 된다.
'안드로이드 개발 > 안드로이드' 카테고리의 다른 글
판매자 ID 찾기 (0) | 2024.10.15 |
---|---|
[Android 개발] 카메라 앱 기본 기능 (0) | 2023.09.04 |
[안드로이드 개발] 클립보드에 텍스트가 있는데 hasPrimaryClip이 false가 날때 (0) | 2023.04.19 |
[안드로이드 개발] 아직도 헷갈리는 안드로이드 폴더 구조. (0) | 2023.04.07 |
[안드로이드UI] 채팅 대화내역 키보드에 안가리게 하기. (0) | 2023.04.01 |