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);
}
}
}
}
});