4

ユーザーは、WebView を介してアプリケーション内のモバイル ページにログインします。次のコードを使用して、WebView リクエストからダウンロード可能なリソースをキャプチャし、インテントとして渡します。

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

エミュレーターでは、これにより実際に Android ブラウザーが開き、ユーザーに再度ログインするように求められ、その時点でファイルのダウンロードが開始されます。

ユーザーが再度ログインする必要がないように、代わりに WebView から直接ダウンロードを開始する方法はありますか? デフォルトでは、この DownloadListener を追加しないと何も起こりません。

理想的には、ファイルがダウンロードされたら、ファイルに対してインテントを起動したいので、ユーザーが PDF ビューアーを持っている場合はすぐに切り替えます。

4

2 に答える 2

2

ダウンロード リスナーを実装して Cookie を渡すことで、この問題を解決します。

this.setDownloadListener(new DownloadListener() {

        public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition, String mimetype,
                                    long len) {
            if ( null != url && (url.endsWith(".pdf") || url.endsWith(".pptx"))) {
                Uri source = Uri.parse(url);
                int lastSEP = url.lastIndexOf("//");
                String DL_to_filename = url.substring( lastSEP+1 );
                DownloadManager.Request request = new DownloadManager.Request(source);
                request.setDescription("requested " + url +" downloading");
                request.setTitle(DL_to_filename);
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie", cookies);
                request.addRequestHeader("User-Agent", userAgent);
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, DL_to_filename);
                request.setVisibleInDownloadsUi(true);
                request.setMimeType(mimetype);

                DownloadManager manager = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);                   

                manager.enqueue(request);
              }
        }
    });
于 2015-12-14T23:53:46.850 に答える