마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

웹뷰에서 다운로드를 하면 어플이 종료되는이유?

0 추천
웹뷰에서 다운로드를 하면 어플이 종료되는이유?

웹뷰에서 다운로드 버튼을 누르면 다운로드가 되려면 코드를 또 따로 뭐 해줘야한다길래

인터넷에있는 코드를 복붙해왔는댕 파일 다운로드만 누르면 에뮬레이터에서 자꾸 어플이 종료됩니당.

제가 안드로이드를 공부하는 학생인지라 뭘 잘못했을까요?

권한은     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

이렇게 줬습니다.

 

코드는 아래에

 

import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.DownloadListener;
import android.webkit.URLUtil;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import android.graphics.Bitmap;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    // Button btn;
    // TextView txt;
    WebView wv;
    ProgressBar progressBar;
    String url = "https://www.naver.com/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // btn = (Button) findViewById(R.id.button);
        // txt = (TextView) findViewById(R.id.editText);
        wv = (WebView) findViewById(R.id.webView);
        progressBar = (ProgressBar) findViewById(R.id.pgr);
        // wv.setWebViewClient(new MyBrowser());

        wv.setWebViewClient(new myWebClient());
        wv.getSettings().setJavaScriptEnabled(true);
        wv.getSettings().setBuiltInZoomControls(true);
        wv.getSettings().setDisplayZoomControls(false);
        wv.loadUrl(url);

        // This will handle downloading. It requires Gingerbread, though
        final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

        // This is where downloaded files will be written, using the package name isn't required
        // but it's a good way to communicate who owns the directory
        final File destinationDir = new File (Environment.getExternalStorageDirectory(), getPackageName());
        if (!destinationDir.exists()) {
            destinationDir.mkdir(); // Don't forget to make the directory if it's not there
        }
        wv.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);
                //------------------------COOKIE!!------------------------
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie", cookies);
                //------------------------COOKIE!!------------------------
                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();
            }
        });

    }

 

    public  class myWebClient extends WebViewClient{

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            progressBar.setVisibility(View.VISIBLE);
            view.loadUrl(url);
            return true;

        }

        @Override
        public void onPageFinished(WebView view, String url) {

            super.onPageFinished(view, url);

            progressBar.setVisibility(View.GONE);
        }

    }

}
길가던분 (170 포인트) 님이 2018년 11월 2일 질문

1개의 답변

0 추천
 
채택된 답변
sdk23이상이시면 동적권한할당이 없어서 그런게 아닐까 의심해봅니다. 23버전 이상부터는 manifest에 권한 추가로는 안되고 자바 코드상에서 동적으로 권한을 부여받아야 합니다.
익명사용자 님이 2018년 11월 3일 답변
길가던분님이 2018년 11월 7일 채택됨
...