티스토리 뷰

Android

AppUpdateManager

black.spade 2021. 10. 26. 13:27
        private val appUpdateManager by lazy {
        	AppUpdateManagerFactory.create(this)
    	}
       
       // com.google.android.play.core.install.InstallException: Install Error(-10): The app is not owned by any user on this device. An app is "owned" if it has been acquired from Play.
        // -> 플레이스토어에 이미 앱이 출시되어있는데 현재 계정으로 받은 내역이 없어서 발생하는 오류. 현재 로그인되어있는 계정으로 해당 앱을 한번 설치해준후 다시 진행해준다
        CoroutineScope(Dispatchers.IO).launch {
            val appUpdateInfo = appUpdateManager.appUpdateInfo.await()
            when(appUpdateInfo.updateAvailability()){
                UpdateAvailability.UPDATE_AVAILABLE -> {
                    Log.d(TAG, "updateAvailability UPDATE_AVAILABLE")
                    // 업데이트 가능한 상태
                    startUpdateFlow(appUpdateInfo)
                }
                UpdateAvailability.UNKNOWN -> {
                    // 알수 없음
                    Log.d(TAG, "updateAvailability UNKNOWN")
                }
                UpdateAvailability.UPDATE_NOT_AVAILABLE -> {
                    // 현재 최신버전이며 업데이트가 필요 하지 않은 경우
                    Log.d(TAG, "updateAvailability UPDATE_NOT_AVAILABLE")
                }
                UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS -> {
                    // AppUpdateType.IMMEDIATE 타입을 통해 업데이트를 수행중인 경우
                    Log.d(TAG, "updateAvailability DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS")
                }
            }
        }
        
            private suspend fun Task<AppUpdateInfo>.await(): AppUpdateInfo {
        return suspendCoroutine { continuation ->
            addOnCompleteListener { result ->
                if (result.isSuccessful) {
                    continuation.resume(result.result)
                } else {
                    continuation.resumeWithException(result.exception!!)
                }
            }
        }
    }

    private fun startUpdateFlow(appUpdateInfo: AppUpdateInfo) {
        Log.d(TAG, "startUpdateFlow :: ${appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)}")
        if(appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { //  실제로 업데이트 가능한지 확인 할 수 있습니다.
            appUpdateManager.startUpdateFlowForResult(
                    appUpdateInfo,
                    AppUpdateType.IMMEDIATE , // or AppUpdateType.IMMEDIATE
                    this,
                    1000)

            val listener = InstallStateUpdatedListener {
                if (it.installStatus() == InstallStatus.DOWNLOADED) {
                    Snackbar.make(coordinator_layout, "업데이트 버전 다운로드 완료", Snackbar.LENGTH_INDEFINITE)
                            .setAction("설치/재시작", View.OnClickListener {
                                appUpdateManager.completeUpdate()
                            }).show()
                }
            }
            appUpdateManager.registerListener(listener)
        }
    }

    override fun onResume() {
        super.onResume()
        /**
         * 업데이트중에는 항상 업데이트 UI만 보여지게 하기위해서는
         * UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS 상태로 처리하면 됩니다.
         */
        appUpdateManager.appUpdateInfo
                .addOnSuccessListener {
                    Log.d(TAG, "onResume addOnSuccessListener :: ${it.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS}")
                    if (it.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                        startUpdateFlow(it)
                    }
                }
    }

'Android' 카테고리의 다른 글

Filterable  (0) 2021.11.04
Android 11 (Api 30) 파일 저장 관련  (0) 2021.05.27
안드로이드 RecyclerView 성능 개선팁  (0) 2020.12.10
HorizontalScrollView Scroll Animation  (0) 2020.12.10
ViewPager  (0) 2020.03.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함