2013-06-13 6 views
8

Voglio scaricare il file (come .mp3) dal sito web usando la webview ma il problema è che Ogni volta che tocco il link, si aprirà il browser (quello predefinito) Che è appare per un secondo prima che si chiuda. e nessun file è stato scaricato.Come posso scaricare il file usando la webview? (questo caso è strano)

Ecco il mio codice,

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.webkit.WebChromeClient; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.webkit.DownloadListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Main extends Activity { 
WebView webview; 
Button bt_search; 
TextView txt_search; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    webview = (WebView) findViewById(R.id.webView); 
    webview.setWebChromeClient(new WebChromeClient()); 
    webview.getSettings().setJavaScriptEnabled(true); 
    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); 
     } 
    }); 
    txt_search = (TextView) findViewById(R.id.song); 
    webview.loadUrl("http://www.google.com"); 
    bt_search = (Button) findViewById(R.id.findit); 
    bt_search.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      String keyword = txt_search.getText().toString().trim(); 
      if (!keyword.equals("")) { 
       webview.loadUrl("MP3 Sites" + keyword + ".html"); 
    } 
    } 
}); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

    } 
+0

È inoltre possibile utilizzare questo 'sottoclasse Webview' in cui il download di file sono gestite automaticamente: https://github.com/delight-im/Android-AdvancedWebView – caw

risposta

9

implementare un WebViewClient da utilizzare con il WebView. In esso, ignora il metodo shouldOverrideUrlLoading, in cui devi verificare se si tratta di un file mp3 e quindi passare quell'URL allo DownloadManager o qualsiasi altra cosa tu stia utilizzando per scaricare effettivamente il file. Ecco un'idea approssimativa:

// 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 
    } 
    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading (WebView view, String url) { 
      boolean shouldOverride = false; 
      // We only want to handle requests for mp3 files, everything else the webview 
      // can handle normally 
      if (url.endsWith(".mp3")) { 
       shouldOverride = true; 
       Uri source = Uri.parse(url); 

       // Make a new request pointing to the mp3 url 
       DownloadManager.Request request = new DownloadManager.Request(source); 
       // Use the same file name for the destination 
       File destinationFile = new File (destinationDir, source.getLastPathSegment()); 
       request.setDestinationUri(Uri.fromFile(destinationFile)); 
       // Add it to the manager 
       manager.enqueue(request); 
      } 
      return shouldOverride; 
     } 
    }); 
+0

Grazie così molto per la risposta, ma se ti dispiace, per favore dammi un esempio di quel metodo. Sono letteralmente novizio in Java. –

+0

Ho aggiunto un esempio di codice rilevante. – Krylez

+1

@Krylez è un file di downloding ma ho un problema che nel mio testpdf.php contiene file pdf e quando rogo url come http://www.tttt.co/testpdf.php file allora non è download file pdf ma download testpdf file .php in modo che possa aiutarmi a scaricare il file pdf – CoronaPintu

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

    } 
+0

Grazie mille funziona come un fascino .. –