From 709dde31de9e3ab85dbc702004992d55590624ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Fri, 30 Jan 2026 23:17:29 +0900 Subject: [PATCH] =?UTF-8?q?fix(MOB):=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EC=99=84=EB=A3=8C=20=EA=B0=90=EC=A7=80=EB=A5=BC=20?= =?UTF-8?q?BroadcastReceiver=EC=97=90=EC=84=9C=20=ED=8F=B4=EB=A7=81=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 삼성폰에서 BroadcastReceiver가 동작하지 않는 문제 해결 - BroadcastReceiver 제거, Handler로 1초 간격 DownloadManager.Query 폴링 - 모든 기기에서 안정적으로 다운로드 완료 감지 Co-Authored-By: Claude Opus 4.5 --- .../codebridgex/webapp/AppUpdateChecker.java | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/android/app/src/main/java/com/codebridgex/webapp/AppUpdateChecker.java b/android/app/src/main/java/com/codebridgex/webapp/AppUpdateChecker.java index 93997c0..4c6c1e2 100644 --- a/android/app/src/main/java/com/codebridgex/webapp/AppUpdateChecker.java +++ b/android/app/src/main/java/com/codebridgex/webapp/AppUpdateChecker.java @@ -3,15 +3,15 @@ package com.codebridgex.webapp; import android.app.Activity; import android.app.AlertDialog; import android.app.DownloadManager; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; +import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import android.util.Log; @@ -144,8 +144,8 @@ public class AppUpdateChecker { DownloadManager dm = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); long downloadId = dm.enqueue(request); - // 다운로드 완료 감지 - registerDownloadReceiver(downloadId, fileName); + // 다운로드 완료 폴링 감지 + pollDownloadStatus(downloadId, fileName); } catch (Exception e) { Log.e(TAG, "Download start error", e); @@ -153,32 +153,42 @@ public class AppUpdateChecker { } /** - * 다운로드 완료 시 설치 화면 표시 + * 다운로드 상태를 1초마다 폴링하여 완료 감지 */ - private void registerDownloadReceiver(long downloadId, String fileName) { - BroadcastReceiver receiver = new BroadcastReceiver() { + private void pollDownloadStatus(long downloadId, String fileName) { + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { @Override - public void onReceive(Context context, Intent intent) { - long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); - if (id != downloadId) return; + public void run() { + if (activity.isFinishing() || activity.isDestroyed()) return; - try { - activity.unregisterReceiver(this); - } catch (Exception ignored) {} + DownloadManager dm = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); + DownloadManager.Query query = new DownloadManager.Query(); + query.setFilterById(downloadId); - installApk(fileName); + try (Cursor cursor = dm.query(query)) { + if (cursor != null && cursor.moveToFirst()) { + int status = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS)); + + if (status == DownloadManager.STATUS_SUCCESSFUL) { + Log.d(TAG, "Download complete: " + fileName); + installApk(fileName); + return; + } else if (status == DownloadManager.STATUS_FAILED) { + int reason = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON)); + Log.e(TAG, "Download failed, reason: " + reason); + return; + } + } + } catch (Exception e) { + Log.e(TAG, "Poll download status error", e); + return; + } + + // 아직 다운로드 중 → 1초 후 재확인 + handler.postDelayed(this, 1000); } - }; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - // DownloadManager 브로드캐스트는 시스템에서 발송하므로 RECEIVER_EXPORTED 필요 - activity.registerReceiver(receiver, - new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), - Context.RECEIVER_EXPORTED); - } else { - activity.registerReceiver(receiver, - new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - } + }, 1000); } /**