WebView 내에서 파일 다운로드


79

내 Android 애플리케이션에 웹뷰가 있습니다. 사용자가 webview로 이동하여 링크를 클릭하여 파일을 다운로드해도 아무 일도 일어나지 않습니다.

URL = "my url";
mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebViewClient(new HelloWebViewClient());
mWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);
mWebView.loadUrl(URL);
Log.v("TheURL", URL);

웹뷰 내에서 다운로드를 활성화하는 방법은 무엇입니까? webview를 비활성화하고 응용 프로그램에서 브라우저에 URL을로드하는 의도를 활성화하면 다운로드가 원활하게 작동합니다.

String url = "my url";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

누군가 나를 여기서 도울 수 있습니까? 페이지가 문제없이로드되지만 HTML 페이지의 이미지 파일에 대한 링크가 작동하지 않습니다.


Webview다운로드 등을 자동으로 처리 하는이 하위 클래스를 사용할 수 있습니다 . github.com/delight-im/Android-AdvancedWebView
caw

답변:


112

시도해 보셨습니까?

mWebView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        startActivity(i);
    }
});

예제 링크 : Webview 파일 다운로드 -감사합니다 @ c49


이 코드는 작동하지만 사용자가 WebView에서 인증 된 경우 다운로드가 발생한 후 Android 브라우저가 시작되면 다시 로그인하라는 메시지가 표시됩니다. 나는 그것을 피하는 방법을 찾으려고 노력하고 있으므로 다시 로그인하지 않고도 다운로드가 이루어집니다.
CloudMeta 2012 년

다운로드 모든 종류의이 링크를 시도하십시오 androidtrainningcenter.blogspot.in/2013/11/...
Tofeeq 아마드

@ioSamurai 사용자 인증이 필요한 파일을 다운로드하는 방법을 찾았습니까? webView.setDownloadListener()사용자 인증이 필요하지 않을 때 완벽하게 작동합니다. 그러나 사용자 인증이 필요한 Google 드라이브 또는 기타 소스에서 파일을 다운로드하면 파일이 다운로드되지만 데이터가 없습니다. @ user370305 당신도 도울 수 있습니다.
Sp4Rx

대부분의 문제를 해결할 Chrome 사용자 정의 탭 을 확인할 수 있습니다 . @Rohit
Sp4Rx


56

이것을 시도하십시오. 많은 게시물과 포럼을 살펴본 후 이것을 발견했습니다.

mWebView.setDownloadListener(new DownloadListener() {       

    @Override
    public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition, String mimetype,
                                    long contentLength) {
            DownloadManager.Request request = new DownloadManager.Request(
                    Uri.parse(url));

            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Name of your downloadble file goes here, example: Mathematics II ");
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
            Toast.makeText(getApplicationContext(), "Downloading File", //To notify the Client that the file is being downloaded
                    Toast.LENGTH_LONG).show();

        }
    });

이 권한을주는 것을 잊지 마십시오! 이건 매우 중요합니다! 이것을 Manifest 파일 (AndroidManifest.xml 파일)에 추가하십시오.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />        <!-- for your file, say a pdf to work -->

도움이 되었기를 바랍니다. 건배 :)


11
감사합니다! 원본 파일 이름을 사용하여 다음을 사용할 수 있습니다.final String filename= URLUtil.guessFileName(url, contentDisposition, mimetype);
Jawaad

9
@SaiZ 귀하의 예제에는 사용되지 않은 인 텐트에 대한 코드가 포함되어 있으므로 제거해야 할 것 같습니다.
jc

@jc i는 사용하지 않는 코드를 제거했습니다.보고 해 주셔서 감사합니다.)
MatPag

2
이것은이 실제로 예상되는 직접 웹뷰에서 다운로드를 시작할 것이다 완벽한 해답 ... 감사입니다
Ghanshyam Bagul

@Jawaad이 네이티브 안드로이드 코드를 어디에 넣어야하는지 설명해 주시겠습니까? 나는 네이티브로 컴파일되는 Xamarin.forms로 작업하며 일반적으로 네이티브 코드를 건드리지 않지만 여기서는 필수 입니다. TYIA.
s3c

20
    mwebView.setDownloadListener(new DownloadListener()
   {

  @Override  


   public void onDownloadStart(String url, String userAgent,
        String contentDisposition, String mimeType,
        long contentLength) {

    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.setDescription("Downloading file...");


    request.setTitle(URLUtil.guessFileName(url, contentDisposition,
            mimeType));


    request.allowScanningByMediaScanner();


    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalPublicDir(
            Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(
                    url, contentDisposition, mimeType));
    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    dm.enqueue(request);
    Toast.makeText(getApplicationContext(), "Downloading File",
            Toast.LENGTH_LONG).show();
}});

당신이 쓴 것을 설명하십시오. 코드만으로는 충분하지 않습니다
Saveen

1
쿠키 설정으로 하루가 절약되었습니다! 감사!
francisco_ssb

이것은 받아 들여진 대답이어야합니다. 당신은 버디 감사
수르야 레디에게

웹보기를 사용하여 Digi-Locker에서 문서를 다운로드하고 있지만 동일한 코드 스 니펫을 사용하여 다운로드에 실패합니다. 파일 형식은 pdf입니다. 누구든지 나를 도울 수 있습니까?
Ashish Patel

15

원하는 모든 것을 다운로드하고 시간을 절약 할 수있는 다운로드 관리자를 사용해보십시오.

옵션을 확인하십시오.

옵션 1->

 mWebView.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
 Request request = new Request(
                            Uri.parse(url));
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
                    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                    dm.enqueue(request);        

        }
    });

옵션 2->

if(mWebview.getUrl().contains(".mp3") {
 Request request = new Request(
                        Uri.parse(url));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
// You can change the name of the downloads, by changing "download" to everything you want, such as the mWebview title...
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);        

    }

1

당신이 경우 다운로드 관리자를 사용하지 않으려면 다음이 코드를 사용할 수 있습니다

webView.setDownloadListener(new DownloadListener() {

            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition
                    , String mimetype, long contentLength) {

                String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);

                try {
                    String address = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
                            + Environment.DIRECTORY_DOWNLOADS + "/" +
                            fileName;
                    File file = new File(address);
                    boolean a = file.createNewFile();

                    URL link = new URL(url);
                    downloadFile(link, address);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

 public void downloadFile(URL url, String outputFileName) throws IOException {

        try (InputStream in = url.openStream();
             ReadableByteChannel rbc = Channels.newChannel(in);
             FileOutputStream fos = new FileOutputStream(outputFileName)) {
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        }
           // do your work here

    }

이렇게하면 휴대폰 저장소의 다운로드 폴더에 파일이 다운로드됩니다. 백그라운드에서 다운로드하려는 경우 스레드를 사용할 수 있습니다 (thread.alive () 및 타이머 클래스를 사용하여 다운로드가 완료되었는지 여부를 알 수 있음). 다운로드 직후 다음 작업을 수행 할 수 있으므로 작은 파일을 다운로드 할 때 유용합니다.


0
webView.setDownloadListener(new DownloadListener()
        {
            @Override
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimeType,
                                        long contentLength) {
                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.setDescription("Downloading File...");
                request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(
                        Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(
                                url, contentDisposition, mimeType));
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
            }});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.