2013-06-13 8 views
8

Chcę pobrać plik (np. .mp3) ze strony internetowej przy użyciu widoku przeglądarki , ale problem jest taki, że po każdym kliknięciu łącza otworzy się przeglądarka (domyślna) Która jest pojawią się na sekundę, zanim się zamkną. i nie pobrano żadnego pliku.Jak mogę pobrać plik za pomocą webview? (ten przypadek jest dziwny)

Oto mój kod,

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

Można również skorzystać z tej 'Webview' podklasę gdzie pliki do pobrania plików są obsługiwane automatycznie: https://github.com/delight-im/Android-AdvancedWebView – caw

Odpowiedz

9

Wdrożenie WebViewClient korzystać z WebView. Zastąp w nim metodę shouldOverrideUrlLoading, w której należy sprawdzić, czy jest to plik mp3, a następnie przekazać ten adres URL do DownloadManager lub cokolwiek, czego faktycznie używasz do pobrania pliku. Oto grubsza:

// 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

Dziękuję wiele na odpowiedź, ale jeśli masz coś przeciwko, daj mi przykład tej metody. Jestem dosłownie nowicjuszem w Javie. –

+0

Dodałem odpowiedni przykładowy kod. – Krylez

+1

@Krylez to plik downloding, ale mam jeden problem, który w moim pliku testpdf.php zawiera plik pdf, a kiedy spycham URL jak plik http://www.tttt.co/testpdf.php, to nie jest to plik pdf, ale pobieranie testpdf Plik .php, więc może mi pomóc Chcę pobrać plik 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

Wielkie dzięki, że działa jak urok .. –

Powiązane problemy