728x90
반응형
웹뷰에서는 브라우저와 다르게 newtab으로 페이지를 열경우 oncreate외에 코드를 추가해 주어야한다.
webChromeClient를 이용해서 새로운 창을 여는 웹뷰설정과 그안에서의 다운로드 처리도 별도로 진행된다.
public class MyWebChromeClient extends WebChromeClient {
//신규탭으로 열었을때
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(view.getContext());
WebSettings settings = newWebView.getSettings();
//ウェブページのjavascript使用許可
settings.setJavaScriptEnabled(true);
//新しくタブを使用許可
settings.setSupportMultipleWindows(true);
//画面zoom許可
settings.setSupportZoom(true);
//画面拡大縮小許可
settings.setBuiltInZoomControls(true);
//拡大ショートカット許可しない
settings.setDisplayZoomControls(false);
//GPS許可
settings.setGeolocationEnabled(true);
//DBアクセス許可
settings.setDatabaseEnabled(true);
//フォームデータを保存しない
settings.setSaveFormData(false);
final Dialog dialog = new Dialog(view.getContext(), R.style.Theme_DialogPage);
dialog.setContentView(newWebView);
//다운로드처리
newWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
try {
String mFileName;
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setMimeType(mimeType);
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies);
request.addRequestHeader("User-Agent", userAgent);
request.addRequestHeader("Referer", getReferrer().getAuthority());
request.addRequestHeader("Content-Disposition", contentDisposition);
request.setDescription("Downloading file...");
String content = contentDisposition;
//アンドロイド側で読み込めるようにファイル名を編集
mFileName = content.replace("attachment; filename=", "").trim();
//WEBでエンコードされたファイル名をDecodeする
mFileName = URLDecoder.decode(mFileName, String.valueOf(UTF_8));
request.setTitle(mFileName);
//このダウンロードの実行中または完了時に、ダウンロード マネージャーによってシステム通知が投稿されるかどうかを制御します。
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//다운로드폴더설정 path=\내부스토리지\Android\data\어플이름\cache
request.setDestinationUri(Uri.fromFile(new File(getExternalCacheDir().getAbsolutePath(), mFileName)));
//このダウンロードを実行できるネットワークの種類を制限します。
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
//ダウンロード マネージャーがダウンロードを実行する準備ができ、接続が利用可能になると、ダウンロードは自動的に開始されます。
dm.enqueue(request);
} catch (Exception e) {
e.printStackTrace();
}
}
});
newWebView.clearCache(true);
dialog.show();
//뒤로가기 키 설정
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//다이얼로그 닫기
dialog.dismiss();
}
return true;
}
});
newWebView.setWebViewClient(new MyWebViewClient());
newWebView.setWebChromeClient(new MyWebChromeClient());
//スレッド境界を越えて WebView を返すためのトランスポート オブジェクト。
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
}
728x90
'Java Android' 카테고리의 다른 글
[안드로이드]인코딩 디코딩 URL과 base64 (0) | 2023.11.03 |
---|---|
[Java][Android]어플 종료시 어플에서 다운로드한 파일/캐시파일 삭제하기 (0) | 2023.11.02 |
[Java][Android]webview 파일 다운로드한 후 파일 열기 (0) | 2023.11.01 |
[Java][Android]webview에서 파일 업로드 (1) | 2023.10.31 |