Android开发笔记(一百零九)利用网盘实现云存储

来源:互联网 发布:数据库逻辑模型设计图 编辑:程序博客网 时间:2024/05/02 16:28

网盘存储

个人开发者往往没有自己的后台服务器,但同时又想获取app的运行信息,这就要借助于第三方的网络存储(也叫网盘、云盘、微盘等等)。通过让app自动在网盘上存取文件,可以间接实现后台服务器的存储功能,同时开发者也能及时找到app的用户信息。


曾几何时,各大公司纷纷推出免费的个人网盘服务,还开放了文件管理api给开发者调用,一时间涌现了网盘提供商的八大金刚:百度网盘、阿里云、华为网盘、腾讯微云、新浪微盘、360云盘、金山快盘、115网盘。可是好景不长,出于盈利、监管等等因素,各大网盘开放平台要么停止免费服务、推出收费服务,要么停止个人服务、推出企业服务,要么保留老用户、不再接受新用户,总之现在开发者已不能无偿使用网盘的sdk集成功能了。要想实现app的云存储,得用点真金白银了。


百度网盘

百度的个人网盘又称pcs(Personal Cloud Storage),百度网盘的存储服务本身是免费的,只是对开发者来说,已经不再接受新应用接入pcs。之前已申请的老应用则不受影响(大约是2015年之前的老应用),所以博主寻寻觅觅,总算找到了一个曲线救国道路,让新开发者也能在app中使用网盘服务。


具体方法如下:
1、先注册成为百度用户,并开通个人网盘服务,正常的话访问http://pan.baidu.com/就能看到网盘的管理页面;
2、把代码中的mbApiKey和mbRootPath替换为wp2pcs应用的信息,注意存储路径只能是wp2pcs,因为该应用在申请时就指定了这个默认路径,如果使用其他路径会报没权限;
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private final static String mbApiKey = "CuOLkaVfoz1zGsqFKDgfvI0h";  
  2. private final static String mbRootPath = "/apps/wp2pcs";  
3、app首次运行进行登录时,要把你的帐号授权给wp2pcs应用,以便创建目录、读写文件等操作;下面是百度pcs的登录授权页面截图




百度网盘的代码调用流程是:先调用BaiduOAuth对象的startOAuth鉴权方法(logout是注销方法),从返回包中获取AccessToken,后续的文件读写操作会用到这个AccessToken。接着实例化一个AccessToken对象,然后对该对象设置AccessToken,再根据业务要求分别调用相应的方法,常用方法说明如下:
quota : 获取磁盘空间。返回PCSQuotaResponse对象。
list : 获取文件/目录列表。返回PCSListInfoResponse对象。
makeDir : 创建目录。返回PCSFileInfoResponse对象。
deleteFiles : 删除文件。返回PCSSimplefiedResponse对象。
downloadFileFromStream : 下载文件。返回PCSSimplefiedResponse对象。
uploadFile : 上传文件。返回PCSFileInfoResponse对象。
rename : 文件改名。返回PCSFileFromToResponse对象。


下面是app操作百度pcs的页面截图



下面是使用百度网盘的代码示例:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.os.Environment;  
  9. import android.os.Handler;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.AdapterView.OnItemLongClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.ListView;  
  18. import android.widget.TextView;  
  19. import android.widget.Toast;  
  20.   
  21. import com.baidu.oauth.BaiduOAuth;  
  22. import com.baidu.oauth.BaiduOAuth.BaiduOAuthResponse;  
  23. import com.baidu.pcs.BaiduPCSActionInfo;  
  24. import com.baidu.pcs.BaiduPCSActionInfo.PCSCommonFileInfo;  
  25. import com.baidu.pcs.BaiduPCSActionInfo.PCSFileFromToInfo;  
  26. import com.baidu.pcs.BaiduPCSActionInfo.PCSFileFromToResponse;  
  27. import com.baidu.pcs.BaiduPCSActionInfo.PCSFileInfoResponse;  
  28. import com.baidu.pcs.BaiduPCSActionInfo.PCSListInfoResponse;  
  29. import com.baidu.pcs.BaiduPCSActionInfo.PCSQuotaResponse;  
  30. import com.baidu.pcs.BaiduPCSActionInfo.PCSSimplefiedResponse;  
  31. import com.baidu.pcs.BaiduPCSClient;  
  32. import com.baidu.pcs.BaiduPCSStatusListener;  
  33.   
  34. import com.example.exmnetdisk.R;  
  35. import com.example.exmnetdisk.pcs.ConfirmDialogFragment.ConfirmCallbacks;  
  36. import com.example.exmnetdisk.pcs.InputDialogFragment.InputCallbacks;  
  37.   
  38. public class PCSActivity extends Activity implements OnClickListener  
  39.     ,OnItemClickListener,OnItemLongClickListener,ConfirmCallbacks,InputCallbacks {  
  40.       
  41.     private static final String TAG = "PCSActivity";  
  42.     private TextView tv_desc;  
  43.     private TextView tv_path;  
  44.     private ListView lv_content;  
  45.     private Button btn_login;  
  46.     private Button btn_logout;  
  47.     private Button btn_upload;  
  48.     private Button btn_rename;  
  49.     private Button btn_back;  
  50.     private Button btn_create;  
  51.   
  52.     private String mbOauth = null;  
  53.     private final static String mbApiKey = "CuOLkaVfoz1zGsqFKDgfvI0h";  
  54.     private final static String mbRootPath = "/apps/wp2pcs";  
  55.     private String mCurrentPath = mbRootPath;  
  56.     private String mLocalPath;  
  57.     private Handler mbUiThreadHandler = new Handler();  
  58.     private final static String POSITION = "position";  
  59.     private final static String OPERATION = "operation";  
  60.     private final static String FILEPATH = "file_path";  
  61.   
  62.     @Override  
  63.     protected void onCreate(Bundle savedInstanceState) {  
  64.         super.onCreate(savedInstanceState);  
  65.         setContentView(R.layout.activity_pcs);  
  66.   
  67.         tv_desc = (TextView)findViewById(R.id.tv_desc);  
  68.         tv_path = (TextView)findViewById(R.id.tv_path);  
  69.         lv_content = (ListView)findViewById(R.id.lv_content);  
  70.         lv_content.setOnItemClickListener(this);  
  71.         lv_content.setOnItemLongClickListener(this);  
  72.         btn_login = (Button)findViewById(R.id.btn_login);  
  73.         btn_logout = (Button)findViewById(R.id.btn_logout);  
  74.         btn_upload = (Button)findViewById(R.id.btn_upload);  
  75.         btn_rename = (Button)findViewById(R.id.btn_rename);  
  76.         btn_back = (Button)findViewById(R.id.btn_back);  
  77.         btn_create = (Button)findViewById(R.id.btn_create);  
  78.         btn_login.setOnClickListener(this);  
  79.         btn_logout.setOnClickListener(this);  
  80.         btn_upload.setOnClickListener(this);  
  81.         btn_rename.setOnClickListener(this);  
  82.         btn_back.setOnClickListener(this);  
  83.         btn_create.setOnClickListener(this);  
  84.         mLocalPath = Environment.getExternalStorageDirectory().toString()+"/Download";  
  85.     }  
  86.   
  87.     @Override  
  88.     public void onClick(View v) {  
  89.         if (v.getId() == R.id.btn_login) {  
  90.             login();  
  91.         } else if (v.getId() == R.id.btn_logout) {  
  92.             logout();  
  93.         } else if (v.getId() == R.id.btn_upload) {  
  94.             upload("2.txt");  
  95.         } else if (v.getId() == R.id.btn_rename) {  
  96.             rename();  
  97.         } else if (v.getId() == R.id.btn_back) {  
  98.             if (null != mbOauth) {  
  99.                 if (mCurrentPath.equals(mbRootPath)) {  
  100.                     showTip("当前已是根目录");  
  101.                 } else {  
  102.                     mCurrentPath = mCurrentPath.substring(0, mCurrentPath.lastIndexOf("/"));  
  103.                     getList(mCurrentPath);  
  104.                 }  
  105.             }  
  106.         } else if (v.getId() == R.id.btn_create) {  
  107.             InputDialogFragment dialog = InputDialogFragment.newInstance("请输入目录名称");  
  108.             String fragTag = getResources().getString(R.string.app_name);  
  109.             dialog.show(getFragmentManager(), fragTag);  
  110.         }  
  111.     }  
  112.       
  113.     private void showTip(String message) {  
  114.         Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();  
  115.     }  
  116.       
  117.     //登录  
  118.     private void login() {  
  119.         BaiduOAuth oauthClient = new BaiduOAuth();  
  120.         oauthClient.startOAuth(this, mbApiKey, new String[]{"basic""netdisk"}, new BaiduOAuth.OAuthListener() {  
  121.             @Override  
  122.             public void onException(String msg) {  
  123.                 showTip("Login failed " + msg);  
  124.             }  
  125.             @Override  
  126.             public void onComplete(BaiduOAuthResponse response) {  
  127.                 if (null != response) {  
  128.                     mbOauth = response.getAccessToken();  
  129.                     showTip("Token: " + mbOauth + "    User name:" + response.getUserName());  
  130.                     tv_desc.setText("当前登录用户是"+response.getUserName()+",token为"+mbOauth);  
  131.                     getQuota();  
  132.                     getList(mbRootPath);  
  133.                 }  
  134.             }  
  135.             @Override  
  136.             public void onCancel() {  
  137.                 showTip("Login cancelled");  
  138.             }  
  139.         });  
  140.     }  
  141.       
  142.     //获取磁盘空间  
  143.     private void getQuota() {  
  144.         if (null != mbOauth) {  
  145.             Thread workThread = new Thread(new Runnable() {  
  146.                 @Override  
  147.                 public void run() {  
  148.                     BaiduPCSClient api = new BaiduPCSClient();  
  149.                     api.setAccessToken(mbOauth);  
  150.                     final PCSQuotaResponse info = api.quota();  
  151.                     mbUiThreadHandler.post(new Runnable() {  
  152.                         public void run() {  
  153.                             if (null != info) {  
  154.                                 if (0 == info.status.errorCode) {  
  155.                                     showTip("Quota :" + info.total + "  used: " + info.used);  
  156.                                     tv_desc.setText(tv_desc.getText()+"\n网盘总容量是"+info.total/1024/1024+"M,已经使用"+info.used/1024/1024+"M.");  
  157.                                 } else {  
  158.                                     showTip("Quota failed: " + info.status.errorCode + "  " + info.status.message);  
  159.                                 }  
  160.                             }  
  161.                         }  
  162.                     });  
  163.                 }  
  164.             });  
  165.             workThread.start();  
  166.         }  
  167.     }  
  168.       
  169.     //注销  
  170.     private void logout() {  
  171.         if (null != mbOauth) {  
  172.             Thread workThread = new Thread(new Runnable() {  
  173.                 @Override  
  174.                 public void run() {  
  175.                     BaiduOAuth oauth = new BaiduOAuth();  
  176.                     final boolean ret = oauth.logout(mbOauth);  
  177.                     mbUiThreadHandler.post(new Runnable() {  
  178.                         @Override  
  179.                         public void run() {  
  180.                             showTip("Logout " + ret);  
  181.                         }  
  182.                     });   
  183.                 }  
  184.             });  
  185.             workThread.start();  
  186.         }  
  187.     }  
  188.   
  189.     private List<PCSCommonFileInfo> mFileList = new ArrayList<PCSCommonFileInfo>();  
  190.     //获取文件/目录列表  
  191.     private void getList(final String path) {  
  192.         if (null != mbOauth) {  
  193.             Thread workThread = new Thread(new Runnable() {  
  194.                 @Override  
  195.                 public void run() {  
  196.                     BaiduPCSClient api = new BaiduPCSClient();  
  197.                     api.setAccessToken(mbOauth);  
  198.                     final PCSListInfoResponse ret = api.list(path, "name""asc");  
  199.                     mbUiThreadHandler.post(new Runnable() {  
  200.                         public void run() {  
  201.                             if (ret.status.errorCode == 0) {  
  202.                                 mFileList.clear();  
  203.                                 mFileList = ret.list;  
  204.                                 FileListAdapter adapter = new FileListAdapter(getApplicationContext(), mFileList);  
  205.                                 lv_content.setAdapter(adapter);  
  206.                                 tv_path.setText("当前目录是"+mCurrentPath);  
  207.                             } else {  
  208.                                 tv_path.setText("获取目录"+mCurrentPath+"失败,原因是"+ret.status.message);  
  209.                             }  
  210.                         }  
  211.                     });  
  212.                 }  
  213.             });  
  214.             workThread.start();  
  215.         }  
  216.     }  
  217.   
  218.     @Override  
  219.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  220.         PCSCommonFileInfo file = mFileList.get(position);  
  221.         if (file.isDir == true) {  
  222.             mCurrentPath = file.path;  
  223.             showTip("您点击了目录"+mCurrentPath);  
  224.             getList(mCurrentPath);  
  225.         } else {  
  226.             ConfirmDialogFragment fsf = ConfirmDialogFragment.newInstance(  
  227.                     R.drawable.ic_launcher, "下载确认""是否下载文件"+file.path+"?");  
  228.             Map<String, Object> map_param = new HashMap<String, Object>();  
  229.             map_param.put(OPERATION, "download");  
  230.             map_param.put(POSITION, position);  
  231.             map_param.put(FILEPATH, file.path);  
  232.             fsf.setParam(map_param);  
  233.             fsf.show(getFragmentManager(), "");  
  234.         }  
  235.     }  
  236.   
  237.     @Override  
  238.     public boolean onItemLongClick(AdapterView<?> parent, View view,  
  239.             int position, long id) {  
  240.         PCSCommonFileInfo file = mFileList.get(position);  
  241.         String desc = String.format("是否删除%s%s?", file.isDir?"目录":"文件", file.path);  
  242.         ConfirmDialogFragment fsf = ConfirmDialogFragment.newInstance(  
  243.                 R.drawable.ic_launcher, "删除确认", desc);  
  244.         Map<String, Object> map_param = new HashMap<String, Object>();  
  245.         map_param.put(OPERATION, "delete");  
  246.         map_param.put(POSITION, position);  
  247.         map_param.put(FILEPATH, file.path);  
  248.         fsf.setParam(map_param);  
  249.         fsf.show(getFragmentManager(), "");  
  250.         return true;  
  251.     }  
  252.   
  253.     @Override  
  254.     public void onConfirmSelect(Map<String, Object> map_param) {  
  255.         String operation = (String) map_param.get(OPERATION);  
  256.         if (operation.equals("delete")) {  
  257.             int position = (Integer) map_param.get(POSITION);  
  258.             PCSCommonFileInfo file = mFileList.get(position);  
  259.             deletePCSFile(file.path);  
  260.         } else if (operation.equals("download")) {  
  261.             String file = (String) map_param.get(FILEPATH);  
  262.             download(file);  
  263.         }  
  264.     }  
  265.   
  266.     @Override  
  267.     public void onInput(String dir) {  
  268.         createDir(dir);  
  269.     }  
  270.   
  271.     //创建目录  
  272.     private void createDir(final String dir) {  
  273.         if (null != mbOauth) {  
  274.             Thread workThread = new Thread(new Runnable() {  
  275.                 @Override  
  276.                 public void run() {  
  277.                     BaiduPCSClient api = new BaiduPCSClient();  
  278.                     api.setAccessToken(mbOauth);  
  279.                     String path = mCurrentPath + "/" + dir;  
  280.                     final PCSFileInfoResponse ret = api.makeDir(path);  
  281.                     mbUiThreadHandler.post(new Runnable() {  
  282.                         public void run() {  
  283.                             showTip("Mkdir:  " + ret.status.errorCode + "   " + ret.status.message);  
  284.                             getList(mCurrentPath);  
  285.                         }  
  286.                     });   
  287.                 }  
  288.             });  
  289.             workThread.start();  
  290.         }  
  291.     }  
  292.   
  293.     //删除文件。注意不能用deleteFile这个函数名,因为deleteFile在ContextWrapper类中已经定义  
  294.     private void deletePCSFile(final String file_path) {  
  295.         if (null != mbOauth) {  
  296.             Thread workThread = new Thread(new Runnable() {  
  297.                 @Override  
  298.                 public void run() {  
  299.                     BaiduPCSClient api = new BaiduPCSClient();  
  300.                     api.setAccessToken(mbOauth);  
  301.                     List<String> files = new ArrayList<String>();  
  302.                     files.add(file_path);  
  303.                     final PCSSimplefiedResponse ret = api.deleteFiles(files);  
  304.                     mbUiThreadHandler.post(new Runnable() {  
  305.                         public void run() {  
  306.                             showTip("Delete files:  " + ret.errorCode + "  " + ret.message);  
  307.                             getList(mCurrentPath);  
  308.                         }  
  309.                     });   
  310.                 }  
  311.             });  
  312.             workThread.start();  
  313.         }  
  314.     }  
  315.       
  316.     private BaiduPCSStatusListener mStatusListener = new BaiduPCSStatusListener() {  
  317.         @Override  
  318.         public void onProgress(long bytes, long total) {  
  319.             final long bs = bytes;  
  320.             final long tl = total;  
  321.             mbUiThreadHandler.post(new Runnable() {  
  322.                 public void run() {  
  323.                     showTip("total: " + tl + "    loaded:" + bs);  
  324.                 }  
  325.             });       
  326.         }  
  327.           
  328.         @Override  
  329.         public long progressInterval() {  
  330.             return 500;  
  331.         }  
  332.     };  
  333.   
  334.     //下载文件  
  335.     private void download(final String file) {  
  336.         if (null != mbOauth) {  
  337.             final String local_file = String.format("%s/%s", mLocalPath, file.substring(1+file.lastIndexOf("/")));  
  338.             Thread workThread = new Thread(new Runnable() {  
  339.                 @Override  
  340.                 public void run() {  
  341.                     BaiduPCSClient api = new BaiduPCSClient();  
  342.                     api.setAccessToken(mbOauth);  
  343.                     final PCSSimplefiedResponse ret = api.downloadFileFromStream(file, local_file, mStatusListener);  
  344.                     mbUiThreadHandler.post(new Runnable() {  
  345.                         public void run() {  
  346.                             Log.d(TAG, "Download files:  " + ret.errorCode + "   " + ret.message);  
  347.                             showTip("download:  " + ret.errorCode + "   " + ret.message);  
  348.                         }  
  349.                     });   
  350.                 }  
  351.             });  
  352.             workThread.start();  
  353.         }  
  354.     }  
  355.   
  356.     // 上传文件  
  357.     private void upload(String file) {  
  358.         if (null != mbOauth) {  
  359.             final String local_file = String.format("%s/%s", mLocalPath, file);  
  360.             final String remote_file = String.format("%s/%s", mCurrentPath, file);  
  361.             Thread workThread = new Thread(new Runnable() {  
  362.                 @Override  
  363.                 public void run() {  
  364.                     BaiduPCSClient api = new BaiduPCSClient();  
  365.                     api.setAccessToken(mbOauth);  
  366.                     final PCSFileInfoResponse response = api.uploadFile(local_file, remote_file, mStatusListener);  
  367.                     mbUiThreadHandler.post(new Runnable() {  
  368.                         public void run() {  
  369.                             showTip("upload:  " + response.status.errorCode + "  " + response.status.message + "  " + response.commonFileInfo.blockList);  
  370.                             getList(mCurrentPath);  
  371.                         }  
  372.                     });   
  373.                 }  
  374.             });  
  375.             workThread.start();  
  376.         }  
  377.     }  
  378.   
  379.     //文件改名  
  380.     private void rename() {  
  381.         if (null != mbOauth) {  
  382.             Thread workThread = new Thread(new Runnable() {  
  383.                 @Override  
  384.                 public void run() {  
  385.                     BaiduPCSClient api = new BaiduPCSClient();  
  386.                     api.setAccessToken(mbOauth);  
  387.                     List<PCSFileFromToInfo> info = new ArrayList<PCSFileFromToInfo>();  
  388.                     PCSFileFromToInfo data1 = new PCSFileFromToInfo();  
  389.                     data1.from = mCurrentPath + "/2.txt";  
  390.                     data1.to = "1.txt";  
  391.                     info.add(data1);  
  392.                     Log.d(TAG, "from="+data1.from+",to="+data1.to);  
  393.                     final PCSFileFromToResponse ret = api.rename(info);  
  394.                     mbUiThreadHandler.post(new Runnable() {  
  395.                         public void run() {  
  396.                             showTip("Rename:  " + ret.status.errorCode + "    " + ret.status.message);  
  397.                             getList(mCurrentPath);  
  398.                         }  
  399.                     });   
  400.                 }  
  401.             });  
  402.             workThread.start();  
  403.         }  
  404.     }  
  405.   
  406. }  


阿里云

阿里云的存储服务又称oss(Online Storage Service),现只提供收费服务,最经济的是40G空间半年5元,或一年9元,个人开发者的app有一定用户量时可以考虑购买。


阿里云的sdk的集成比较简单,官方也有提供demo,这里就不再赘述了。下面是阿里云对文件存储进行基本操作的代码示例:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.widget.Button;  
  5.   
  6. import com.alibaba.sdk.android.oss.ClientConfiguration;  
  7. import com.alibaba.sdk.android.oss.OSS;  
  8. import com.alibaba.sdk.android.oss.OSSClient;  
  9. import com.alibaba.sdk.android.oss.common.OSSLog;  
  10. import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;  
  11. import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;  
  12.   
  13. import com.example.exmnetdisk.R;  
  14.   
  15. public class AliyunActivity extends Activity {  
  16.     private OSS oss;  
  17.   
  18.     // 以下字段为注册账号并开通oss服务后由阿里云自动分配  
  19.     private static final String endpoint = "http://oss-cn-shanghai.aliyuncs.com";  
  20.     private static final String accessKeyId = "<accessKeyId>";  
  21.     private static final String accessKeySecret = "<accessKeySecret>";  
  22.     private static final String testBucket = "<testBucket>";  
  23.       
  24.     // 需付费购买存储空间,才能正常使用上传、下载、列表等功能  
  25.     private static final String uploadFilePath = "<upload_file_path>"//上传的目录  
  26.     private static final String uploadObject = "sampleObject"//上传的文件  
  27.     private static final String downloadObject = "sampleObject"//下载的文件  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_aliyun);  
  33.   
  34.         OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);  
  35.   
  36.         ClientConfiguration conf = new ClientConfiguration();  
  37.         conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒  
  38.         conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒  
  39.         conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个  
  40.         conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次  
  41.         OSSLog.enableLog();  
  42.         oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);  
  43.   
  44.         // 上传  
  45.         Button upload = (Button) findViewById(R.id.upload);  
  46.         upload.setOnClickListener(new View.OnClickListener() {  
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 new Thread(new Runnable() {  
  50.                     @Override  
  51.                     public void run() {  
  52.                         new PutObjectSamples(oss, testBucket, uploadObject, uploadFilePath).asyncPutObjectFromLocalFile();  
  53.                     }  
  54.                 }).start();  
  55.             }  
  56.         });  
  57.   
  58.         // 下载  
  59.         Button download = (Button) findViewById(R.id.download);  
  60.         download.setOnClickListener(new View.OnClickListener() {  
  61.             @Override  
  62.             public void onClick(View v) {  
  63.                 new Thread(new Runnable() {  
  64.                     @Override  
  65.                     public void run() {  
  66.                         new GetObjectSamples(oss, testBucket, downloadObject).asyncGetObjectSample();  
  67.                     }  
  68.                 }).start();  
  69.             }  
  70.         });  
  71.   
  72.         // 罗列  
  73.         Button list = (Button) findViewById(R.id.list);  
  74.         list.setOnClickListener(new View.OnClickListener() {  
  75.             @Override  
  76.             public void onClick(View v) {  
  77.                 new Thread(new Runnable() {  
  78.                     @Override  
  79.                     public void run() {  
  80.                         new ListObjectsSamples(oss, testBucket).asyncListObjectsWithPrefix();  
  81.                     }  
  82.                 }).start();  
  83.             }  
  84.         });  
  85.   
  86.         // 管理  
  87.         Button manage = (Button) findViewById(R.id.manage);  
  88.         manage.setOnClickListener(new View.OnClickListener() {  
  89.             @Override  
  90.             public void onClick(View v) {  
  91.                 new Thread(new Runnable() {  
  92.                     @Override  
  93.                     public void run() {  
  94.                         new ManageObjectSamples(oss, testBucket, uploadObject).headObject();  
  95.                     }  
  96.                 }).start();  
  97.             }  
  98.         });  
  99.   
  100.         // 分块上传  
  101.         Button multipart = (Button) findViewById(R.id.multipart);  
  102.         multipart.setOnClickListener(new View.OnClickListener() {  
  103.             @Override  
  104.             public void onClick(View v) {  
  105.                 new Thread(new Runnable() {  
  106.                     @Override  
  107.                     public void run() {  
  108.                         try {  
  109.                             new MultipartUploadSamples(oss, testBucket, uploadObject, uploadFilePath).multipartUpload();  
  110.                         }  
  111.                         catch (Exception e) {  
  112.                             e.printStackTrace();  
  113.                         }  
  114.                     }  
  115.                 }).start();  
  116.             }  
  117.         });  
  118.   
  119.   
  120.         // 断点续传  
  121.         Button resumable = (Button) findViewById(R.id.resumable);  
  122.         resumable.setOnClickListener(new View.OnClickListener() {  
  123.             @Override  
  124.             public void onClick(View v) {  
  125.                 new Thread(new Runnable() {  
  126.                     @Override  
  127.                     public void run() {  
  128.                         new ResuambleUploadSamples(oss, testBucket, uploadObject, uploadFilePath).resumableUpload();  
  129.                     }  
  130.                 }).start();  
  131.             }  
  132.         });  
  133.   
  134.         // 签名URL  
  135.         Button sign = (Button) findViewById(R.id.sign);  
  136.         sign.setOnClickListener(new View.OnClickListener() {  
  137.             @Override  
  138.             public void onClick(View v) {  
  139.                 new Thread(new Runnable() {  
  140.                     @Override  
  141.                     public void run() {  
  142.                         new SignURLSamples(oss, testBucket, uploadObject, uploadFilePath).presignConstrainedURL();  
  143.                     }  
  144.                 }).start();  
  145.             }  
  146.         });  
  147.   
  148.         // bucket管理  
  149.         Button bucket = (Button) findViewById(R.id.bucket);  
  150.         bucket.setOnClickListener(new View.OnClickListener() {  
  151.             @Override  
  152.             public void onClick(View v) {  
  153.                 new Thread(new Runnable() {  
  154.                     @Override  
  155.                     public void run() {  
  156.                         new ManageBucketSamples(oss, testBucket, uploadFilePath).deleteNotEmptyBucket();  
  157.                     }  
  158.                 }).start();  
  159.             }  
  160.         });  
  161.     }  
  162. }  






点此查看Android开发笔记的完整目录
0 0