主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。
主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;
/**
*
*
* @author: 李杨
* @time: 2014-4-15下午4:29:35
*/
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("*/*");
Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(), createSoundRecorderIntent());
chooser.putExtra(Intent.EXTRA_INTENT, i);
return chooser;
}
private Intent createChooserIntent(Intent... intents) {
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
chooser.putExtra(Intent.EXTRA_TITLE, "选择文件");
return chooser;
}
private Intent createCameraIntent() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "e-photos");
cameraDataDir.mkdirs();
mPhotoFilePath = cameraDataDir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".jpg";
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mPhotoFilePath)));
return cameraIntent;
}
private Intent createCamcorderIntent() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
File externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "e-videos");
cameraDataDir.mkdirs();
mVideoFilePath = cameraDataDir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".3gp";
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mVideoFilePath)));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video
return intent;
}
private Intent createSoundRecorderIntent() {
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
File externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "e-voices");
cameraDataDir.mkdirs();
mVoiceFilePath = cameraDataDir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".amr";
return intent;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FILECHOOSER_RESULTCODE) {
Uri result= data == null || resultCode != RESULT_OK ? null :data.getData();
if (result == null && data == null && resultCode == Activity.RESULT_OK) {
File mMediaFile = null;;
if(new File(mVideoFilePath).exists()){
mMediaFile = new File(mVideoFilePath);
}else if(new File(mPhotoFilePath).exists()){
mMediaFile = new File(mPhotoFilePath);
}else if(new File(mVoiceFilePath).exists()){
mMediaFile = new File(mVoiceFilePath);
}
if (mMediaFile!=null&&mMediaFile.exists()) {
result = Uri.fromFile(mMediaFile);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
}
// result = Uri.fromFile(new File(mCameraFilePath));
}
if(result!=null){
if(!new File(result.getPath()).canRead()){
try {
MyFile.copyFile(new File(mVoiceFilePath),getContentResolver().openInputStream(result));
createUploadFileItem(mVoiceFilePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}else {
createUploadFileItem(result.getPath());
}
}
System.out.println(result);
}
}
}
绘制现在文件信息后的Item
复制代码 代码如下:
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;
/**
*
*
* @author: 李杨
* @time: 2014-4-21下午12:28:33
*/
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;
/**
*
* 下载云服务器上的文件
*
*
*@author: 李杨
*@time: 2014-4-11下午6:06:53
*/
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);