Обрабатывать загрузку MP3 вручную в WebView - PullRequest
1 голос
/ 02 сентября 2011

У меня есть этот фрагмент кода, в котором я хочу обработать загрузку файла, по которому щелкают:

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


        }
        return false;

Хотя я понятия не имею, как обрабатывать загрузки в Android, у кого-то есть фрагмент кода, который я могу использовать для загрузки файла в фоновом режиме в папку ... папка загрузки в порядке. Спасибо.

1 Ответ

1 голос
/ 02 сентября 2011

Для какой версии андроида вы создаете?

Начиная с API lvl 9, существует DownloadManager , который может справиться с этим для вас.Если это вообще возможно, вы должны использовать DownloadManager, потому что он будет автоматически обрабатывать прерывания сети и возобновлять загрузку для вас.

Если вы стремитесь к более низкому уровню API, чем то, что вам придется делать код загрузки самостоятельно,У вас будет 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) Разница в том, что эти операторы печатаются в файл журнала (который вы можете увидеть в перспективе DDMS в eclipse), и у них есть дополнительный параметр, называемый «тег», который вы можете передатьэто любая строка, которая вам нравится, и эта строка будет отображаться вдоль стороны вашего текста в файле журнала.Вы также можете отфильтровать вывод журнала на основе этих тегов в перспективе DDMS.Обычной практикой является объявление вашего тега в качестве статической строки, чтобы вы могли просто использовать эту ссылку на него для всех своих операторов журнала, и у вас всегда будет один и тот же тег.Поэтому, если вы добавите что-то подобное в ваш класс, это должно исправить вашу ошибку:

final static String myTag = "NameOfYourActivity";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...