如何在android中下载所有文件并将所有文件保存在SD卡中?

时间:2013-02-26 12:01:57

标签: android listview download android-asynctask

在我的情况下,我在下载所有文件时单击下载按钮但显示所有文件sdcard和一些文件显示。我在我的代码中使用了线程。我的错误:取消(cl)按钮工作,但在我使用的删除下载文件不起作用,{cl和dl按钮} setVisibitly没有改变。我的代码如下:请帮助>

        mainDownloadBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                adtf.setAllDownload();
            }
        });

    }

    public class MyListAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        ProgressBar pr;
        ProgressBar[] prArray = new ProgressBar[list.size()];
        Button cl, dl;
        ImageView im;
        DownloadFileFromURL downloadFileFromURL;

        public MyListAdapter(Context context) {
            mInflater = LayoutInflater.from(context);

        }

        public int getCount() {
            return list.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public void setAllDownload() {
            if (prArray.length > 0) {
                for (int i = 0; i < prArray.length; i++) {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    downloadFileFromURL = new DownloadFileFromURL(dl, cl);
                    downloadFileFromURL.execute(pr, list.get(i).url_video, i);
                }
            }
        }

        public View getView(final int position, View convertView,
                ViewGroup parent) {

            convertView = mInflater.inflate(R.layout.custome_list_view, null);
            cl = (Button) convertView.findViewById(R.id.cancle_sedual);
            dl = (Button) convertView.findViewById(R.id.download_sedual);
            pr = (ProgressBar) convertView.findViewById(R.id.listprogressbar);
            prArray[position] = pr;
            im = (ImageView) convertView.findViewById(R.id.list_image);
            im.setImageResource(list.get(position).images[position]);
            getProgress(pr, position, cl, dl);
            // pr.setProgress(getItem(position));
            cl.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Log.v("log_tag","Cancle Button Click");
                //  dl.setVisibility(View.VISIBLE);

                    dl.setVisibility(View.VISIBLE);

                    cl.setVisibility(View.GONE);
                    downloadFileFromURL = new DownloadFileFromURL(dl, cl);
                    //downloadFileFromURL.cancel(true);
                    downloadFileFromURL.downloadFile();
                    pr.setProgress(0);
                }
            });


            dl.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    str_start = list.get(position).url_video;
                    dl.setVisibility(View.GONE);
                    cl.setVisibility(View.VISIBLE);
                    Log.v("log_tag","Start Button Click ");
                    //
                    // new DownloadFileFromURL().execute(str_start);
                    downloadFileFromURL = new DownloadFileFromURL(dl, cl);
                    downloadFileFromURL.execute(pr, str_start, position);
                }
            });

            return convertView;
        }
    }

    class DownloadFileFromURL extends AsyncTask<Object, String, Integer> {

        int count = 0;
        ProgressDialog dialog;
        ProgressBar progressBar;
        int myProgress;
        int position;
        Button start, cancel;
        boolean download1 = false;

        public DownloadFileFromURL(Button start, Button cancel) {
            this.start = start;
            this.cancel = cancel;
        }

        /**
         * Before starting background thread Show Progress Bar Dialog
         * */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            ProgressBar progressBar;
            download1 = true;

        }
        public void downloadFile() {
            this.download1 = false;

        }
        @Override
        protected void onCancelled() {
            super.onCancelled();

        }

        /**
         * Downloading file in background thread
         * */
        @Override
        protected Integer doInBackground(Object... params) {
            //Log.v("log_tag", "params  :::; " + params);
            int count;
            progressBar = (ProgressBar) params[0];
            position = (Integer) params[2];
            try {
                // URL url = new URL(f_url[0]);
                URL url = new URL((String) params[1]);
                //Log.v("log_tag", "name  ::: " + url);
                name = ((String) params[1]).substring(((String) params[1])
                        .lastIndexOf("/") + 1);
                //Log.v("log_tag", "name Substring ::: " + name);
                URLConnection conection = url.openConnection();
                conection.connect();
                // getting file length
                int lenghtOfFile = conection.getContentLength();

                // input stream to read file - with 8k buffer
                InputStream input = new BufferedInputStream(url.openStream(),
                        8192);
                download = new File(Environment.getExternalStorageDirectory()
                        + "/download/");
                if (!download.exists()) {
                    download.mkdir();
                }
                String strDownloaDuRL = download + "/" + name;
                Log.v("log_tag", " down url   " + strDownloaDuRL);
                FileOutputStream output = new FileOutputStream(strDownloaDuRL);

                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    if (this.download1) {
                    total += count;
                    // publishing the progress....
                    // After this onProgressUpdate will be called
                    // publishProgress("" + (int) ((total * 100) /
                    // lenghtOfFile));

                    // writing data to file
                    progressBar
                            .setProgress((int) ((total * 100) / lenghtOfFile));
                    output.write(data, 0, count);
                    setProgress(progressBar, position, start, cancel, this);
                }
                }
                // flushing output
                output.flush();
                 if(!this.download1){
                        File delete = new File(strDownloaDuRL);
                        delete.delete();
                        }  
                // closing streams
                output.close();
                input.close();

            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
            return 0;

        }

        /**
         * Updating progress bar
         * */
        protected void onProgressUpdate(String... values) {

            super.onProgressUpdate(values);
        //  Log.v("log_tag", "progress :: " + values);
            // setting progress percentage
            // pDialog.setProgress(Integer.parseInt(progress[0]));
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {

            Log.v("log", "login  ::: 4::: " + download);
            String videoPath = download + "/" + name;
            String chpName = name;
            Log.v("log_tag", "chpName  ::::" + chpName + "  videoPath "
                    + videoPath);
            db.execSQL("insert into videoStatus (chapterNo,videoPath) values(\""
                    + chpName + "\",\"" + videoPath + "\" )");

        }

    }

    private void setProgress(final ProgressBar pr, final int position,
            final Button Start, final Button cancel,
            final DownloadFileFromURL downloadFileFromURL) {
        ProgressBarSeek pbarSeek = new ProgressBarSeek();
        pbarSeek.setPosition(position);
        pbarSeek.setProgressValue(pr.getProgress());
        //Log.v("log_tag", position + "  progress  " + pr.getProgress());
        progreeSeekList.add(pbarSeek);
    /*  cancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.v("log_tag","Cancle Button Click Set progress");
                Start.setVisibility(View.VISIBLE);
                cancel.setVisibility(View.GONE);
                downloadFileFromURL.cancel(true);
                pr.setProgress(0);
            }
        });
        Start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.v("log_tag","Start Button Click set Progress");
                str_start = list.get(position).url_video;
                Start.setVisibility(View.GONE);
                cancel.setVisibility(View.VISIBLE);
                Log.v("log_tag", "str_start  " + str_start);
                //
                // new DownloadFileFromURL().execute(str_start);
                DownloadFileFromURL downloadFileFromU = new DownloadFileFromURL(
                        Start, cancel);
                downloadFileFromU.execute(pr, str_start, position);
            }
        });*/
    }

    private void getProgress(ProgressBar pr, int position, Button cl, Button dl) {
        if (progreeSeekList.size() > 0) {
            for (int j = 0; j < progreeSeekList.size(); j++) {
                if (position == progreeSeekList.get(j).getPosition()) {
                    pr.setProgress(progreeSeekList.get(j).getProgressValue());
                    dl.setVisibility(View.GONE);
                    cl.setVisibility(View.VISIBLE);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以尝试使用以下代码从网址下载文件并保存到SD卡中:

public void DownloadFromUrl(String DownloadUrl, String fileName) {
  try {
       File root = android.os.Environment.getExternalStorageDirectory();  
       File dir = new File (root.getAbsolutePath() + "/xmls");
       if(dir.exists()==false) {
            dir.mkdirs();
       }

       URL url = new URL(DownloadUrl); //you can write here any link
       File file = new File(dir, fileName);

       long startTime = System.currentTimeMillis();
       Log.d("DownloadManager", "download url:" + url);

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

       /*
        * Define InputStreams to read from the URLConnection.
        */
       InputStream is = ucon.getInputStream();
       BufferedInputStream bis = new BufferedInputStream(is);

       /*
        * Read bytes to the Buffer until there is nothing more to read(-1).
        */
       ByteArrayBuffer baf = new ByteArrayBuffer(5000);
       int current = 0;
       while ((current = bis.read()) != -1) {
          baf.append((byte) current);
       }

       /* Convert the Bytes read to a String. */
       FileOutputStream fos = new FileOutputStream(file);
       fos.write(baf.toByteArray());
       fos.flush();
       fos.close();
       Log.d("DownloadManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
  } catch (IOException e) {
   Log.d("DownloadManager", "Error: " + e);
  }
 }

另请注意,您在清单文件中指定了以下权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
 <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

我希望它会对你有所帮助。

由于