2014-09-03 79 views

回答

2
import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ProgressBar; 

public class MainActivity extends Activity { 

    private ProgressBar bar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     bar=(ProgressBar)findViewById(R.id.progressBar1); 
     new DownloadFileFromURL().execute("http://hrdevcontentapi.spanunit.com/000132/538/HCDocument/the_hatha_yoga_pradipika.docx"); 

    } 

    /** 
    * Background Async Task to download file 
    * */ 
    class DownloadFileFromURL extends AsyncTask<String, String, String> { 

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

     /** 
     * 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.docx"); 

       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 
      bar.setProgress(Integer.parseInt(progress[0])); 
     } 

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

      File targetFile = new File("/sdcard/downloadedfile.docx"); 
      Uri targetUri = Uri.fromFile(targetFile); 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(targetUri, "application/*"); 
      startActivityForResult(intent, 100); 
     } 

    } 
} 

这是活性。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.test.MainActivity" > 

    <ProgressBar 
     android:id="@+id/progressBar1" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" /> 

</RelativeLayout> 

这是activity_main.xml中

不要忘了添加以下权限:

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

详情检查此链接:http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/

+0

如何在onPostExecute中打开下载的.docx文件... – Deva 2014-09-03 10:42:42

0

尝试使用DownloadManager,这是非常容易使用,善于长时间运行的下载任务。

+0

任何参考链接.. – Deva 2014-09-03 10:00:26

+0

是应该在评论? – MilapTank 2014-09-03 10:00:27

0
import java.io.FileInputStream; 

import android.app.Activity; 
import android.app.DownloadManager; 
import android.app.DownloadManager.Request; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.ParcelFileDescriptor; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.widget.ImageView; 

public class Test extends Activity 
{ 
private static final String DL_ID = "downloadId"; 
private SharedPreferences prefs; 
private DownloadManager dm; 
private ImageView imageView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    imageView = new ImageView(this); 
    setContentView(imageView); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    dm = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); 
} 
@Override 
public void onResume() { 
    super.onResume(); 
    if(!prefs.contains(DL_ID)) { 
     Uri resource = Uri.parse("http://asdf.com/big.jpg"); 
     DownloadManager.Request request = new DownloadManager.Request(resource); 
     request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI); 
     request.setAllowedOverRoaming(false); 
     request.setTitle("Download Sample"); 
     long id = dm.enqueue(request); 
     prefs.edit().putLong(DL_ID, id).commit(); 
    } else { 
     queryDownloadStatus(); 
    } 
    registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
} 
@Override 
public void onPause() { 
    super.onPause(); 
    unregisterReceiver(receiver); 
} 
private BroadcastReceiver receiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
    queryDownloadStatus(); 
} 
}; 
private void queryDownloadStatus() { 
    DownloadManager.Query query = new DownloadManager.Query(); 
    query.setFilterById(prefs.getLong(DL_ID, 0)); 
    Cursor c = dm.query(query); 
    if(c.moveToFirst()) { 
    int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
    Log.d("DM Sample","Status Check: "+status); 
    switch(status) { 
    case DownloadManager.STATUS_PAUSED: 
    case DownloadManager.STATUS_PENDING: 
    case DownloadManager.STATUS_RUNNING: 
     break; 
    case DownloadManager.STATUS_SUCCESSFUL: 
     try { 
     ParcelFileDescriptor file = dm.openDownloadedFile(prefs.getLong(DL_ID, 0)); 
     FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(file); 
     imageView.setImageBitmap(BitmapFactory.decodeStream(fis)); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
     break; 
    case DownloadManager.STATUS_FAILED: 
     dm.remove(prefs.getLong(DL_ID, 0)); 
     prefs.edit().clear().commit(); 
     break; 
    } 
    } 
} 

}

Ckeck Out This Link

+0

我想下载.docx文件。 – Deva 2014-09-03 10:08:56

+0

更改Uri resource = Uri.parse(“http://asdf.com/big.jpg”);到你的链接 – 2014-09-03 10:11:18