2017-11-15 22 views
0

私はWebViewでアプリケーションを持っており、ファイルをダウンロードしようとしています。 私はファイルをダウンロードしたいだけで、ダウンロードするだけでWebView Appの中にいる必要はありません。私はウェブでいくつかのコードを検索しますが、これについてはあまり見つけられません。webviewコンポーネントを使用してアプリケーションでファイルをダウンロードするにはどうすればよいですか?

これは、(WebViewのがフラグメントである)私のWebViewのである:

public class Example extends Fragment { 

public WebView myWebView; 

private ProgressBar prg; 

SwipeRefreshLayout mySwipeRefreshLayout; 


public static Example newInstance() { 
    Example fragment = new Example(); 
    return fragment; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View rootView = inflater.inflate(R.layout.pagina_principal_layout, container, false); 
    myWebView = (WebView) rootView.findViewById(R.id.paginaPrincipalWebView); 
    myWebView.loadUrl("http://example.com/"); 
    prg = (ProgressBar)rootView.findViewById(R.id.progressBar2); 
    mySwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipelayout); 

    //Esconder barra deslizante lateral de navegação Web. 
    myWebView.setVerticalScrollBarEnabled(false); 


    //*Ativar JavaScript 
    WebSettings webSettings = myWebView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 


    //*Forçar links para abrir no WebView ao invés do navegador 
    myWebView.setWebViewClient(new WebViewClient()); 


    //Forçar links para abrir no WebView ao invés do navegador. 
    mySwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      myWebView.reload(); 
      mySwipeRefreshLayout.setRefreshing(false); 
     } 
    }); 


    //*Voltar histórico ao pressionar botão "voltar" 
    myWebView.setOnKeyListener(new View.OnKeyListener() 
    { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) 
     { 
      if(event.getAction() == KeyEvent.ACTION_DOWN) 
      { 
       WebView webView = (WebView) v; 

       switch(keyCode) 
       { 
        case KeyEvent.KEYCODE_BACK: 
         if(webView.canGoBack()) 
         { 
          webView.goBack(); 
          return true; 
         } 
         break; 
       } 
      } 

      return false; 
     } 
    }); 



    return rootView; 

} 

私はこのコードを試してみました:

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

このコードは、ブラウザを開いて、そこからダウンロードを行います。このコードの問題は、ダウンロードが開始された後、ダウンロードが失敗したことです。

+0

あなたのブラウザにURLを直接置くとファイルをダウンロードできますか? – diegoveloper

+0

いいえ、ブラウザでもダウンロードできません。サーバーにエラーがあるようです。私のせいで、私はここで尋ねる前にテストしておくべきだった。しかし、機会を取ることで、WebViewアプリ内でダウンロードが可能かどうかを知ることができますか? –

+0

はい、私は答えを入れます – diegoveloper

答えて

2

は、私はあなたのWebView内のファイルをダウンロードしたい場合、あなたはこれを試してみてください、言ったように:

myWebView.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); 
     request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name of your file"); 
     DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     dm.enqueue(request); 
     //you could show a message here 

    } 
}); 

は、マニフェストにこの権限を追加することを忘れないでください :

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

Android> 5を使用している場合は、許可を求める必要があります。

リンク:https://developer.android.com/training/permissions/requesting.html

+0

私はダウンロードボタンを押すと、アプリケーションがクラッシュします。私はこの行: "DownloadManager dm =(DownloadManager)getSystemService(DOWNLOAD_SERVICE);" webviewはフラグメントなので、getSystemServiceの前に "getActivity()"を入れます。 –

+0

エラーを表示するにはログ – diegoveloper

+0

"java.lang.SecurityException:あなたのファイルの/ storage/emulated/0/Download/nameに書き込む権限がありません:ユーザ10080も現在のプロセスもandroid.permission.WRITE_EXTERNAL_STORAGEを持っていません。 私はAndroid Manifestにこれを入れています:

関連する問題