diff --git a/.travis.yml b/.travis.yml index e3da938a1..3ff2fa49a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ android: - tools # The BuildTools version used by your project - - build-tools-21.0.1 + - build-tools-21.1.2 # The SDK version used to compile your project - android-21 @@ -28,5 +28,5 @@ before_script: - adb shell input keyevent 82 & script: - - ./gradlew build - - ./gradlew connectedAndroidTest --info \ No newline at end of file +# - ./gradlew build + - ./gradlew connectedAndroidTest --info diff --git a/CHANGELOG.md b/CHANGELOG.md index e5fcf45c0..2966e1774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ #Changelog +## 7.0.2 (2015-01-22) + +### 增加 +* 记录请求花费时间 +* 纪录节点日志,节点对应的IP +* 添加详细注释 +* 支持代理 +* 重构,增加了默认参数 +* 升级构建脚本 + +### 修正 +* mimeType设置不正确的问题 +* 当参数出现空字符串时,上传失败 +* 出现5xx失败时,应回源站上传 + ## 7.0.1 (2014-10-29) ### 增加 diff --git a/README.md b/README.md index 1a0d5235f..058af00bc 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ 将realease 目录中的jar 复制到项目中去,此版本sdk依赖 http://loopj.com/android-async-http/ 1.4.6及以上版本 ### 通过maven -* 如果在Adroid Studio中使用,添加dependencies `compile 'com.qiniu:qiniu-android-sdk:7.0.1'` 或在项目中添加maven依赖 +* 如果在Adroid Studio中使用,添加dependencies `compile 'com.qiniu:qiniu-android-sdk:7.0.2'` 或在项目中添加maven依赖 * 如果是eclipse, 也可以直接添加依赖来处理。 ## 使用方法 diff --git a/build.gradle b/build.gradle index 6356aabdc..741f70e77 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/library/build.gradle b/library/build.gradle index ed6f94f1c..c864534c1 100755 --- a/library/build.gradle +++ b/library/build.gradle @@ -21,7 +21,7 @@ int code = versionNameToCode(version) android { compileSdkVersion 21 - buildToolsVersion '21.1.1' + buildToolsVersion '21.1.2' defaultConfig { //applicationId "com.qiniu.android" minSdkVersion 8 @@ -32,8 +32,9 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.loopj.android:android-async-http:1.4.6' +// compile 'com.android.support:appcompat-v7:21.0.3' + compile fileTree(include: ['*.jar'], dir: 'libs') } task releaseJar(type: Copy, dependsOn: 'build') { @@ -46,4 +47,4 @@ task releaseJar(type: Copy, dependsOn: 'build') { setProperty('VERSION_NAME', version) setProperty('VERSION_CODE', code) -//apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' +apply from: '../mvn_push.gradle' diff --git a/library/library.iml b/library/library.iml index 26ea2b1e2..e18a7ba37 100644 --- a/library/library.iml +++ b/library/library.iml @@ -80,6 +80,7 @@ + diff --git a/library/src/main/java/com/qiniu/android/common/Config.java b/library/src/main/java/com/qiniu/android/common/Config.java index a335cc672..7d86d8da9 100644 --- a/library/src/main/java/com/qiniu/android/common/Config.java +++ b/library/src/main/java/com/qiniu/android/common/Config.java @@ -4,7 +4,7 @@ * Created by bailong on 14/10/8. */ public final class Config { - public static final String VERSION = "7.0.1"; + public static final String VERSION = "7.0.2"; /** * 默认上传服务器 diff --git a/library/src/main/java/com/qiniu/android/http/CompletionHandler.java b/library/src/main/java/com/qiniu/android/http/CompletionHandler.java index 044ad556d..56297d2d6 100644 --- a/library/src/main/java/com/qiniu/android/http/CompletionHandler.java +++ b/library/src/main/java/com/qiniu/android/http/CompletionHandler.java @@ -8,6 +8,8 @@ public interface CompletionHandler { /** * 用户自定义的处理对象必须实现的接口方法 + * @param info 响应的调试信息 + * @param response 响应的数据 */ void complete(ResponseInfo info, JSONObject response); } diff --git a/library/src/main/java/com/qiniu/android/http/ProgressHandler.java b/library/src/main/java/com/qiniu/android/http/ProgressHandler.java index 1596d947e..fc0059c4f 100644 --- a/library/src/main/java/com/qiniu/android/http/ProgressHandler.java +++ b/library/src/main/java/com/qiniu/android/http/ProgressHandler.java @@ -6,6 +6,8 @@ public interface ProgressHandler { /** * 用户自定义进度处理对象必须实现的接口方法 + * @param bytesWritten 已经写入字节 + * @param totalSize 总字节数 */ void onProgress(int bytesWritten, int totalSize); } diff --git a/library/src/main/java/com/qiniu/android/http/ResponseHandler.java b/library/src/main/java/com/qiniu/android/http/ResponseHandler.java index 35a5e8daf..9f036b20a 100644 --- a/library/src/main/java/com/qiniu/android/http/ResponseHandler.java +++ b/library/src/main/java/com/qiniu/android/http/ResponseHandler.java @@ -73,6 +73,8 @@ private static ResponseInfo buildResponseInfo(int statusCode, Header[] headers, xvia = h.getValue(); } else if ("X-Px".equals(h.getName())){ xvia = h.getValue(); + } else if ("Fw-Via".equals(h.getName())){ + xvia = h.getValue(); } } } @@ -153,7 +155,7 @@ public void onStart() { /** * hack the method for dns in background before receive msg in main looper - * @param msg + * @param msg 发送的状态信息 */ @Override protected void sendMessage(Message msg) { diff --git a/library/src/main/java/com/qiniu/android/storage/Recorder.java b/library/src/main/java/com/qiniu/android/storage/Recorder.java index f33fe953d..450a45c55 100644 --- a/library/src/main/java/com/qiniu/android/storage/Recorder.java +++ b/library/src/main/java/com/qiniu/android/storage/Recorder.java @@ -7,16 +7,21 @@ public interface Recorder { /** * 新建或更新文件分片上传的进度 + * @param key 持久化的键 + * @param data 持久化的内容 */ void set(String key, byte[] data); /** * 获取文件分片上传的进度信息 + * @param key 持久化的键 + * @return 对应的信息 */ byte[] get(String key); /** * 删除文件分片上传的进度文件 + * @param key 持久化的键 */ void del(String key); } diff --git a/library/src/main/java/com/qiniu/android/storage/UploadManager.java b/library/src/main/java/com/qiniu/android/storage/UploadManager.java index 02133db6d..ed21acba2 100644 --- a/library/src/main/java/com/qiniu/android/storage/UploadManager.java +++ b/library/src/main/java/com/qiniu/android/storage/UploadManager.java @@ -10,7 +10,7 @@ /** * 七牛文件上传管理器 - *

+ * * 一般默认可以使用这个类的方法来上传数据和文件。这个类自动检测文件的大小, * 只要超过了{@link com.qiniu.android.common.Config#PUT_THRESHOLD} */ @@ -29,7 +29,7 @@ public UploadManager(Recorder recorder, KeyGenerator keyGen) { /** * - * @param recorder 本地持久化断点上传纪录的类 + * @param recorder 本地持久化断点上传纪录的类 * @param keyGen 本地持久化断点上传纪录时需要的key生成器 * @param proxy http 代理 */ diff --git a/library/src/main/java/com/qiniu/android/utils/Crc32.java b/library/src/main/java/com/qiniu/android/utils/Crc32.java index 0a1cad49b..52fbd84ba 100644 --- a/library/src/main/java/com/qiniu/android/utils/Crc32.java +++ b/library/src/main/java/com/qiniu/android/utils/Crc32.java @@ -16,6 +16,7 @@ public final class Crc32 { * @param data 二进制数据 * @param offset 起始字节索引 * @param length 校验字节长度 + * @return 校验码 */ public static long bytes(byte[] data, int offset, int length) { CRC32 crc32 = new CRC32(); @@ -27,16 +28,18 @@ public static long bytes(byte[] data, int offset, int length) { * 计算二进制字节校验码 * * @param data 二进制数据 + * @return 校验码 */ public static long bytes(byte[] data) { return bytes(data, 0, data.length); } - /** * 对文件内容计算crc32校验码 * - * @param file 需要计算crc32校验码的文件 + * @param f 需要计算crc32校验码的文件 + * @return crc校验码 + * @throws IOException 读取文件异常 */ public static long file(File f) throws IOException { FileInputStream fi = new FileInputStream(f); diff --git a/library/src/main/java/com/qiniu/android/utils/Dns.java b/library/src/main/java/com/qiniu/android/utils/Dns.java index 314d9c61e..b287d28f6 100644 --- a/library/src/main/java/com/qiniu/android/utils/Dns.java +++ b/library/src/main/java/com/qiniu/android/utils/Dns.java @@ -7,6 +7,12 @@ * Dns解析类 */ public final class Dns { + + /** + * 根据域名解析出来 IP数组 + * @param hostName 域名 + * @return IP 数组 + */ public static String[] getAddresses(String hostName){ InetAddress[] ret = null; try { @@ -22,6 +28,11 @@ public static String[] getAddresses(String hostName){ return r; } + /** + * 根据域名解析出来IP列表,并合并为一个字符串,通过';'分隔 + * @param hostName 域名 + * @return IP列表 + */ public static String getAddressesString(String hostName){ return StringUtils.join(getAddresses(hostName), ";"); } diff --git a/library/src/main/java/com/qiniu/android/utils/Etag.java b/library/src/main/java/com/qiniu/android/utils/Etag.java index 096331100..0a3c12bc6 100644 --- a/library/src/main/java/com/qiniu/android/utils/Etag.java +++ b/library/src/main/java/com/qiniu/android/utils/Etag.java @@ -49,6 +49,7 @@ public static String data(byte[] data) { * * @param file 文件对象 * @return 文件内容的etag + * @throws IOException 文件读取异常 */ public static String file(File file) throws IOException { FileInputStream fi = new FileInputStream(file); @@ -60,6 +61,7 @@ public static String file(File file) throws IOException { * * @param filePath 文件路径 * @return 文件内容的etag + * @throws IOException 文件读取异常 */ public static String file(String filePath) throws IOException { File f = new File(filePath); @@ -72,6 +74,7 @@ public static String file(String filePath) throws IOException { * @param in 数据输入流 * @param len 数据流长度 * @return 数据流的etag值 + * @throws IOException 文件读取异常 */ public static String stream(InputStream in, long len) throws IOException { if (len == 0) { @@ -87,6 +90,14 @@ public static String stream(InputStream in, long len) throws IOException { return resultEncode(blocks); } + /** + * 单块计算hash + * @param buffer 数据缓冲区 + * @param in 输入数据 + * @param len 输入数据长度 + * @return 计算结果 + * @throws IOException 读取出错 + */ private static byte[] oneBlock(byte[] buffer, InputStream in, int len) throws IOException { MessageDigest sha1 = null; try { @@ -108,6 +119,12 @@ private static byte[] oneBlock(byte[] buffer, InputStream in, int len) throws IO return sha1.digest(); } + /** + * 合并结果 + * @param sha1s 每块计算结果的列表 + * @return 最终的结果 + */ + private static String resultEncode(byte[][] sha1s) { byte head = 0x16; byte[] finalHash = sha1s[0]; diff --git a/library/src/main/java/com/qiniu/android/utils/UrlSafeBase64.java b/library/src/main/java/com/qiniu/android/utils/UrlSafeBase64.java index 7b25b7705..be5ab23d0 100644 --- a/library/src/main/java/com/qiniu/android/utils/UrlSafeBase64.java +++ b/library/src/main/java/com/qiniu/android/utils/UrlSafeBase64.java @@ -12,7 +12,9 @@ public final class UrlSafeBase64 { /** - * 编码数据 + * 编码字符串 + * @param data 待编码字符串 + * @return 结果字符串 */ public static String encodeToString(String data) { try { @@ -24,12 +26,19 @@ public static String encodeToString(String data) { return null; } + /** + * 编码数据 + * @param data 字节数组 + * @return 结果字符串 + */ public static String encodeToString(byte[] data) { return Base64.encodeToString(data, Base64.URL_SAFE | Base64.NO_WRAP); } /** * 解码数据 + * @param data 编码过的字符串 + * @return 原始数据 */ public static byte[] decode(String data) { return Base64.decode(data, Base64.URL_SAFE | Base64.NO_WRAP); diff --git a/mvn_push.gradle b/mvn_push.gradle new file mode 100644 index 000000000..54f1377c4 --- /dev/null +++ b/mvn_push.gradle @@ -0,0 +1,115 @@ +/* + * Copyright 2013 Chris Banes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: 'maven' +apply plugin: 'signing' + +def isReleaseBuild() { + return VERSION_NAME.contains("SNAPSHOT") == false +} + +def getReleaseRepositoryUrl() { + return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" +} + +def getSnapshotRepositoryUrl() { + return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL + : "https://oss.sonatype.org/content/repositories/snapshots/" +} + +def getRepositoryUsername() { + return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : "" +} + +def getRepositoryPassword() { + return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : "" +} + +afterEvaluate { project -> + uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + pom.groupId = GROUP + pom.artifactId = POM_ARTIFACT_ID + pom.version = VERSION_NAME + + repository(url: getReleaseRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + snapshotRepository(url: getSnapshotRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name POM_NAME + packaging POM_PACKAGING + description POM_DESCRIPTION + url POM_URL + + scm { + url POM_SCM_URL + connection POM_SCM_CONNECTION + developerConnection POM_SCM_DEV_CONNECTION + } + + licenses { + license { + name POM_LICENCE_NAME + url POM_LICENCE_URL + distribution POM_LICENCE_DIST + } + } + + developers { + developer { + id POM_DEVELOPER_ID + name POM_DEVELOPER_NAME + } + } + } + } + } + } + + signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives + } + + task androidJavadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + print(classpath) + } + + task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { + classifier = 'javadoc' + from androidJavadocs.destinationDir + } + + task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.sourceFiles + } + + artifacts { + archives androidSourcesJar + archives androidJavadocsJar + } +}