2014-02-18 4 views
10

Мой код ниже загружает страницу URL-адреса в порядке и после поиска песни, когда я нажимаю на ссылку для загрузки, она вылетает. Существует не так много учебников о том, как заставить диспетчер загрузки работать с веб-просмотром. Что я делаю не так?Как скачать файлы с веб-браузера Android?

import java.io.File; 
import android.app.Activity; 
import android.app.DownloadManager; 
import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 


public class List1 extends Activity { 

     WebView ourBrow; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Use a custom layout file 
     setContentView(R.layout.list1); 

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

    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 
    } 

     ourBrow = (WebView) findViewById(R.id.wvBrowser); 
     ourBrow.getSettings().setJavaScriptEnabled(true); 
     ourBrow.setInitialScale(50); 
     ourBrow.getSettings().setUseWideViewPort(true); 
     ourBrow.setVerticalScrollBarEnabled(false); 
     ourBrow.setHorizontalScrollBarEnabled(false); 
     ourBrow.loadUrl("http://www.degjo.com"); 



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





    } 
} 

LogCat

02-18 19:45:44.891: E/AndroidRuntime(357): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:408) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.content.ContentResolver.insert(ContentResolver.java:604) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.app.DownloadManager.enqueue(DownloadManager.java:750) 
02-18 19:45:44.891: E/AndroidRuntime(357): at com.example.androidbuttonsactivities.List1$1.shouldOverrideUrlLoading(List1.java:78) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.os.Looper.loop(Looper.java:123) 
02-18 19:45:44.891: E/AndroidRuntime(357): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-18 19:45:44.891: E/AndroidRuntime(357): at java.lang.reflect.Method.invokeNative(Native Method) 
02-18 19:45:44.891: E/AndroidRuntime(357): at java.lang.reflect.Method.invoke(Method.java:507) 
02-18 19:45:44.891: E/AndroidRuntime(357): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-18 19:45:44.891: E/AndroidRuntime(357): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-18 19:45:44.891: E/AndroidRuntime(357): at dalvik.system.NativeStart.main(Native Method) 
02-18 19:45:48.401: I/Process(357): Sending signal. PID: 357 SIG: 9 
+0

Что говорит логарифм о крушении? –

ответ

14

Возможно, это будет зависеть от проблемы с версией сборки для Android, приведенный ниже код будет успешно работать в версиях 2.3+, проверьте это,

ourBrow.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, 
      String description, String failingUrl) { 
       Log.d("WEB_VIEW_TEST", "error code:" + errorCode + " - " + description); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       // handle different requests for different type of files 
       // this example handles downloads requests for .apk and .mp3 files 
       // everything else the webview can handle normally 
       if (url.endsWith(".apk")) { 
        Uri source = Uri.parse(url); 
        // Make a new request pointing to the .apk url 
        DownloadManager.Request request = new DownloadManager.Request(source); 
        // appears the same in Notification bar while downloading 
        request.setDescription("Description for the DownloadManager Bar"); 
        request.setTitle("YourApp.apk"); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
         request.allowScanningByMediaScanner(); 
         request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
        } 
        // save the file in the "Downloads" folder of SDCARD 
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "SmartPigs.apk"); 
        // get download service and enqueue file 
        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
        manager.enqueue(request); 
       } 
       else if(url.endsWith(".mp3")) { 
        // if the link points to an .mp3 resource do something else 
       } 
       // if there is a link to anything else than .apk or .mp3 load the URL in the webview 
       else view.loadUrl(url); 
       return true;     
     } 
    }); 
+0

соты, allowScanningByMediaScanner и VISIBILITY_VISIBLE_NOTIFY_COMPLETED не могут быть решены. Я тестирую приложение на моей версии эмулятора 2.3.3, должен ли я создать какую-то папку для загрузки, чтобы это работало? –

+0

Не нужно создавать папку для скачивания .. она будет загружаться точно. попробуйте с эмулятором более высоких версий, иначе измените файл манифеста min sdk на последний и попробуйте – Brendon

1

Вы добавили DownloadManager разрешение в вашем файле манифеста?

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

----- EDIT -----

Я копирую некоторый фрагмент кода для справки из Android фондового браузера при запуске задачи загрузки:

import android.net.WebAddress; 

// java.net.URI is a lot stricter than KURL so we have to encode some 
// extra characters. Fix for b 2538060 and b 1634719 
WebAddress webAddress; 
try { 
    webAddress = new WebAddress(url); 
    webAddress.setPath(encodePath(webAddress.getPath())); 
} catch (Exception e) { 
    // This only happens for very bad urls, we want to chatch the 
    // exception here 
    Log.e(LOGTAG, "Exception trying to parse url:" + url); 
    return; 
} 

String addressString = webAddress.toString(); 
Uri uri = Uri.parse(addressString); 
final DownloadManager.Request request; 
try { 
    request = new DownloadManager.Request(uri); 
} catch (IllegalArgumentException e) { 
    Toast.makeText(activity, R.string.cannot_download, Toast.LENGTH_SHORT).show(); 
    return; 
} 
request.setMimeType(mimetype); 
// set downloaded file destination to /sdcard/Download. 
// or, should it be set to one of several Environment.DIRECTORY* dirs depending on mimetype? 
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); 
// let this downloaded file be scanned by MediaScanner - so that it can 
// show up in Gallery app, for example. 
request.allowScanningByMediaScanner(); 
request.setDescription(webAddress.getHost()); 
// XXX: Have to use the old url since the cookies were stored using the 
// old percent-encoded url. 
String cookies = CookieManager.getInstance().getCookie(url, privateBrowsing); 
request.addRequestHeader("cookie", cookies); 
request.addRequestHeader("User-Agent", userAgent); 
request.addRequestHeader("Referer", referer); 
request.setNotificationVisibility(
     DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
if (mimetype == null) { 
    if (TextUtils.isEmpty(addressString)) { 
     return; 
    } 
    // We must have long pressed on a link or image to download it. We 
    // are not sure of the mimetype in this case, so do a head request 
    new FetchUrlMimeType(activity, request, addressString, cookies, 
      userAgent).start(); 
} else { 
    final DownloadManager manager 
      = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); 
    new Thread("Browser download") { 
     public void run() { 
      manager.enqueue(request); 
     } 
    }.start(); 
} 
Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT) 
     .show(); 
+0

после добавления этого разрешения одно и то же произошло, снова разбился. –

+0

добавил также WRITE_EXTERNAL_STORAGE к моему манифесту. Теперь он не сбой, а просто показывает второе уведомление о загрузке и исчезает. –

+0

Это может помочь, если вы можете предоставить дополнительную информацию о logcat. например несколько строк перед первой строкой, которую вы опубликовали (чтобы мы могли точно знать, в чем проблема): '02-18 19: 45: 44.891: E/AndroidRuntime (357): at android.content.ContentProviderProxy.insert (ContentProviderNative .java: 408) ' –

1

попробовать это

mWebView.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); //Notify client once download is completed! 
     request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Name of your downloadble file goes here, example: Mathematics II "); 
     DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     dm.enqueue(request); 
     Toast.makeText(getApplicationContext(), "Downloading File", //To notify the Client that the file is being downloaded 
       Toast.LENGTH_LONG).show(); 

    } 
}); 

Также не забудьте добавить код ниже в файл manifest.xml, его очень важно, это даст ему разрешение сохранить на хранение, как и давая ему разрешение Интернет для weview.

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

Будет ли он автоматически загружать файл? Или нужен какой-то запуск? –

Смежные вопросы