|
1 | 1 | --- |
2 | | -title: Android SDK 使用指南 |
| 2 | +title: Android SDK使用文档 |
3 | 3 | --- |
4 | 4 |
|
5 | | -# Android SDK 使用指南 |
| 5 | +# Android SDK使用文档 |
6 | 6 |
|
7 | | -- Android SDK 下载地址:<https://github.com/qiniu/android-sdk/tags> |
8 | | -- Android SDK 源码地址:<https://github.com/qiniu/android-sdk> (请注意非 master 分支的代码在规格上可能承受变更) |
| 7 | +## 目录 |
9 | 8 |
|
10 | | -此 Android SDK 基于 [七牛云存储官方API](http://docs.qiniu.com/api/index.html) 构建。在开发者的 Android App 工程项目中使用此 SDK 能够非常方便地将 Android 系统里边的文件快速直传到七牛云存储。 |
| 9 | +- [概述](#overview) |
| 10 | +- [使用场景](#use-scenario) |
| 11 | +- [接入SDK](#integration) |
| 12 | +- [上传文件](#simple-upload) |
| 13 | +- [分片上传(断点续上传)](#resumable-upload) |
| 14 | +- [线程安全性](#thread-safety) |
11 | 15 |
|
12 | | -出于安全考虑,使用此 SDK 无需设置密钥(AccessKey / SecretKey)。所有涉及到授权的操作,比如生成上传授权凭证(uploadToken)或下载授权凭证(downloadToken)均在业务服务器端进行。 |
| 16 | +<a name="overview"></a> |
| 17 | +## 概述 |
13 | 18 |
|
14 | | -业务服务器负责生成和颁发授权,此 SDK 只负责实施具体的上传业务。 |
| 19 | +Android SDK只包含了最终用户使用场景中的必要功能。相比服务端SDK而言,客户端SDK不会包含对云存储服务的管理和配置功能。 |
15 | 20 |
|
16 | | -## 目录 |
| 21 | +该SDK支持不低于2.1的Android版本。 |
17 | 22 |
|
18 | | -- [上传流程](#upload-flow) |
19 | | -- [下载流程](#download-flow) |
20 | | -- [接入SDK](#load) |
21 | | -- [使用SDK上传文件](#upload) |
22 | | -- [SDK 内置 demo 说明](#demo) |
23 | | -- [并发特性](#concurrency) |
24 | | -- [贡献代码](#contributing) |
25 | | -- [许可证](#license) |
| 23 | +<a name="use-scenario"></a> |
| 24 | +## 使用场景 |
26 | 25 |
|
27 | | -<a name="upload-flow"></a> |
| 26 | +在使用Android SDK开发基于七牛云存储的应用之前,请注意理解合适的开发场景。客户端属于不可控的场景,非一般用户在拿到客户端后可能会对其进行反向工程,因此客户端程序中不可包含任何可能导致安全漏洞的业务逻辑和关键信息。 |
28 | 27 |
|
29 | | -## 上传流程 |
| 28 | +我们推荐的安全模型如下所示。 |
30 | 29 |
|
31 | | -1. 业务服务器使用七牛云存储服务端编程语言(如 PHP/Python/Ruby/Java)SDK 生成 uploadToken (上传授权凭证) |
| 30 | + |
32 | 31 |
|
33 | | -2. 客户端 Android 使用该 uploadToken 调用此 Android 封装的上传方法直传文件到七牛云存储 |
| 32 | +开发者需要合理划分客户端程序和业务服务器的职责范围。分发给最终用户的客户端程序中不应有需要使用管理凭证及SecretKey的场景。这些可能导致安全风险的使用场景均应被设计为在业务服务器上进行。 |
34 | 33 |
|
35 | | -3. 文件直传成功,七牛云存储向 uploadToken 生成之前所指定的业务服务器地址发起回调 |
| 34 | +更多的相关内容请查看[编程模型](http://developer.qiniu.com/docs/v6/api/overview/programming-model.html)和[安全机制](http://developer.qiniu.com/docs/v6/api/overview/security.html)。 |
36 | 35 |
|
37 | | -4. 业务服务器接收来自七牛云存储回调的 POST 请求,处理相关 POST 参数,最后响应输出一段 JSON |
| 36 | +<a name="load"></a> |
| 37 | +## 接入SDK |
38 | 38 |
|
39 | | -5. 七牛云存储接收业务服务器响应输出的这段 JSON,原封不动地通过 HTTP 返回给 Android 客户端程序 |
| 39 | +> TODO: 如何将该SDK整合到工作项目中?使用jar包?拷贝源文件? |
40 | 40 |
|
| 41 | +<a name="upload"></a> |
| 42 | +## 上传文件 |
41 | 43 |
|
42 | | -注意事项: |
| 44 | +开发者可以选择SDK提供的两种上传方式:表单上传和分片上传。表单上传使用一个HTTP POST请求完成文件的上传,因此比较适合较小的文件和较好的网络环境。相比而言,分片上传更能适应不稳定的网络环境,也比较适合上传比较大的文件(数百MB或更大)。 |
43 | 45 |
|
44 | | -- 此 Android SDK 当前只提供上传方法,即负责上述流程中的第2个步骤。 |
45 | | -- 业务服务器响应回调请求后输出 JSON,HTTP Headers 必须输出 `Content-Type` 为 `application/json`。 |
46 | | -- 文件上传成功后,业务服务器输出的 JSON 数据,可从所调用SDK上传代码的返回值中获取到。 |
| 46 | +若需深入了解上传方式之间的区别,请查看[上传类型](http://developer.qiniu.com/docs/v6/api/overview/up/upload-models.html#upload-types),[表单上传接口说明](http://developer.qiniu.com/docs/v6/api/overview/up/form-upload.html),[分片上传接口说明(断点续上传)](http://developer.qiniu.com/docs/v6/api/overview/up/chunked-upload.html)。 |
47 | 47 |
|
| 48 | +<a name="form-upload"></a> |
| 49 | +### 表单上传 |
48 | 50 |
|
49 | | -<a name="download-flow"></a> |
| 51 | +开发者可以通过调用`IO.put()`方法来以表单形式上传一个文件。该方法的详细说明如下: |
50 | 52 |
|
51 | | -## 下载流程 |
| 53 | +``` |
| 54 | +public void put(String key, |
| 55 | + InputStreamAt isa, |
| 56 | + PutExtra extra, |
| 57 | + JSONObjectRet ret); |
| 58 | +``` |
52 | 59 |
|
53 | | -此 Android SDK 没有提供下载文件的方法。所有上传到七牛云存储的文件,都能以如下方式进行访问: |
| 60 | +参数说明: |
54 | 61 |
|
55 | | -公开资源: |
| 62 | +参数 | 类型 | 说明 |
| 63 | +:---: | :----: | :--- |
| 64 | +key | String | 将保存为的资源唯一标识。请参见[关键概念:键值对](http://developer.qiniu.com/docs/v6/api/overview/concepts.html#key-value)。 |
| 65 | +isa | InputStreamAt | 待上传的本地文件。 |
| 66 | +extra | PutExtra | 额外配置项,用于精确控制上传行为。请参见[高级设置](#upload-config)。 |
| 67 | +ret | JSONObjectRet | 开发者需实现该接口以获取上传进度和上传结果。<br>若上传成功,该接口中的`onSuccess()`方法将被调用。否则`onFailure()`方法将被调用。 |
56 | 68 |
|
57 | | - http://<domain>/<key> |
| 69 | +表单上传的示例代码请参见SDK示例中[MyActivity.doUpload()](https://github.com/qiniu/android-sdk/blob/develop/src/com/qiniu/demo/MyActivity.java)方法的实现。 |
58 | 70 |
|
59 | | -私有资源: |
| 71 | +<a name="chunked-upload"></a> |
| 72 | +### 分片上传 |
60 | 73 |
|
61 | | - http://<domain>/<key>?token=<downloadToken> |
| 74 | +顾名思义,分片上传会将一个文件划分为多个指定大小的数据块,分别上传。分片上传的关键价值在于可更好的适应不稳定的网络环境,以及成功上传超大的文件。分片上传功能也是实现断点续上传功能的基础。 |
62 | 75 |
|
63 | | -其中\<domain\>是bucket所对应的域名。七牛云存储为每一个bucket提供一个默认域名。默认域名可以到[七牛云存储开发者平台](https://portal.qiniu.com/)中,空间设置的域名设置一节查询。 |
| 76 | +开发者可以通过调用`ResumableIO.put()`方法以分片形式上传一个文件。该方法签名和`IO.put()`一致。 |
64 | 77 |
|
65 | | -出于安全考虑,此 SDK 不提供 `downloadToken` 的生成。除 Android / iOS SDK 以外,七牛云存储其他编程语言的 SDK 都有提供签发私有资源下载授权凭证(downloadToken)的实现。 |
| 78 | +分片上传的示例代码请参见SDK示例中[MyResumableActivity.doResumableUpload()](https://github.com/qiniu/android-sdk/blob/develop/src/com/qiniu/demo/MyResumableActivity.java)方法的实现。 |
66 | 79 |
|
67 | | -**注意: key必须采用utf8编码,如使用非utf8编码访问七牛云存储将反馈错误** |
| 80 | +<a name="resumable-upload"></a> |
| 81 | +### 断点续上传 |
68 | 82 |
|
69 | | -<a name="load"></a> |
| 83 | +开发者可以基于分片上传机制实现断点续上传功能。 |
70 | 84 |
|
71 | | -## 接入SDK |
| 85 | +> TODO: 该SDK是否已经支持断点续上传功能?基本的要求是可反馈完整的进度信息给开发者进行持久化,并且在上传时可以传入之前持久化的上传进度信息。 |
72 | 86 |
|
73 | | -本SDK的开发环境是 [Intellij IDEA](http://www.jetbrains.com/idea/),如果开发者使用的编辑器同为 IDEA, 直接打开项目即可,对于使用 [Eclipse](http://www.eclipse.org/) 编辑器的开发者,可以尝试导入项目。 |
| 87 | +<a name="upload-concurrency"></a> |
| 88 | +### 上传中的并发性 |
74 | 89 |
|
75 | | -导入后,填写相关必要参数即可运行SDK自带的 demo 程序,配置方法见 [SDK 内置 demo 说明](#demo) 。 |
| 90 | +分片上传机制也提供了对一个文件并发上传的能力。 |
76 | 91 |
|
| 92 | +> TODO: 现在这个SDK可以设置并发数量吗? |
77 | 93 |
|
78 | | -<a name="upload"></a> |
79 | | - |
80 | | -## 使用SDK上传文件 |
81 | | - |
82 | | -在 Android 中选择文件一般是通过 uri 作为路径, 一般调用以下代码 |
83 | | - |
84 | | -```{java} |
85 | | -// 在七牛绑定的对应bucket的域名. 默认是bucket.qiniudn.com |
86 | | -public static String bucketName = "bucketName"; |
87 | | -public static String domain = bucketName + ".qiniudn.com"; |
88 | | -// upToken 这里需要自行获取. SDK 将不实现获取过程. 当token过期后才再获取一遍 |
89 | | -public String UP_TOKEN = "token"; |
90 | | -
|
91 | | -boolean uploading = false; |
92 | | -/** |
93 | | - * 普通上传文件 |
94 | | - * @param uri |
95 | | - */ |
96 | | -private void doUpload(Uri uri) { |
97 | | - if (uploading) { |
98 | | - hint.setText("上传中,请稍后"); |
99 | | - return; |
100 | | - } |
101 | | - uploading = true; |
102 | | - String key = IO.UNDEFINED_KEY; // 自动生成key |
103 | | - PutExtra extra = new PutExtra(); |
104 | | - extra.checkCrc = PutExtra.AUTO_CRC32; |
105 | | - extra.params.put("x:arg", "value"); |
106 | | - hint.setText("上传中"); |
107 | | - IO.putFile(this, UP_TOKEN, key, uri, extra, new JSONObjectRet() { |
108 | | - @Override |
109 | | - public void onSuccess(JSONObject resp) { |
110 | | - uploading = false; |
111 | | - String hash; |
112 | | - String value; |
113 | | - try { |
114 | | - hash = resp.getString("hash"); |
115 | | - value = resp.getString("x:arg"); |
116 | | - } catch (Exception ex) { |
117 | | - hint.setText(ex.getMessage()); |
118 | | - return; |
119 | | - } |
120 | | - String redirect = "http://" + domain + "/" + hash; |
121 | | - hint.setText("上传成功! " + hash); |
122 | | - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(redirect)); |
123 | | - startActivity(intent); |
124 | | - } |
125 | | -
|
126 | | - @Override |
127 | | - public void onFailure(Exception ex) { |
128 | | - uploading = false; |
129 | | - hint.setText("错误: " + ex.getMessage()); |
130 | | - } |
131 | | - }); |
132 | | -} |
133 | | -``` |
134 | | - |
| 94 | +<a name="upload-config"></a> |
| 95 | +### 高级设置 |
135 | 96 |
|
136 | | -<a name="demo"></a> |
| 97 | +几种不同的上传类型都支持上传时的参数配置,使用一个统一的`PutExtra`类型来管理。除了需要指定几个最基本的上传参数(哪个文件以及上传到哪里等)外,开发者还可以通过制定一系列高级参数来灵活的控制上传的后续动作和通过变量来传递一些特定信息。 |
137 | 98 |
|
138 | | -## SDK 内置 demo 说明 |
| 99 | +设置方法请参见[`PutExtra`](https://github.com/qiniu/android-sdk/blob/develop/src/com/qiniu/resumableio/PutExtra.java)。开发者可以在调用`ResumableIO.put()`前往`PutExtra.params`中添加对应的参数即可,例如: |
139 | 100 |
|
140 | | -注意:demo 程序无法直接运行,需要配置 `UpToken`, `BucketName`, `Domain`信息, 将其填写到 MyActivity 之中。`key`值可以在操作界面修改。当文件上传成功时,会试图跳转到浏览器访问已经上传的资源。如果失败,会toast提示。 |
| 101 | +``` |
| 102 | +extra.params = new HashMap<String, String>(); |
| 103 | +extra.params.put("x:a", "bb"); // 设置一个自定义变量 |
| 104 | +``` |
141 | 105 |
|
| 106 | +<a name="response"></a> |
| 107 | +#### 上传后续动作 |
142 | 108 |
|
143 | | -<a name="concurrency"></a> |
| 109 | +关于上传后可以进行哪些后续动作,请查看[上传后续动作](http://developer.qiniu.com/docs/v6/api/overview/up/response/)。上传的后续动作的设置通过在`PutExtra`中设置相应的参数来进行。对于Android开发者而言,这些后续动作都有各自的合适使用场景:[自定义响应内容](http://developer.qiniu.com/docs/v6/api/overview/up/response/response-body.html),[变量](http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html),[数据预处理](http://developer.qiniu.com/docs/v6/api/overview/up/response/persistent-op.html),[回调](http://developer.qiniu.com/docs/v6/api/overview/up/response/callback.html)。 |
144 | 110 |
|
145 | | -## 并发特性 |
| 111 | +对这些后续动作的合理组合使用可以大幅降低业务流程复杂度,并提升业务的健壮性。 |
146 | 112 |
|
147 | | -此 Android SDK 不是线程安全的,请勿在没有保护的情况下跨线程使用。 |
| 113 | +举例说明,如果用户上传的是一个xxx格式的视频文件,开发者可以设置让该视频文件上传完成后转码为设定的目标格式。对应的设置项如下所示: |
148 | 114 |
|
| 115 | +参数名称 | 参数内容 | 说明 |
| 116 | +:---: | :----: | :--- |
| 117 | +persistentOp | TODO:xxxxx | 符合数据处理规范的指令。这个指令表示要将码率调整为xxx,分辨率调整为xxx。 |
| 118 | +persistentNotifyUrl | TODO:xxxxx | 结果通知地址,通常是向业务服务器发送该指定的请求。 |
149 | 119 |
|
150 | | -<a name="contributing"></a> |
| 120 | +> TODO:填写真实有效的一个示例。 |
151 | 121 |
|
152 | | -## 贡献代码 |
| 122 | +完整的可设置参数和规格请参见[上传策略规格](http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html)。 |
153 | 123 |
|
154 | | -1. Fork |
155 | | -2. 创建您的特性分支 (`git checkout -b my-new-feature`) |
156 | | -3. 提交您的改动 (`git commit -am 'Added some feature'`) |
157 | | -4. 将您的修改记录提交到远程 `git` 仓库 (`git push origin my-new-feature`) |
158 | | -5. 然后到 github 网站的该 `git` 远程仓库的 `my-new-feature` 分支下发起 Pull Request |
| 124 | +<a name="var"></a> |
| 125 | +#### 变量 |
159 | 126 |
|
| 127 | +变量分为魔法变量和自定义变量,可帮助开发者快速的在客户端、业务服务器、云存储服务之间传递资源元信息。关于变量的作用,请参见[变量](http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html)。 |
160 | 128 |
|
161 | | -<a name="license"></a> |
| 129 | +如同上面已经给出的示例,如果开发者需要配置变量,只需在调用上传方法前在`PutExtra.params`中添加相应的参数即可。 |
162 | 130 |
|
163 | | -## 许可证 |
| 131 | +<a name="download"></a> |
| 132 | +## 下载文件 |
164 | 133 |
|
165 | | -Copyright (c) 2013 www.qiniu.com |
| 134 | +该SDK并未提供下载文件相关的功能接口,因为文件下载是一个标准的HTTP GET过程。开发者只需理解资源URI的组成格式即可非常方便的构建资源URI,并在必要的时候加上下载凭证,即可使用HTTP GET请求获取相应资源。 |
166 | 135 |
|
167 | | -基于 MIT 协议发布: |
| 136 | +具体做法请参见[资源下载](http://developer.qiniu.com/docs/v6/api/overview/dn/download.html)和[资源下载的安全机制](http://developer.qiniu.com/docs/v6/api/overview/dn/security.html)。 |
168 | 137 |
|
169 | | -* [www.opensource.org/licenses/MIT](http://www.opensource.org/licenses/MIT) |
| 138 | +<a name="thread-safety"></a> |
| 139 | +## 线程安全性 |
170 | 140 |
|
| 141 | +此 Android SDK 不是线程安全的,请勿在没有保护的情况下跨线程使用。 |
0 commit comments