투케이2K

308. (AndroidStudio/android/java) 다운로드 매니저 (DownManager) 사용해 웹뷰에서 파일 다운로드 수행 실시 본문

Android

308. (AndroidStudio/android/java) 다운로드 매니저 (DownManager) 사용해 웹뷰에서 파일 다운로드 수행 실시

투케이2K 2022. 7. 21. 15:20

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : java

 

[사전 설정]

 

[파일 다운로드 주소 감지 부분 : a 태그 href 감지]

        // [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"[A_Main >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
            Log.i("","\n"+"[기본 주소 :: "+String.valueOf(url)+"]");
            Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
            Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");


            // [SEARCH FAST] : [파일 다운로드 수행]
            if (url.startsWith("f:")){
                // [원본 url 형식으로 만듦]
                String fileUrl = String.valueOf(url.substring(2, url.length()));
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"[A_Main >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                Log.i("","\n"+"[타 입 :: "+String.valueOf("파일 다운 로드")+"]");
                Log.i("","\n"+"[fileUrl :: "+String.valueOf(fileUrl)+"]");
                Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");

                if (C_Util.stringNotNull(C_Util.urlFileExtensionName(fileUrl)) == true){ // TODO [URL 로드 주소가 파일 확장자 포함하는 경우]

                    // ----------------------------------
                    // [파일 다운로드 수행 실시]
                    C_Util.appDownloadFile(A_Main.this, fileUrl.trim());
                    // ----------------------------------
                }

                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }



            // ----------------------------------
            // [새로운 웹뷰 로드 수행]
            view.loadUrl(url);
            // ----------------------------------


            // ----------------------------------
            // [return  값을 반드시 false 설정]
            return false;
            // ----------------------------------
        }
 

[파일 다운로드 수행 부분]

    // TODO [다운로드 매니저 사용해 파일 다운로드 수행 실시]
    public static void appDownloadFile(Context mContext, String fileUrl){

        /**
         * // -----------------------------------------
         * [appDownloadFile 메소드 설명]
         * // -----------------------------------------
         * 1. 파일 다운로드 수행 실시 메소드 (내장 메모리 >> 공유 Download 폴더)
         * // -----------------------------------------
         * 2. 호출 방식 :
         *   - C_Util.appDownloadFile(A_Main.this, "http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg");
         * // -----------------------------------------
         * 3. 사전 설정 사항 :
         *   - AndroidManifest >> WRITE_EXTERNAL_STORAGE , READ_EXTERNAL_STORAGE 권한 부여
         *   - AndroidManifest >> application : android:requestLegacyExternalStorage="true" 옵션 설정
         * // -----------------------------------------
         * 4. 로직 :
         *   - 인풋으로 들어온 파일 주소 널 체크 수행 실시
         *   - AndroidManifest : WRITE_EXTERNAL_STORAGE , READ_EXTERNAL_STORAGE 권한 부여 체크
         *   - 현재 날짜 및 시간 확인 실시
         *   - DownloadManager 사용해 파일 다운로드 수행 실시
         *   - 파일 저장 명칭은 현재 날짜 및 시간.확장자
         * // -----------------------------------------
         * 5. 참고 [1] : [다운로드 폴더 경로 확인]
         *   File pathFoler = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
         *   String path = pathFoler.getPath();
         * // -----------------------------------------
         * 6. 참고 [2] : html a 태그 소스 코드
         *   <a href='f:http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg' download="file"> 파일다운로드 </a>
         * // -----------------------------------------
         * */

        try {
            if (fileUrl != null
                    && fileUrl.length()>0
                    && fileUrl.trim().equals("") == false
                    && fileUrl.trim().equals("null") == false
                    && fileUrl.trim().equals("undefined") == false
                    && fileUrl.trim().startsWith("http") == true){ // [파일 확장자 명이 널이 아닌 경우]

                // [권한 부여 상태 체크 수행 실시]
                if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

                    // [주소에 포함된 파일 확장자명 추출 실시]
                    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
                    String extension = String.valueOf(mimeTypeMap.getFileExtensionFromUrl(fileUrl.trim())); // [jpg]
                    String mimeType = String.valueOf(mimeTypeMap.getMimeTypeFromExtension(extension)); // [image/jpeg]


                    // [파일 확장자명 종료 확인]
                    if (extension != null && extension.length()>0
                            && extension.trim().equals("") == false && extension.trim().equals("null") == false){ // [널 값이 아님 : 정상 확장자 포함]
                    }
                    else { // [널 인 경우]
                        String fileName = fileUrl.substring(fileUrl.trim().lastIndexOf('/') + 1);
                        String fileExt = String.valueOf(mimeTypeMap.getFileExtensionFromUrl(fileName.trim())); // [jpg]

                        // [리턴 변수에 삽입 실시]
                        extension = fileExt;
                    }


                    // [쿼리 스트링에서 파일 확장자 검사 확인]
                    if (extension != null && extension.length()>0
                            && extension.trim().equals("") == false && extension.trim().equals("null") == false){ // [널 값이 아님 : 정상 확장자 포함]
                    }
                    else { // [널 인 경우]
                        Uri uri = Uri.parse(fileUrl.trim());
                        String host = String.valueOf(uri.getHost()); // [호스트]
                        String endCheck = host + "?"; // [마지막 종료 형식 확인 위함 : 스키마 데이터 널 체크]

                        if (uri.getQueryParameterNames() != null
                                && uri.getQueryParameterNames().size() > 0
                                && fileUrl.trim().endsWith(endCheck.trim()) == false) { // KEY 값이 하나라도 포함된 경우

                            // [배열 순회하면서 파일 확장자 여부 값 확인 실시]
                            ArrayList keyList = new ArrayList(uri.getQueryParameterNames());
                            for (int i = 0; i < keyList.size(); i++) {

                                // [파일 이름 확인]
                                String fileExt = String.valueOf(mimeTypeMap.getFileExtensionFromUrl(uri.getQueryParameter(String.valueOf(keyList.get(i))))); // [jpg]

                                // [리턴 변수에 삽입 실시]
                                extension = fileExt;
                            }
                        }
                    }

                    // [현재 날짜 및 시간 확인 실시]
                    long time = System.currentTimeMillis();
                    SimpleDateFormat dayTime = new SimpleDateFormat("yyyyMMddkkmmss");
                    String str = dayTime.format(new Date(time));


                    // [현재 날짜 및 시간 데이터 + 확장자명 결합 실시]
                    String fileName = str.trim() + "." + extension.trim();


                    // [파일 확장자 명 널 체크 수행 후 다운로드 실시]
                    if (extension != null && extension.length()>0
                            && extension.trim().equals("") == false && extension.trim().equals("null") == false){ // [널 값이 아님 : 정상 확장자 포함]

                        // [DownloadManager 사용해 파일 다운로드 수행 실시]
                        DownloadManager manager = (DownloadManager) mContext.getSystemService(Activity.DOWNLOAD_SERVICE);
                        Uri uri = Uri.parse(fileUrl.trim()); // [파일 다운로드 주소 : 확장자명 포함되어야함]
                        DownloadManager.Request request = new DownloadManager.Request(uri); // [다운로드 매니저 객체 생성]
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // [앱 상단에 다운로드 표시]
                        request.setTitle(fileName); // [다운로드 제목 표시]
                        request.setDescription("Download ... "); // [다운로드 중 표시되는 내용]
                        request.setNotificationVisibility(1); // [앱 상단에 다운로드 상태 표시]
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); // [다운로드 폴더 지정]
                        manager.enqueue(request); // [다운로드 수행]


                        // [로그 출력 실시]
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[C_Util >> appDownloadFile() :: 파일 다운로드 수행 실시]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[fileUrl :: "+String.valueOf(fileUrl)+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[fileName :: "+String.valueOf(fileName)+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[downloadPath :: "+String.valueOf("DIRECTORY_DOWNLOADS")+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");


                        // [토스트 알림 실시]
                        Toast.makeText(mContext, "파일 다운로드를 수행합니다.", Toast.LENGTH_SHORT).show();
                    }
                    else { // [널 인 경우 >> 실패 토스트]

                        // [로그 출력 실시]
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"[C_Util >> appDownloadFile() :: 파일 다운로드 수행 에러]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[error :: "+String.valueOf("file extension is null")+"]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");


                        // [토스트 알림 실시]
                        Toast.makeText(mContext, "파일 확장자 명을 다시 확인해주세요.", Toast.LENGTH_SHORT).show();
                    }
                }
                else {
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"[C_Util >> appDownloadFile() :: 파일 다운로드 수행 실시]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[error :: "+"PERMISSION WRITE_EXTERNAL_STORAGE NOT GRANTED"+"]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[WRITE_EXTERNAL_STORAGE :: "+String.valueOf(ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE))+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");

                    // [토스트 알림 실시]
                    Toast.makeText(mContext, "외부 저장소 접근 권한을 허용해주세요.", Toast.LENGTH_SHORT).show();
                }
            }
            else { // [파일 확장자 명이 널 인 경우]
                Log.i("---","---");
                Log.e("//===========//","================================================");
                Log.i("","\n"+"[C_Util >> appDownloadFile() :: 파일 다운로드 수행 실시]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[error :: "+"file url is null"+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[fileUrl :: "+String.valueOf(fileUrl)+"]");
                Log.e("//===========//","================================================");
                Log.i("---","---");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }
 

[결과 출력]

 

 
반응형
Comments