android带进度的文件上传

简介:

http://blog.csdn.net/shinay/article/details/8472756


文章来自:http://toolongdidntread.com/android/android-multipart-post-with-progress-bar/


文件上传可能是一个比较耗时的操作,如果为上传操作带上进度提示则可以更好的提高用户体验,最后效果如下图:




项目源码:http://download.csdn.net/detail/shinay/4965230



这里只贴出代码,可根据实际情况自行修改。


[java]  view plain copy
  1. package com.lxb.uploadwithprogress.http;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.client.HttpClient;  
  7. import org.apache.http.client.methods.HttpPost;  
  8. import org.apache.http.entity.mime.content.FileBody;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10. import org.apache.http.protocol.BasicHttpContext;  
  11. import org.apache.http.protocol.HttpContext;  
  12. import org.apache.http.util.EntityUtils;  
  13.   
  14. import android.app.ProgressDialog;  
  15. import android.content.Context;  
  16. import android.os.AsyncTask;  
  17.   
  18. import com.lxb.uploadwithprogress.http.CustomMultipartEntity.ProgressListener;  
  19.   
  20. public class HttpMultipartPost extends AsyncTask<String, Integer, String> {  
  21.   
  22.     private Context context;  
  23.     private String filePath;  
  24.     private ProgressDialog pd;  
  25.     private long totalSize;  
  26.   
  27.     public HttpMultipartPost(Context context, String filePath) {  
  28.         this.context = context;  
  29.         this.filePath = filePath;  
  30.     }  
  31.   
  32.     @Override  
  33.     protected void onPreExecute() {  
  34.         pd = new ProgressDialog(context);  
  35.         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  36.         pd.setMessage("Uploading Picture...");  
  37.         pd.setCancelable(false);  
  38.         pd.show();  
  39.     }  
  40.   
  41.     @Override  
  42.     protected String doInBackground(String... params) {  
  43.         String serverResponse = null;  
  44.   
  45.         HttpClient httpClient = new DefaultHttpClient();  
  46.         HttpContext httpContext = new BasicHttpContext();  
  47.         HttpPost httpPost = new HttpPost("上传URL, 如:http://www.xx.com/upload.php");  
  48.   
  49.         try {  
  50.             CustomMultipartEntity multipartContent = new CustomMultipartEntity(  
  51.                     new ProgressListener() {  
  52.                         @Override  
  53.                         public void transferred(long num) {  
  54.                             publishProgress((int) ((num / (float) totalSize) * 100));  
  55.                         }  
  56.                     });  
  57.   
  58.             // We use FileBody to transfer an image  
  59.             multipartContent.addPart("data"new FileBody(new File(  
  60.                     filePath)));  
  61.             totalSize = multipartContent.getContentLength();  
  62.   
  63.             // Send it  
  64.             httpPost.setEntity(multipartContent);  
  65.             HttpResponse response = httpClient.execute(httpPost, httpContext);  
  66.             serverResponse = EntityUtils.toString(response.getEntity());  
  67.               
  68.         } catch (Exception e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.   
  72.         return serverResponse;  
  73.     }  
  74.   
  75.     @Override  
  76.     protected void onProgressUpdate(Integer... progress) {  
  77.         pd.setProgress((int) (progress[0]));  
  78.     }  
  79.   
  80.     @Override  
  81.     protected void onPostExecute(String result) {  
  82.         System.out.println("result: " + result);  
  83.         pd.dismiss();  
  84.     }  
  85.   
  86.     @Override  
  87.     protected void onCancelled() {  
  88.         System.out.println("cancle");  
  89.     }  
  90.   
  91. }  

[java]  view plain copy
  1. package com.lxb.uploadwithprogress.http;  
  2.   
  3. import java.io.FilterOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.OutputStream;  
  6. import java.nio.charset.Charset;  
  7.   
  8. import org.apache.http.entity.mime.HttpMultipartMode;  
  9. import org.apache.http.entity.mime.MultipartEntity;  
  10.   
  11. public class CustomMultipartEntity extends MultipartEntity {  
  12.   
  13.     private final ProgressListener listener;  
  14.   
  15.     public CustomMultipartEntity(final ProgressListener listener) {  
  16.         super();  
  17.         this.listener = listener;  
  18.     }  
  19.   
  20.     public CustomMultipartEntity(final HttpMultipartMode mode,  
  21.             final ProgressListener listener) {  
  22.         super(mode);  
  23.         this.listener = listener;  
  24.     }  
  25.   
  26.     public CustomMultipartEntity(HttpMultipartMode mode, final String boundary,  
  27.             final Charset charset, final ProgressListener listener) {  
  28.         super(mode, boundary, charset);  
  29.         this.listener = listener;  
  30.     }  
  31.   
  32.     @Override  
  33.     public void writeTo(OutputStream outstream) throws IOException {  
  34.         super.writeTo(new CountingOutputStream(outstream, this.listener));  
  35.     }  
  36.   
  37.     public static interface ProgressListener {  
  38.         void transferred(long num);  
  39.     }  
  40.   
  41.     public static class CountingOutputStream extends FilterOutputStream {  
  42.           
  43.         private final ProgressListener listener;  
  44.         private long transferred;  
  45.   
  46.         public CountingOutputStream(final OutputStream out,  
  47.                 final ProgressListener listener) {  
  48.             super(out);  
  49.             this.listener = listener;  
  50.             this.transferred = 0;  
  51.         }  
  52.   
  53.         public void write(byte[] b, int off, int len) throws IOException {  
  54.             out.write(b, off, len);  
  55.             this.transferred += len;  
  56.             this.listener.transferred(this.transferred);  
  57.         }  
  58.   
  59.         public void write(int b) throws IOException {  
  60.             out.write(b);  
  61.             this.transferred++;  
  62.             this.listener.transferred(this.transferred);  
  63.         }  
  64.     }  
  65.   
  66. }  

上面为两个主要的类,下面放一个调用的Activity

[java]  view plain copy
  1. package com.lxb.uploadwithprogress;  
  2.   
  3. import java.io.File;  
  4.   
  5. import com.lxb.uploadwithprogress.http.HttpMultipartPost;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14. import android.widget.Toast;  
  15.   
  16. public class MainActivity extends Activity implements OnClickListener {  
  17.       
  18.     private Context context;  
  19.       
  20.     private EditText et_filepath;  
  21.     private Button btn_upload;  
  22.     private Button btn_cancle;  
  23.       
  24.     private HttpMultipartPost post;  
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.           
  30.         context = this;  
  31.           
  32.         setContentView(R.layout.activity_main);  
  33.           
  34.         et_filepath = (EditText) findViewById(R.id.et_filepath);  
  35.         btn_upload = (Button) findViewById(R.id.btn_upload);  
  36.         btn_cancle = (Button) findViewById(R.id.btn_cancle);  
  37.        
  38.         btn_upload.setOnClickListener(this);  
  39.         btn_cancle.setOnClickListener(this);  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onClick(View v) {  
  44.         switch (v.getId()) {  
  45.         case R.id.btn_upload:  
  46.             String filePath = et_filepath.getText().toString();  
  47.             File file = new File(filePath);  
  48.             if (file.exists()) {  
  49.                 post = new HttpMultipartPost(context, filePath);  
  50.                 post.execute();  
  51.             } else {  
  52.                 Toast.makeText(context, "file not exists", Toast.LENGTH_LONG).show();  
  53.             }  
  54.             break;  
  55.         case R.id.btn_cancle:  
  56.             if (post != null) {  
  57.                 if (!post.isCancelled()) {  
  58.                     post.cancel(true);  
  59.                 }  
  60.             }  
  61.             break;  
  62.         }  
  63.           
  64.     }  
  65.       
  66. }  

当然,在Android中使用MultipartEntity类,必须为项目增加相应的jar包,httpmime-4.1.2.jar。


最后放上代码,工程里已包含jar。

地址:

http://download.csdn.net/detail/shinay/4965230





Android 下载文件 进度条显示

http://blog.csdn.net/rwyz1314/article/details/6798222


加入两个权限

一个是联网,另一个是读写SD卡

[html]  view plain copy print ?
  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  

下载地址是本人的另外一台主机,现在当服务器了,路径可以测试

http://210.30.12.1:8080/mp3/DJ.mp3

[java]  view plain copy print ?
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.io.RandomAccessFile;  
  8. import java.net.MalformedURLException;  
  9. import java.net.URL;  
  10. import java.net.URLConnection;  
  11.   
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15. import android.os.Handler;  
  16. import android.os.Message;  
  17. import android.util.Log;  
  18. import android.view.View;  
  19. import android.view.View.OnClickListener;  
  20. import android.widget.Button;  
  21. import android.widget.ProgressBar;  
  22. import android.widget.TextView;  
  23. import android.widget.Toast;  
  24.   
  25. public class FileDownProcessBarActivity extends Activity {  
  26.     /** Called when the activity is first created. */  
  27.     private static final String Path="http://210.30.12.1:8080/mp3/DJ.mp3";  
  28.     private ProgressBar progressBar;  
  29.     private TextView textView;  
  30.     private Button button;  
  31.     private int FileLength;  
  32.     private int DownedFileLength=0;  
  33.     private InputStream inputStream;  
  34.     private URLConnection connection;  
  35.     private OutputStream outputStream;  
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.         progressBar=(ProgressBar) findViewById(R.id.progressBar1);  
  41.         textView=(TextView) findViewById(R.id.textView2);  
  42.         button=(Button) findViewById(R.id.button1);  
  43.         button.setOnClickListener(new ButtonListener());  
  44.     }  
  45.     class ButtonListener implements OnClickListener{  
  46.   
  47.         @Override  
  48.         public void onClick(View v) {  
  49.             DownedFileLength=0;  
  50.             // TODO Auto-generated method stub  
  51.            Thread thread=new Thread(){  
  52.              public void run(){  
  53.                  try {  
  54.                     DownFile(Path);  
  55.                 } catch (Exception e) {  
  56.                     // TODO: handle exception  
  57.                 }  
  58.              }  
  59.            };  
  60.            thread.start();  
  61.         }     
  62.     }  
  63.     private Handler handler=new Handler()  
  64.     {  
  65.          public void handleMessage(Message msg)  
  66.         {  
  67.         if (!Thread.currentThread().isInterrupted()) {  
  68.             switch (msg.what) {  
  69.             case 0:  
  70.                 progressBar.setMax(FileLength);  
  71.                 Log.i("文件长度----------->", progressBar.getMax()+"");    
  72.                 break;  
  73.             case 1:  
  74.                 progressBar.setProgress(DownedFileLength);  
  75.                 int x=DownedFileLength*100/FileLength;  
  76.                 textView.setText(x+"%");  
  77.                 break;  
  78.             case 2:  
  79.                 Toast.makeText(getApplicationContext(), "下载完成", Toast.LENGTH_LONG).show();  
  80.                 break;  
  81.                   
  82.             default:  
  83.                 break;  
  84.             }  
  85.         }     
  86.         }  
  87.            
  88.     };  
  89.   
  90.     private void DownFile(String urlString)  
  91.     {  
  92.           
  93.         /* 
  94.          * 连接到服务器 
  95.          */  
  96.           
  97.         try {  
  98.              URL url=new URL(urlString);  
  99.              connection=url.openConnection();  
  100.              if (connection.getReadTimeout()==5) {  
  101.                 Log.i("---------->""当前网络有问题");  
  102.                 // return;  
  103.                }  
  104.              inputStream=connection.getInputStream();  
  105.               
  106.         } catch (MalformedURLException e1) {  
  107.             // TODO Auto-generated catch block  
  108.             e1.printStackTrace();  
  109.         } catch (IOException e) {  
  110.             // TODO Auto-generated catch block  
  111.             e.printStackTrace();  
  112.         }  
  113.           
  114.         /* 
  115.          * 文件的保存路径和和文件名其中Nobody.mp3是在手机SD卡上要保存的路径,如果不存在则新建 
  116.          */  
  117.         String savePAth=Environment.getExternalStorageDirectory()+"/DownFile";  
  118.         File file1=new File(savePAth);  
  119.         if (!file1.exists()) {  
  120.             file1.mkdir();  
  121.         }  
  122.         String savePathString=Environment.getExternalStorageDirectory()+"/DownFile/"+"DJ.mp3";  
  123.         File file =new File(savePathString);  
  124.         if (!file.exists()) {  
  125.             try {  
  126.                 file.createNewFile();  
  127.             } catch (IOException e) {  
  128.                 // TODO Auto-generated catch block  
  129.                 e.printStackTrace();  
  130.             }     
  131.         }  
  132.         /* 
  133.          * 向SD卡中写入文件,用Handle传递线程 
  134.          */  
  135.         Message message=new Message();  
  136.         try {  
  137.             outputStream=new FileOutputStream(file);  
  138.             byte [] buffer=new byte[1024*4];  
  139.             FileLength=connection.getContentLength();  
  140.             message.what=0;  
  141.             handler.sendMessage(message);  
  142.             while (DownedFileLength<FileLength) {  
  143.                 outputStream.write(buffer);  
  144.                 DownedFileLength+=inputStream.read(buffer);  
  145.                 Log.i("-------->", DownedFileLength+"");  
  146.                 Message message1=new Message();  
  147.                 message1.what=1;  
  148.                 handler.sendMessage(message1);  
  149.             }  
  150.             Message message2=new Message();  
  151.             message2.what=2;  
  152.             handler.sendMessage(message2);  
  153.         } catch (FileNotFoundException e) {  
  154.             // TODO Auto-generated catch block  
  155.             e.printStackTrace();  
  156.         } catch (IOException e) {  
  157.             // TODO Auto-generated catch block  
  158.             e.printStackTrace();  
  159.         }  
  160.     }  
  161.         
  162. }  


 

android自定义Dialog实现文件下载和下载进度


http://blog.csdn.net/vipa1888/article/details/7459200


最近要实现一个检验更新的功能,当进入程序的时候,开始请求服务器,然后得到服务器的响应更新结果!如果需要更新的话,就打开一个Dialog,在Dialog上面下载文件,于是自己研究了一个自定义dialog的实现,也完成了在dialog上面有进度的下载文件(自己的作图技术查,随便画了一个背景吐舌头),效果图如下:

 

 

效果如上,下面我把代码贴出来:

主界面Activity: 主界面就定义了一个Button,当点击Button后,弹出Dialog

[html]  view plain copy
  1. package com.spring.sky.dialog.download;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.ImageView;  
  9.   
  10. /**  
  11.  * 主界面  
  12.  * @author spring sky  
  13.  */  
  14. public class MainActivity extends Activity implements  
  15.         android.view.View.OnClickListener {  
  16.     private Button bt;  
  17.     private ImageView imageView;  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         init();  
  24.     }  
  25.   
  26.     private void init() {  
  27.         bt = (Button) this.findViewById(R.id.bt);  
  28.         bt.setOnClickListener(this);  
  29.         imageView = (ImageView) findViewById(R.id.imageview);  
  30.     }  
  31.   
  32.     @Override  
  33.     public void onClick(View v) {  
  34.         DownloadDialog dialog = new DownloadDialog(this,  
  35.                 "http://img308.ph.126.net/AM2zg9CNx0kG8K3jY122RQ==/3902932027070067384.jpg");  
  36.         dialog.setImageView(imageView);  //当前下载的是一个图片,所以下载完成后,把这个图片显示在界面上  
  37.         dialog.show();  
  38.     }  
  39. }  

main.xml:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <Button  
  13.             android:id="@+id/bt"  
  14.             android:layout_width="fill_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:text="弹出框下载文件" />  
  17.   
  18.         <ImageView  
  19.             android:id="@+id/imageview"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:layout_gravity="center_vertical"  
  23.              />  
  24.     </LinearLayout>  
  25.   
  26. </ScrollView>  


自定义的Dialog  :  这个基本就是实现Dialog的布局,还有Dialog的背景透明效果,然后用户点击了下载,启动一个新线程下载,同时用handler来发送消息,让下载操作的进度在Dialog的view上面呈现出来,当下载完成的时候,点击按钮就可以看见下载的图片了!  (我测试为了简单就用了一个ImageView把图片显示出来)

[java]  view plain copy
  1. package com.spring.sky.dialog.download;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.InputStream;  
  5. import java.net.URL;  
  6. import java.net.URLConnection;  
  7.   
  8.   
  9. import android.app.Dialog;  
  10. import android.content.Context;  
  11. import android.graphics.BitmapFactory;  
  12. import android.os.Bundle;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.Button;  
  18. import android.widget.ImageView;  
  19. import android.widget.ProgressBar;  
  20. import android.widget.TextView;  
  21. import android.widget.Toast;  
  22.   
  23. /*** 
  24.  * dialog文件下载 
  25.  * @author spring sky <br> 
  26.  * QQ :840950105 
  27.  */  
  28. public class DownloadDialog extends Dialog implements  
  29.         android.view.View.OnClickListener {  
  30.     private static final int DOWNLOAD_PREPARE = 0;  
  31.     private static final int DOWNLOAD_WORK = 1;  
  32.     private static final int DOWNLOAD_OK = 2;  
  33.     private static final int DOWNLOAD_ERROR = 3;  
  34.     private static final String TAG = "IndexActivity";  
  35.     private Context mContext;  
  36.   
  37.     private Button bt;  
  38.     private ProgressBar pb;  
  39.     /** 下载过程中不能点击 */  
  40.     private boolean isClick = false;  
  41.     private boolean downloadOk = false;  
  42.     private TextView tv;  
  43.     /** 
  44.      * 下载的url 
  45.      */  
  46.     private String url = null;  
  47.     private String filePath;  
  48.   
  49.     /** 
  50.      * 文件大小 
  51.      */  
  52.     int fileSize = 0;  
  53.   
  54.     /** 
  55.      * 下载的大小 
  56.      */  
  57.     int downloadSize = 0;  
  58.   
  59.     /** 
  60.      * handler 
  61.      */  
  62.     private Handler handler = new Handler() {  
  63.   
  64.         @Override  
  65.         public void handleMessage(Message msg) {  
  66.             switch (msg.what) {  
  67.             case DOWNLOAD_PREPARE:  
  68.                 Toast.makeText(mContext, "准备下载", Toast.LENGTH_SHORT).show();  
  69.                 pb.setVisibility(ProgressBar.VISIBLE);  
  70.                 Log.e(TAG, "文件大小:" + fileSize);  
  71.                 pb.setMax(fileSize);  
  72.                 break;  
  73.             case DOWNLOAD_WORK:  
  74.                 Log.e(TAG, "已经下载:" + downloadSize);  
  75.                 pb.setProgress(downloadSize);  
  76.                 int res = downloadSize * 100 / fileSize;  
  77.                 tv.setText("已下载:" + res + "%");  
  78.                 bt.setText(FileUtil.FormetFileSize(downloadSize) + "/"  
  79.                         + FileUtil.FormetFileSize(fileSize));  
  80.                 break;  
  81.             case DOWNLOAD_OK:  
  82.                 downloadOk = true;  
  83.                 bt.setText("下载完成显示图片");  
  84.                 downloadSize = 0;  
  85.                 fileSize = 0;  
  86.                 Toast.makeText(mContext, "下载成功", Toast.LENGTH_SHORT).show();  
  87.                 break;  
  88.             case DOWNLOAD_ERROR:  
  89.                 downloadSize = 0;  
  90.                 fileSize = 0;  
  91.                 Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();  
  92.                 break;  
  93.             }  
  94.             super.handleMessage(msg);  
  95.         }  
  96.     };  
  97.   
  98.     private ImageView imageView;  
  99.   
  100.     public DownloadDialog(Context context, String url) {  
  101.   
  102.         super(context, R.style.Theme_CustomDialog);  
  103.         mContext = context;  
  104.         this.url = url;  
  105.         filePath = FileUtil.getPath(mContext, url);  
  106.     }  
  107.   
  108.     @Override  
  109.     public void cancel() {  
  110.         super.cancel();  
  111.     }  
  112.   
  113.     /** 
  114.      * 下载文件 
  115.      */  
  116.     private void downloadFile() {  
  117.         try {  
  118.             URL u = new URL(url);  
  119.             URLConnection conn = u.openConnection();  
  120.             InputStream is = conn.getInputStream();  
  121.             fileSize = conn.getContentLength();  
  122.             if (fileSize < 1 || is == null) {  
  123.                 sendMessage(DOWNLOAD_ERROR);  
  124.             } else {  
  125.                 sendMessage(DOWNLOAD_PREPARE);  
  126.                 FileOutputStream fos = new FileOutputStream(filePath);  
  127.                 byte[] bytes = new byte[1024];  
  128.                 int len = -1;  
  129.                 while ((len = is.read(bytes)) != -1) {  
  130.                     fos.write(bytes, 0, len);  
  131.                     fos.flush();  
  132.                     downloadSize += len;  
  133.                     sendMessage(DOWNLOAD_WORK);  
  134.                 }  
  135.                 sendMessage(DOWNLOAD_OK);  
  136.                 is.close();  
  137.                 fos.close();  
  138.             }  
  139.         } catch (Exception e) {  
  140.             sendMessage(DOWNLOAD_ERROR);  
  141.             e.printStackTrace();  
  142.         }  
  143.     }  
  144.     /*** 
  145.      * 得到文件的路径 
  146.      *  
  147.      * @return 
  148.      */  
  149.     public String getFilePath() {  
  150.         return filePath;  
  151.     }  
  152.     private void init() {  
  153.         bt = (Button) this.findViewById(R.id.down_bt);  
  154.         bt.setOnClickListener(this);  
  155.         tv = (TextView) this.findViewById(R.id.down_tv);  
  156.         pb = (ProgressBar) this.findViewById(R.id.down_pb);  
  157.     }  
  158.   
  159.     @Override  
  160.     public void onClick(View v) {  
  161.         switch (v.getId()) {  
  162.         case R.id.down_bt:  
  163.             if (isClick) {  
  164.                 // 启动一个线程下载文件  
  165.                 Thread thread = new Thread(new Runnable() {  
  166.                     @Override  
  167.                     public void run() {  
  168.                         downloadFile();  
  169.                     }  
  170.                 });  
  171.                 thread.start();  
  172.                 isClick = false;  
  173.             }  
  174.   
  175.             if (downloadOk) // 下载完成后 ,把图片显示在ImageView上面  
  176.             {  
  177.                 imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));  
  178.                 cancel();  
  179.             }  
  180.             break;  
  181.         default:  
  182.             break;  
  183.         }  
  184.     }  
  185.   
  186.     @Override  
  187.     protected void onCreate(Bundle savedInstanceState) {  
  188.         super.onCreate(savedInstanceState);  
  189.         setContentView(R.layout.download_layuot);  
  190.         init();  
  191.     }  
  192.   
  193.     /** 
  194.      * @param what 
  195.      */  
  196.     private void sendMessage(int what) {  
  197.         Message m = new Message();  
  198.         m.what = what;  
  199.         handler.sendMessage(m);  
  200.     }  
  201.   
  202.     public void setImageView(ImageView imageView) {  
  203.         this.imageView = imageView;  
  204.     }  
  205.   
  206.     @Override  
  207.     public void show() {  
  208.         isClick = true;  
  209.         downloadOk = false;  
  210.         super.show();  
  211.     }  
  212.   
  213. }  

dialog的download_layuot.xml布局文件:  这个使用了相对布局,让ProgressBar和TextView呈现在一个居中位置,看起来就像连在一起的效果!同时Button来实现文件大小的显示

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="@drawable/dialog"  
  6.     android:orientation="vertical" >  
  7.     <TextView  
  8.             android:layout_margin="5dip"  
  9.             android:layout_width="wrap_content"  
  10.             android:layout_height="wrap_content"  
  11.             android:layout_gravity="center_horizontal"  
  12.             android:text="有新的版本更新"  
  13.             android:textSize="20dip"  
  14.             android:textColor="@android:color/white" />  
  15.       
  16.     <RelativeLayout  
  17.          android:layout_margin="10dip"  
  18.          android:layout_width="fill_parent"  
  19.          android:layout_height="wrap_content"  
  20.           android:layout_gravity="center_horizontal"  
  21.          >  
  22.          <ProgressBar  
  23.             android:layout_centerHorizontal="true"  
  24.             android:layout_centerVertical="true"  
  25.             android:id="@+id/down_pb"  
  26.             style="?android:attr/progressBarStyleHorizontal"  
  27.             android:layout_width="260dip"  
  28.             android:layout_height="wrap_content"  
  29.             />  
  30.          <TextView  
  31.             android:layout_centerHorizontal="true"  
  32.             android:layout_centerVertical="true"  
  33.             android:id="@+id/down_tv"  
  34.             android:layout_width="wrap_content"  
  35.             android:layout_height="wrap_content"  
  36.             android:text="开始下载..."  
  37.             android:textColor="@android:color/white"  
  38.             android:textSize="20sp" />  
  39.     </RelativeLayout>  
  40.         <Button  
  41.             android:layout_gravity="center_horizontal"  
  42.             android:id="@+id/down_bt"  
  43.             android:layout_width="wrap_content"  
  44.             android:layout_height="fill_parent"  
  45.             android:text="点击下载"  
  46.             android:textColor="@android:color/black"  
  47.             android:textSize="16sp"  
  48.             android:layout_marginTop="10dip"  
  49.             android:layout_marginBottom="10dip" />  
  50. </LinearLayout>  


在dialog中需要一个样式,这个样式可以实现Dialog后面的背景透明:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <stroke android:width="3dp"/>  
  5.     <corners android:radius="3dp" />  
  6.     <padding android:left="10dp" android:top="10dp"  
  7.         android:right="10dp" android:bottom="10dp" />  
  8.     <solid android:color="@android:color/transparent"/>  
  9. </shape>  


 

还有一个FileUtil.java的文件工具类:

[java]  view plain copy
  1. package com.spring.sky.dialog.download;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.sql.Timestamp;  
  6. import java.text.DecimalFormat;  
  7.   
  8. import android.content.Context;  
  9. import android.os.Environment;  
  10. import android.util.Log;  
  11.   
  12. /** 
  13.  * 文件工具类 
  14.  * @author spring sky 
  15.  * 
  16.  */  
  17. public class FileUtil {  
  18.     /** 
  19.      * 获取目录名称 
  20.      * @param url 
  21.      * @return FileName 
  22.      */  
  23.     public static String getFileName(String url)  
  24.     {  
  25.         int lastIndexStart = url.lastIndexOf("/");  
  26.         if(lastIndexStart!=-1)  
  27.         {  
  28.             return url.substring(lastIndexStart+1, url.length());  
  29.         }else{  
  30.             return new Timestamp(System.currentTimeMillis()).toString();  
  31.         }  
  32.     }  
  33.     /** 
  34.      * 判断SD卡是否存在 
  35.      * @return boolean 
  36.      */  
  37.     public static boolean checkSDCard() {  
  38.         if (android.os.Environment.getExternalStorageState().equals(  
  39.                 android.os.Environment.MEDIA_MOUNTED)) {  
  40.             return true;  
  41.         } else {  
  42.             return false;  
  43.         }  
  44.     }  
  45.       
  46.     /** 
  47.      * 保存目录目录到目录 
  48.      * @param context 
  49.      * @return  目录保存的目录 
  50.      */  
  51.     public static String setMkdir(Context context)  
  52.     {  
  53.         String filePath = null;  
  54.         if(checkSDCard())  
  55.         {  
  56.             filePath = Environment.getExternalStorageDirectory()+File.separator+"yishuabao"+File.separator+"downloads";  
  57.         }else{  
  58.             filePath = context.getCacheDir().getAbsolutePath()+File.separator+"yishuabao"+File.separator+"downloads";  
  59.         }  
  60.         File file = new File(filePath);  
  61.         if(!file.exists())  
  62.         {  
  63.             file.mkdirs();  
  64.             Log.e("file""目录不存在   创建目录    ");  
  65.         }else{  
  66.             Log.e("file""目录存在");  
  67.         }  
  68.         return filePath;  
  69.     }  
  70.       
  71.     /** 
  72.      * 获取路径 
  73.      * @return 
  74.      * @throws IOException 
  75.      */  
  76.     public static  String getPath(Context context,String url)  
  77.     {  
  78.         String path = null;  
  79.         try {  
  80.             path = FileUtil.setMkdir(context)+File.separator+url.substring(url.lastIndexOf("/")+1);  
  81.         } catch (Exception e) {  
  82.             e.printStackTrace();  
  83.         }  
  84.         return path;  
  85.     }  
  86.       
  87.     /** 
  88.      * 获取文件的大小 
  89.      *  
  90.      * @param fileSize 
  91.      *            文件的大小 
  92.      * @return 
  93.      */  
  94.     public static String FormetFileSize(int fileSize) {// 转换文件大小  
  95.         DecimalFormat df = new DecimalFormat("#.00");  
  96.         String fileSizeString = "";  
  97.         if (fileSize < 1024) {  
  98.             fileSizeString = df.format((double) fileSize) + "B";  
  99.         } else if (fileSize < 1048576) {  
  100.             fileSizeString = df.format((double) fileSize / 1024) + "K";  
  101.         } else if (fileSize < 1073741824) {  
  102.             fileSizeString = df.format((double) fileSize / 1048576) + "M";  
  103.         } else {  
  104.             fileSizeString = df.format((double) fileSize / 1073741824) + "G";  
  105.         }  
  106.         return fileSizeString;  
  107.     }  
  108.       
  109. }  


相关文章
|
Android开发 数据格式 XML
Android NumberProgressBar:动态移动显示百分比进度的进度条
 Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.com/daimajia/NumberProgressBar NumberProgressBar特点是当进度条在前进时候,显示出来的百分比进度数字随进度条实时显示出来,如图: 这种特点在实现一些比如下载、加载功能模块时候比较有用。
1837 0
|
8月前
|
Android开发
Android 中ProgressDialog进度条对话框的使用(使用子线程模拟更新进度)
Android 中ProgressDialog进度条对话框的使用(使用子线程模拟更新进度)
101 0
|
10月前
|
编解码 Android开发
Android自定义ProgressBar,实现漂亮的进度提示框
Android自定义ProgressBar,实现漂亮的进度提示框
|
编解码 Android开发 索引
【Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )
【Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )
520 0
|
Android开发 数据格式 XML
Android BaseDialog(开发必备)动画、加载进度、阴影
(开发必备)动画、加载进度、阴影
1282 0
|
前端开发 Android开发
Android进阶之自定义View(2)高仿钉钉运动步数实现可动的进度圆环(下)
接着上篇Android进阶之自定义控件(2)高仿钉钉运动步数实现可动的进度圆环(上)的基础,我们来实现钉钉运动的效果: 《一》View效果分析: 对钉钉运动的效果进行分析: 1、圆弧应该是从135°起,绘制了270°。
1202 0
|
前端开发 Android开发
Android进阶之自定义View(2)高仿钉钉运动步数实现可动的进度圆环(上)
本文比较详细的介绍了绘制圆环及圆弧的基础知识,为实现钉钉运动步数打下基础,实现了下面的效果,实现钉钉运动就灰常简单了,本文实现的初步效果如下: 如果想直接看钉钉运动的最终效果,请戳:Android进阶之自定义控件(2)高仿钉钉运动步数实现可动的进度圆环(下) Animation.
1648 0
|
Android开发
【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件上传(三)
最近手头事比较多,抽个空把之前系列也补充一下。 先回顾下之前的 【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件下载(二) 今天要说的是文件上传 1.
3376 0
|
前端开发 Android开发
Android 自定义垂直,旋转,圆形进度提示 自定义Seekbar
SeekBar是用来调节参数值的,系统默认的一般都不太适合我们,需要我们自定义, 里面也有一个RxJava背压的具体应用 废话不多说,看图   package com.
2309 0