在WebView中手动处理MP3下载

时间:2011-09-02 19:03:11

标签: android android-webview

我有这段代码,我想处理被点击文件的下载:

else if (url.startsWith("http://rapahh.com/songs2/Music%20Promotion/Download/")) {


        }
        return false;

虽然我不知道如何在Android中处理下载,但是任何人都有一段代码我可以用来将文件在后台下载到文件夹..下载文件夹很好。感谢。

1 个答案:

答案 0 :(得分:1)

你在为什么版本的Android构建?

从API lvl 9开始,DownloadManager可以为您处理此问题。如果可能的话,你应该使用DownloadManager,因为它会自动处理网络中断并为你恢复下载。

如果您的目标是降低API lvl,那么您必须自己制作下载代码。你将有一个来自你的web源的inputStream和一个输出到本地文件的outputStream,你将遍历inputStream写入块,直到没有剩下的为止。 像这样:

try {

        URL url = new URL(URL); //URL of the video

        //Set our file to the correct path and name. 
        File file = new File(PATH + fileName);

        //keep the start time so we can display how long it took to the Log.
        long startTime = System.currentTimeMillis();
        Log.d(myTag, "download begining");
        //Log.d(myTag, "download url:" + url);
        Log.d(myTag, "downloaded file name:" + fileName);


        /* Open a connection to that URL. */
        URLConnection ucon = url.openConnection();

        // this will be useful so that you can show a tipical 0-100% progress bar
        int lenghtOfFile = ucon.getContentLength();

        Log.i(myTag, "Opened Connection");

        /************************************************
         * Define InputStreams to read from the URLConnection.
         ************************************************/
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        Log.i(myTag, "Got InputStream and BufferedInputStream");

        /************************************************
         * Define OutputStreams to write to our file.
         ************************************************/
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        Log.i(myTag, "Got FileOutputStream and BufferedOutputStream");

        /************************************************
         * Start reading the and writing our file.
         ************************************************/
        byte data[] = new byte[1024];
        long total = 0;
        int count;
        //loop and read the current chunk
        while ((count = bis.read(data)) != -1) {
            //Post our progress update back to the UI thread
            postProgress((int)(total*100/lenghtOfFile));

            //write this chunk
            total += count;
            bos.write(data, 0, count);
        }
        //Have to call flush or the video file can get corrupted and won't play correctly.
        bos.flush();
        bos.close();

        Log.d(myTag, "download ready in "
                + ((System.currentTimeMillis() - startTime))
                + " milisec");
    } catch (IOException e) {
        Log.d(myTag, "Error: " + e);
    }

您需要实施postProgress(int progress)方法来执行适合您的应用程序的任何操作,以告知用户完成下载的百分比。

编辑:

您可以注释掉日志以使其生效。我在调试时让它们保持打开状态,以便简化过程。日志语句,例如Log.i(String tag, String text) 类似于System.out.println(String txt)不同之处在于这些语句被打印到日志文件中(您可以在Eclipse中的DDMS透视图中看到)并且它们有一个名为“tag”的附加参数,您可以将它传递给您喜欢的任何字符串此字符串将显示在日志文件中文本的旁边。您还可以在DDMS透视图中过滤基于这些标记的日志输出。通常的做法是将您的标记声明为静态字符串,以便您可以对所有日志语句使用该标记,并保证始终具有相同的标记。因此,如果你向你的类添加这样的东西,它应该修复你的错误:

final static String myTag = "NameOfYourActivity";