主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。
主Activity
代码如下:
package com.guotop.elearn.activity.app.yunpan.activity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Media;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import com.guotop.base.activity.BaseActivity;
import com.guotop.base.util.MyFile;
import com.guotop.elearn.activity.R;
import com.guotop.elearn.activity.app.yunpan.item.YunPanUploadFileItem;
public class YunPanUploadFileActivity extends BaseActivity implements OnClickListener{
String userId, parentId;
private final static int FILECHOOSER_RESULTCODE = 0;
// private String openFileType="";
private String mVideoFilePath,mPhotoFilePath,mVoiceFilePath;
private Button chooseBtn,uploadBtn;
private LinearLayout conterLayout;
private String actionURL;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, this);
setTitle("云盘上传文件");
setContentView(R.layout.activity_yunpan_uploadfile);
userId = getIntent().getStringExtra("userId");
parentId = getIntent().getStringExtra("parentId");
actionURL = getIntent().getStringExtra("actionURL");
chooseBtn = (Button)findViewById(R.id.chooseBtn);
uploadBtn = (Button)findViewById(R.id.uploadBtn);
conterLayout = (LinearLayout)findViewById(R.id.conterLayout);
chooseBtn.setOnClickListener(this);
uploadBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.chooseBtn){
// //选择文件
startActivityForResult(createDefaultOpenableIntent(), YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
// Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
// startActivityForResult(intent, YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
// Intent intent = new Intent(Media.RECORD_SOUND_ACTION);
// ((Activity) context).startActivityForResult(intent, YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
}else if(v.getId()==R.id.uploadBtn){
//上传文件
}
}
public void createUploadFileItem(String filePath){
// View view = LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
new YunPanUploadFileItem(context, conterLayout, filePath,actionURL);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
private Intent createDefaultOpenableIntent() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.putExtra(Intent.EXTRA_TITLE, "选择文件");
i.setType("*
public class YunPanUploadFileItem implements OnClickListener {
LinearLayout view,parentView;
String filePath;
private Context context;
private TextView uploadFileProgressText, uploadFileName;
private ProgressBar uploadFileProgressBar;
private ImageView uploadFileImg;
private Button startUploadFileBtn, cancelUploadFileBtn;
private String actionURL;
BaseHandler handler;
UploadYunFileHttpThread t;
UploadYunFileInformaction uploadYunFileInformaction ;
public YunPanUploadFileItem(Context context,LinearLayout parentView, String filePath,String actionURL) {
this.parentView = parentView;
this.actionURL = actionURL;
this.context = context;
File file = new File(filePath);
this.view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
// this.view = view;
this.filePath = filePath;
uploadFileProgressText = (TextView) view.findViewById(R.id.uploadFileProgressText);
uploadFileName = (TextView) view.findViewById(R.id.uploadFileName);
uploadFileProgressBar = (ProgressBar) view.findViewById(R.id.uploadFileProgressBar);
uploadFileImg = (ImageView) view.findViewById(R.id.uploadFileImg);
cancelUploadFileBtn = (Button) view.findViewById(R.id.cancelUploadFileBtn);
startUploadFileBtn = (Button) view.findViewById(R.id.startUploadFileBtn);
uploadFileName.setText(file.getName()+" 大小"+MyFile.formetFileSize(file.getPath()));
uploadFileImg.setImageResource(MyFile.getFileIcon(file));
startUploadFileBtn.setOnClickListener(this);
cancelUploadFileBtn.setOnClickListener(this);
parentView.addView(view);
uploadYunFileInformaction = new UploadYunFileInformaction(filePath);
myHandler = new MyHandler(Looper.myLooper(), this);
uploadYunFileInformaction.setNotificationId(new Random().nextInt(10000));
uploadYunFileInformaction.setActionURL(actionURL);
t = new UploadYunFileHttpThread(myHandler, uploadYunFileInformaction);
uploads.put(uploadYunFileInformaction.getNotificationId(), t);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.startUploadFileBtn) {
downFile(t);
startUploadFileBtn.setClickable(false);
}else if(v.getId()==R.id.cancelUploadFileBtn){
if(t.isStart){
new AlertDialog.Builder(context).setTitle("系统提示!").setMessage("该文件正在上传确定要强制停止?")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
t.interrupt();
parentView.removeView(view);
uploads.removeKey(uploadYunFileInformaction.getNotificationId());
System.gc();
}
}).show();
}else {
parentView.removeView(view);
uploads.removeKey(uploadYunFileInformaction.getNotificationId());
}
}
}
public static MyHashMap<Integer, UploadYunFileHttpThread> uploads = new MyHashMap<Integer, UploadYunFileHttpThread>();
private MyHandler myHandler;
public IBinder onBind(Intent intent) {
return null;
}
// 下载更新文件
private void downFile(UploadYunFileHttpThread t) {
int len = 3;
if (t != null && uploads.size() <= len) {
if (!t.isStart) {
t.start();
}
} else if (t == null && uploads.size() >= len) {
t = uploads.get(len - 1);
if (!t.isStart) {
t.start();
}
}
}
class MyHandler extends BaseHandler {
private WeakReference<YunPanUploadFileItem> bdfs;
public MyHandler(Looper looper, YunPanUploadFileItem yunPanUploadFileItem) {
super(looper);
this.bdfs = new WeakReference<YunPanUploadFileItem>(yunPanUploadFileItem);
}
@Override
public void handleMessage(Message msg) {
YunPanUploadFileItem bdfs = this.bdfs.get();
if (bdfs == null) {
return;
}
if (msg != null) {
switch (msg.what) {
case 0:
Toast.makeText(L.livingActivity, msg.obj.toString(), Toast.LENGTH_SHORT).show();
break;
case L.dowloadStart:
break;
case L.dowloadFinish:
// 下载完成后清除所有下载信息,执行安装提示
try {
uploads.removeKey(msg.getData().getInt("notificationId"));
bdfs.uploadFileProgressText.setText("上传完成");
bdfs.uploadFileProgressBar.setMax(100);
bdfs.uploadFileProgressBar.setProgress(100);
startUploadFileBtn.setClickable(false);
} catch (Exception e) {
}
bdfs.downFile(null);
break;
case L.dowloadPercentage:
// 更新状态栏上的下载进度信息
bdfs.uploadFileProgressText.setText("总共:"+MyFile.formetFileSize(msg.getData().getInt("fileSize"))+ "/" + MyFile.formetFileSize(msg.getData().getInt("finishFileSize")) + " 已上传"
+ msg.getData().getInt("percentage") + "%");
bdfs.uploadFileProgressBar.setMax(100);
bdfs.uploadFileProgressBar.setProgress(msg.getData().getInt("percentage"));
break;
case 4:
// bdfs.nm.cancel(msg.getData().getInt("notificationId"));
break;
}
}
}
}
}
用来上传文件的线程
代码如下:
package com.guotop.elearn.activity.app.yunpan.thread;
import java.net.SocketException;
import com.guotop.base.L;
import com.guotop.base.Util;
import com.guotop.base.handler.BaseHandler;
import com.guotop.base.thread.HttpThread;
import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;
import com.guotop.elearn.activity.app.yunpan.util.YunPanUploadFile;
import com.guotop.elearn.activity.app.yunpan.util.YunPanUploadFileHttpInterface;
public class UploadYunFileHttpThread extends HttpThread{
@SuppressWarnings("unused")
private UploadYunFileInformaction uploadYunFileInformaction;
public boolean isStart=false;
public static int RECONNECT = 1000002;
public static int CAN_NOT_RECONNECT = 1000003;
YunPanUploadFile yunPanUploadFile;
public UploadYunFileHttpThread(){
}
public UploadYunFileHttpThread(BaseHandler handler,UploadYunFileInformaction dowFile){
this.uploadYunFileInformaction=dowFile;
this.handler=handler;
}
int fileSize,finishFileSize,percentage;
private boolean isUpdate = true;
public void run() {
isStart=true;//是启动了
new HttpThread(handler){
public void run() {
while (isUpdate) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
if(finishFileSize!=0&&fileSize!=0){
msg = handler.obtainMessage();
if(percentage>=100){
// msg.what=L.dowloadFinish;
// msg.setData(bundle);
// handler.sendMessage(msg);
break;
}else {
bundle.putString("fileName", uploadYunFileInformaction.getFileName());
bundle.putInt("percentage", percentage);
bundle.putInt("finishFileSize", finishFileSize);
bundle.putInt("fileSize", fileSize);
msg.what=L.dowloadPercentage;
msg.setData(bundle);
handler.sendMessage(msg);
sendMessage(1000000);// 为了取消等待框
&nb
sp; }
}
}
}
}.start();
try {
uploadFile();
} catch (Exception e) {
isUpdate = false;
isStart = false;
}
}
private void uploadFile() {
yunPanUploadFile = new YunPanUploadFile(dbfInterface, uploadYunFileInformaction, L.COOKIE);
result = yunPanUploadFile.post();
msg = handler.obtainMessage();
bundle.putInt("notificationId", uploadYunFileInformaction.getNotificationId());
bundle.putString("path", uploadYunFileInformaction.getPath());
bundle.putString("result", result);
msg.what = L.dowloadFinish;
msg.setData(bundle);
handler.sendMessage(msg);
isUpdate = false;
isStart = false;
}
YunPanUploadFileHttpInterface dbfInterface = new YunPanUploadFileHttpInterface() {
//初始化下载后
public void initFileSize(int size) {
fileSize=size;
msg = handler.obtainMessage();
bundle.putInt("fileSize", fileSize);
msg.what = L.dowloadStart;
msg.setData(bundle);
handler.sendMessage(msg);
}
//现在计划进行中
public void uploadPlan(int fileSize,int finishSize) {
finishFileSize=finishSize;
percentage=finishSize/(fileSize/100);
if(percentage<-1L){
Util.LogGL(this.getClass().getName(), "downloadPlan",percentage+"");
}
}
//下载完成
public void uploadFinish(String file) {
percentage=101;
}
};
public UploadYunFileInformaction getDowloadFileInformaction() {
return uploadYunFileInformaction;
}
public void setDowloadFileInformaction(
UploadYunFileInformaction dowloadFileInformaction) {
this.uploadYunFileInformaction = dowloadFileInformaction;
}
@Override
public void interrupt() {
yunPanUploadFile.close();
super.interrupt();
}
}
记录文件信息Bean
代码如下:
package com.guotop.elearn.activity.app.yunpan.item;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Random;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.guotop.base.L;
import com.guotop.base.handler.BaseHandler;
import com.guotop.base.thread.HttpThread;
import com.guotop.base.util.MyFile;
import com.guotop.base.util.MyHashMap;
import com.guotop.elearn.activity.R;
import com.guotop.elearn.activity.app.yunpan.Y;
import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;
import com.guotop.elearn.activity.app.yunpan.thread.UploadYunFileHttpThread;
public class YunPanUploadFileItem implements OnClickListener {
LinearLayout view,parentView;
String filePath;
private Context context;
private TextView uploadFileProgressText, uploadFileName;
private ProgressBar uploadFileProgressBar;
private ImageView uploadFileImg;
private Button startUploadFileBtn, cancelUploadFileBtn;
private String actionURL;
BaseHandler handler;
UploadYunFileHttpThread t;
UploadYunFileInformaction uploadYunFileInformaction ;
public YunPanUploadFileItem(Context context,LinearLayout parentView, String filePath,String actionURL) {
this.parentView = parentView;
this.actionURL = actionURL;
this.context = context;
File file = new File(filePath);
this.view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
// this.view = view;
this.filePath = filePath;
uploadFileProgressText = (TextView) view.findViewById(R.id.uploadFileProgressText);
uploadFileName = (TextView) view.findViewById(R.id.uploadFileName);
uploadFileProgressBar = (ProgressBar) view.findViewById(R.id.uploadFileProgressBar);
uploadFileImg = (ImageView) view.findViewById(R.id.uploadFileImg);
cancelUploadFileBtn = (Button) view.findViewById(R.id.cancelUploadFileBtn);
startUploadFileBtn = (Button) view.findViewById(R.id.startUploadFileBtn);
uploadFileName.setText(file.getName()+" 大小"+MyFile.formetFileSize(file.getPath()));
uploadFileImg.setImageResource(MyFile.getFileIcon(file));
startUploadFileBtn.setOnClickListener(this);
cancelUploadFileBtn.setOnClickListener(this);
parentView.addView(view);
uploadYunFileInformaction = new UploadYunFileInformaction(filePath);
myHandler = new MyHandler(Looper.myLooper(), this);
uploadYunFileInformaction.setNotificationId(new Random().nextInt(10000));
uploadYunFileInformaction.setActionURL(actionURL);
t = new UploadYunFileHttpThread(myHandler, uploadYunFileInformaction);
uploads.put(uploadYunFileInformaction.getNotificationId(), t);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.startUploadFileBtn) {
downFile(t);
startUploadFileBtn.setClickable(false);
}else if(v.getId()==R.id.cancelUploadFileBtn){
if(t.isStart){
new AlertDialog.Builder(context).setTitle("系统提示!").setMessage("该文件正在上传确定要强制停止?")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
t.interrupt();
parentView.removeView(view);
uploads.removeKey(uploadYunFileInformaction.getNotificationId());
System.gc();
}
}).show();
}else {
parentView.removeView(view);
uploads.removeKey(uploadYunFileInformaction.getNotificationId());
}
}
}
public static MyHashMap<Integer, UploadYunFileHttpThread> uploads = new MyHashMap<Integer, UploadYunFileHttpThread>();
private MyHandler myHandler;
public IBinder onBind(Intent intent) {
return null;
}
// 下载更新文件
private void downFile(UploadYunFileHttpThread t) {
int len = 3;
if (t != null && uploads.size() <= len) {
if (!t.isStart) {
t.start();
}
} else if (t == null && uploads.size() >= len) {
t = uploads.get(len - 1);
if (!t.isStart) {
t.start();
}
}
}
class MyHandler extends BaseHandler {
private WeakReference<YunPanUploadFileItem> bdfs;
public MyHandler(Looper looper, YunPanUploadFileItem yunPanUploadFileItem) {
super(looper);
this.bdfs = new WeakReference<YunPanUploadFileItem>(yunPanUploadFileItem);
}
@Override
public void handleMessage(Message msg) {
YunPanUploadFileItem bdfs = this.bdfs.get();
if (bdfs == null) {
return;
}
if (msg != null) {
switch (msg.what) {
case 0:
Toast.makeText(L.livingActivity, msg.obj.toString(), Toast.LENGTH_SHORT).show();
break;
case L.dowloadStart:
break;
case L.dowloadFinish:
// 下载完成后清除所有下载信息,执行安装提示
try {
uploads.removeKey(msg.getData().getInt("notificationId"));
bdfs.uploadFileProgressText.setText("上传完成");
bdfs.uploadFileProgressBar.setMax(100);
bdfs.uploadFileProgressBar.setProgress(100);
startUploadFileBtn.setClickable(false);
} catch (Exception e) {
}
bdfs.downFile(null);
break;
case L.dowloadPercentage:
// 更新状态栏上的下载进度信息
bdfs.uploadFileProgressText.setText("总共:"+MyFile.formetFileSize(msg.getData().getInt("fileSize"))+ "/" + MyFile.formetFileSize(msg.getData().getInt("finishFileSize")) + " 已上传"
+ msg.getData().getInt("percentage") + "%");
bdfs.uploadFileProgressBar.setMax(100);
bdfs.uploadFileProgressBar.setProgress(msg.getData().getInt("percentage"));
break;
case 4:
// bdfs.nm.cancel(msg.getData().getInt("notificationId"));
break;
}
}
}
}
}
文件上传工具类
代码如下:
package com.guotop.elearn.activity.app.yunpan.util;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
import android.R.integer;
import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;
public class YunPanUploadFile {
String multipart_form_data = "multipart/form-data";
String twoHyphens = "--";
String boundary = "****************SoMeTeXtWeWiLlNeVeRsEe"; // 数据分隔符
String lineEnd = "\r\n";
YunPanUploadFileHttpInterface yunPanUploadFileHttpInterface;
UploadYunFileInformaction uploadYunFileInformaction;
String cookie;
public YunPanUploadFile(YunPanUploadFileHttpInterface yunPanUploadFileHttpInterface,UploadYunFileInformaction uploadYunFileInformaction,String cookie){
this.yunPanUploadFileHttpInterface = yunPanUploadFileHttpInterface;
this.uploadYunFileInformaction = uploadYunFileInformaction;
this.cookie = cookie;
}
public void write(UploadYunFileInformaction file, DataOutputStream output) {
FileInputStream in;
try {
if (file.getPath() != null && !"".equals(file.getPath())) {
in = new FileInputStream(new File(file.getPath()));
int fileSize= in.available();
int readySize = 0;
yunPanUploadFileHttpInterface.initFileSize(fileSize);
byte[] b = new byte[1024];
while (in.read(b) > 0) {
readySize+=b.length;
yunPanUploadFileHttpInterface.uploadPlan(fileSize, readySize);
output.write(b, 0, b.length);
}
}
output.writeBytes(lineEnd);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void addFormField(Map<String, String> params, DataOutputStream output) {
if (params != null) {
for (Entry<String, String> param : params.entrySet()) {
StringBuilder sb = new StringBuilder();
sb.append(twoHyphens + boundary + lineEnd);
sb.append("Content-Disposition: form-data; name=\"" + param.getKey() + "\"" + lineEnd);
sb.append(lineEnd);
sb.append(param.getValue() + lineEnd);
try {
output.write(sb.toString().getBytes("utf-8"));// 发送表单字段数据
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
public String post(){
return post(null,uploadYunFileInformaction, cookie);
}
public String post(UploadYunFileInformaction uploadYunFileInformaction, String cookie,YunPanUploadFileHttpInterface yunPanUploadFileHttpInterface) {
return post(null,uploadYunFileInformaction, cookie);
}
HttpURLConnection conn = null;
DataOutputStream output = null;
BufferedReader input = null;
public String post(Map<String, String> params, UploadYunFileInformaction uploadYunFileInformaction, String cookie) {
try {
URL url = new URL(uploadYunFileInformaction.getActionURL());
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Cookie", cookie);
conn.setConnectTimeout(120000);
conn.setDoInput(true); // 允许输入
conn.setDoOutput(true); // 允许输出
conn.setUseCaches(false); // 不使用Cache
conn.setRequestMethod("POST");
conn.setRequestProperty("Charset", "utf-8");
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
conn.setRequestProperty("Connection", "keep-alive");
conn.setRequestProperty("Content-Type", multipart_form_data + "; boundary=" + boundary);
conn.setChunkedStreamingMode(1024*1024);//设置上传文件的缓存大小
conn.connect();
output = new DataOutputStream(conn.getOutputStream());
//发送头数据
sendSplitHead(uploadYunFileInformaction,output);
//发送文件内容
write(uploadYunFileInformaction, output);
//发送表单数据
&nb