Notice
Recent Posts
Recent Comments
Link
투케이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();
}
}
[결과 출력]
반응형
'Android' 카테고리의 다른 글
Comments