如何在安卓系统中下载文件?

5
我想使用Android代码创建一个像下载管理器一样的应用程序来从URL下载内容,但我不知道如何开始。
谢谢任何帮助或视频教程。

1
这是什么类型的下载? - FabianCook
简单下载,类似于从URL下载PPT、PDF和图片。 - Shanaz K
你也可以查看这个链接:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html。 - Snehal Poyrekar
@ShanazK,你的目标 API 级别是什么? - Mohit
API 18 Android 4.3 @mohit - Shanaz K
好的,你选择了正确的答案 :) 第二个人给出的答案非常误导,所以我才问。 - Mohit
3个回答

2
这很简单。 http://developer.android.com/reference/android/app/DownloadManager.html 例如: http://androidtrainningcenter.blogspot.co.at/2013/05/android-download-manager-example.html
/**
 * Start Download
 */
public void startDownload() {
    DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    Request mRqRequest = new Request(
            Uri.parse("http://androidtrainningcenter.blogspot.in/2012/11/android-webview-loading-custom-html-and.html"));
    mRqRequest.setDescription("This is Test File");
//  mRqRequest.setDestinationUri(Uri.parse("give your local path"));
    long idDownLoad=mManager.enqueue(mRqRequest);
}

但请确保您的API版本至少为9


这对你来说很容易,但真的非常感谢,这太有帮助了,再次感谢 :) 我很感激。 - Shanaz K
如果我没记错的话,它不会产生NetworkOnMainThreadException吧? - Mohit
@mohit:为什么会出现那个异常? - JavaDM

1

这段代码可以从URL下载任何文件,只需替换URL和位置即可。

public class AndroidDownloadFileByProgressBarActivity extends Activity {

    // button to show progress dialog
    Button btnShowProgress

    // Progress Dialog
    private ProgressDialog pDialog;

    // Progress dialog type (0 - for Horizontal progress bar)
    public static final int progress_bar_type = 0;

    // File url to download
    private static String file_url = " u r l";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // show progress bar button
        btnShowProgress = (Button) findViewById(R.id.btnProgressBar);
        // Image view to show image after downloading
        my_image = (ImageView) findViewById(R.id.my_image);

        /**
         * Show Progress bar click event
         * */
        btnShowProgress.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // starting new Async Task
                new DownloadFileFromURL().execute(file_url);
            }
        });
    }


@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case progress_bar_type:
        pDialog = new ProgressDialog(this);
        pDialog.setMessage("Downloading file. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setMax(100);
        pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pDialog.setCancelable(true);
        pDialog.show();
        return pDialog;
    default:
        return null;
    }
}


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

    /**
     * Before starting background thread
     * Show Progress Bar Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(progress_bar_type);
    }

    /**
     * Downloading file in background thread
     * */
    @Override
    protected String doInBackground(String... f_url) {
        int count;
        try {
            URL url = new URL(f_url[0]);
            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);

            // Output stream to write file
            OutputStream output = new FileOutputStream("/sdcard/downloadedfile.jpg");

            byte data[] = new byte[1024];

            long total = 0;

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

                // writing data to file
                output.write(data, 0, count);
            }

            // flushing output
            output.flush();

            // closing streams
            output.close();
            input.close();

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

        return null;
    }

    /**
     * Updating progress bar
     * */
    protected void onProgressUpdate(String... progress) {
        // setting progress percentage
        pDialog.setProgress(Integer.parseInt(progress[0]));
   }

    /**
     * After completing background task
     * Dismiss the progress dialog
     * **/
    @Override
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after the file was downloaded
        dismissDialog(progress_bar_type);


    }

}

清单文件:
<!-- Permission: Allow Connect to Internet -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Permission: Writing to SDCard -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Download Button -->
    <Button android:id="@+id/btnProgressBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Download File with Progress Bar"
        android:layout_marginTop="50dip"/>



</LinearLayout>

如果您想发布完整的结果,请确保同时添加.xml值和.xml布局。 - JavaDM
真的我很想要这个,但到现在为止我还不知道它是否有效。谢谢,这正是我所想的 :) - Shanaz K

0

这是用于从URL下载图像的Java代码,您也可以将其与Android应用程序一起使用。

public static void main(String ar[]) throws IOException
        {
            URL url = new URL("http://zeroturnaround.com/wp-content/uploads/2013/06/no-button-640x480-sky.jpg");
            InputStream ios= url.openStream();

               OutputStream fou1=new FileOutputStream("/home/delta/Desktop/image.jpg");
               byte[] b=new byte[2048]; 
               int length;
               while((length=ios.read(b))!=-1)
               {
                   fou1.write(b,0,length);

               }
               //fio1.close();
               fou1.close();

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接