투케이2K

36. (TWOK/LOGIC) [Android] [출처 알 수 없는 앱 설치 허용] 앱 업데이트 여부 판단 및 앱 업데이트 수행 실시 - vnd.package-archive 본문

투케이2K 로직정리

36. (TWOK/LOGIC) [Android] [출처 알 수 없는 앱 설치 허용] 앱 업데이트 여부 판단 및 앱 업데이트 수행 실시 - vnd.package-archive

투케이2K 2023. 11. 7. 14:40
반응형

[로직 정리]

정리 로직 : Android

상태 : [Android] [출처 알 수 없는 앱 설치 허용] 앱 업데이트 여부 판단 및 앱 업데이트 수행 실시 - vnd.package-archive

 

[설 명]

 

[1] : 알수 없는 앱 설치 권한 부여 상태 확인 : REQUEST_INSTALL_PACKAGES


[2-1] : [IF] : 알수 없는 앱 설치 권한이 부여 되어 있는 경우 : 앱 업데이트에 필요한 변수 선언 : String PackageName : AndroidManifest.xml 파일에 queries 등록 필요


[2-2] : [ELSE] : 알수 없는 앱 설치 권한이 부여 되지 않는 경우 권한 허용 창 Intent 이동 : ACTION_MANAGE_UNKNOWN_APP_SOURCES


[3] : 앱 마지막 업데이트 날짜 내역 확인


[4] : 새롭게 업데이트를 수행할 앱 버전이 있는 지 확인 실시 (Date 비교)

  >> API 호출 후 업데이트 여부 판단 및 APK 파일 다운로드 후 앱 특정 경로 저장소에 저장


[5] : 새롭게 업데이트 할 버전이 있는 경우 팝업창 알림 표시


[6] : 사용자가 [앱 업데이트 진행] 버튼 클릭 수행 시 >> 기존에 저장 된 [앱 캐시 및 데이터] 초기화 수행 >> 다운로드 받은 APK 파일로 앱 Update 수행


[예시 소스 코드] : 

        // ---------------------------------------------------------------
        // [로직 처리 실시]
        // ---------------------------------------------------------------
        try {

            // [1] : 알수 없는 앱 설치 권한 부여 상태 확인
            if (C_Permission.getAppInstallPermisseionEnable(A_Intro.this) == true){

                // [2] : 앱 업데이트에 필요한 변수 선언
                String packageName = "com.example.javaproject";


                // [3] : 앱 마지막 업데이트 날짜 내역 확인
                String appUpdateDate = C_App.appInstallUpdateTime(A_Intro.this, packageName);


                // [4] : 새롭게 업데이트를 수행할 앱 버전이 있는 지 확인 실시 (Date 비교)


                // [5] : 앱 업데이트 팝업창 알림 수행
                String message = "Package : " + packageName + "\n\n" + "appUpdateData : " + appUpdateDate;

                C_Ui_View.observableAlert(A_Intro.this, "알 림", message, "앱 업데이트", "닫기")
                        .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                        .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                        .subscribe(new Observer<Boolean>() { // [Observable.create 타입 지정]
                            @Override
                            public void onSubscribe(@NonNull Disposable d) {
                            }
                            @Override
                            public void onNext(@NonNull Boolean value) {

                                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                                    @Override
                                    public void run() {

                                        if (value == true){ // [앱 업데이트 클릭]

                                            // TODO [외부 저장소 경로 확인] : [외부 저장 시에는 파일 액세스 권한 필요]
                                            String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
                                            String folderName = "LOG_SAVE_FOLDER";
                                            String fileName = "update_test.apk";


                                            // TODO [다운로드 폴더에서 세부 경로 정의]
                                            if (filePath.endsWith("/") == true){
                                                filePath = filePath + folderName;
                                            }
                                            else {
                                                filePath = filePath + "/" + folderName;
                                            }

                                            if (filePath.endsWith("/") == true){
                                                filePath = filePath + fileName;
                                            }
                                            else {
                                                filePath = filePath + "/" + fileName;
                                            }


                                            // TODO [앱 캐시 및 데이터 초기화]
                                            C_App.clearAppCache(A_Intro.this);
                                            C_App.clearAppData(A_Intro.this);


                                            // TODO [프리퍼런스에 데이터 저장] : [데이터 및 캐시 초기화 후에 필요한 데이터 저장]


                                            // TODO [apk 파일 업데이트 수행 실시 : 조건은 빌드를 수행한 프로젝트와 같은 패키지 명칭을 가진 동일 앱]
                                            C_App.update_External_Apk_File(A_Intro.this, filePath);

                                        }

                                    }
                                }, 0); //1초뒤 실행 (작업 예약)

                            }
                            @Override
                            public void onError(@NonNull Throwable e) {
                            }
                            @Override
                            public void onComplete() {
                            }
                        });

            }
            else {

                // [알수 없는 앱 설치 권한 부여 인텐트 이동]
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
                intent.setData(Uri.parse("package:" + getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
            }

        }
        catch (Exception e){
            e.printStackTrace();
        }

 

반응형
Comments