마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안녕하세요, 웹뷰 파일 다운로드 질문 드립니다ㅠ

0 추천

https://onedaycodeing.tistory.com/71

위의 사이트에서 웹뷰 DownloadListener 구현을 통해서 다운로드는 되는데 파일명과 파일 자체가 깨져서 열리지 않는데요; 혹시 어떻게 해야 할까요? 

아래와 같이 한글 깨지는 거 utf-8 디코딩도 한 거라고 하는데, 한글도 여전히 깨지네요. 

contentDisposition = URLDecoder.decode(contentDisposition,"UTF-8"); //디코딩

※ 매니페스트 설정 

<!--PERMISSIONS: for Storage-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

※ 웹셋팅 및 DownloadListener 코드 전체 

// 웹 셋팅
WebSettings mWebSettings = mWebView.getSettings();
mWebSettings.setSupportMultipleWindows(true);
mWebSettings.setJavaScriptEnabled(true); //자바스크립트 허용
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 자바스크립트가 window.open()을 사용가능
mWebSettings.setDomStorageEnabled(true); // Sets whether the DOM storage API is enabled.
mWebSettings.setBlockNetworkImage(false); // 썸넬 이미지 노출x
mWebSettings.setAllowFileAccess(true);
mWebSettings.setBuiltInZoomControls(true);
mWebSettings.setDisplayZoomControls(false);
mWebSettings.setLoadWithOverviewMode(true);
mWebSettings.setUseWideViewPort(true);

mWebView.setDownloadListener(new DownloadListener() {
    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
        try {
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

            contentDisposition = URLDecoder.decode(contentDisposition,"UTF-8"); //디코딩

            //attachment; filename*=UTF-8''뒤에 파일명이있는데 파일명만 추출하기위해 앞에 attachment; filename*=UTF-8''제거
            String FileName = contentDisposition.replace("attachment; filename=", "");

            String strcut = FileName.toString();
            FileName = strcut.substring(0, strcut.length()-1);

            String fileName = FileName; //위에서 디코딩하고 앞에 내용을 자른 최종 파일명
            request.setMimeType(mimetype);
            request.addRequestHeader("User-Agent", userAgent);
            request.setDescription("Downloading File");
            request.setAllowedOverMetered(true);
            request.setAllowedOverRoaming(true);
            request.setTitle(fileName);
            request.setRequiresCharging(false);

            request.allowScanningByMediaScanner();
            request.setAllowedOverMetered(true);
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
            dm.enqueue(request);
            Toast.makeText(getApplicationContext(),"파일이 다운로드 됩니다.", Toast.LENGTH_LONG).show();
        }
        catch (Exception e) {
            if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    Toast.makeText(getBaseContext(), "다운로드를 위해\n권한이 필요합니다.", Toast.LENGTH_LONG).show();
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1004);
                }
                else {
                    Toast.makeText(getBaseContext(), "다운로드를 위해\n권한이 필요합니다.", Toast.LENGTH_LONG).show();
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1004);
                }
            }
        }
    }
});
홍구홍구 (470 포인트) 님이 2021년 7월 5일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...