qiniu / android-sdk Goto Github PK
View Code? Open in Web Editor NEWQiniu Resource (Cloud) Storage SDK for Android
License: MIT License
Qiniu Resource (Cloud) Storage SDK for Android
License: MIT License
https://github.com/qiniu/android-sdk/blob/develop/src/com/qiniu/resumableio/ResumableIO.java#L66
这会导致大小为0, 4M,8M... 的文件块数多一。
上传开始后,停止在95%不动了。。
错误信息:
16:32:15.853 [ERROR] [system.err] Warning: com.qiniu.android.http.HttpManager$3: can't find referenced class com.qiniu.android.http.HttpManager
依赖:
compile 'com.qiniu:qiniu-android-sdk:7.1.2'
安卓这边如何实现视频上传转码压缩等处理,我看java是有的,不知道android七牛Sdk有没有相应的方法,还是获取java后台那边给的token,后台处理
文档写的太简单了,加几行示例代码吧。
用Glide 无法直接加载
改为https 协议仍然无法正常加载,但是浏览器可以正常显示
同样的token和key在GO的Client上可以上传文件,但是使用Android-SDK就显示bad token。
// go版本的代码
func main() {
zone := 0
uploader := kodocli.NewUploader(zone, nil)
ctx := context.Background()
uptoken := "U4PsY2wIJoRilzo10kcZyw9V9BRfB6KFKVCBAv9r:JNub0H_mJiNcrx1IN1lnfa4s5EU=:eyJzY29wZSI6InFuaXU6dGVzdC9hNTIwZGUwZjY0ZmM3NGMxOTRhYWU0Y2NkMTE1YjA3NS5qcGciLCJkZWFkbGluZSI6MTQ0OTc2Nzk4OH0="
key := "test/a520de0f64fc74c194aae4ccd115b075.jpg"
localFile := "/home2/nferzhuang/qiniu/src/client/button.png"
var ret kodocli.PutRet
err := uploader.PutFile(ctx, &ret, uptoken, key, localFile, nil)
if err != nil {
fmt.Println("put file failed")
return
}
fmt.Println("put file OK, ret:", ret)
}
Android版本的代码:
public void onClick(View v) {
if (uploadManager == null) {
uploadManager = new UploadManager();
}
resultText.setText("Uploading... Please wait");
String key = username + "/" + filename;
Log.i("qiniu", "key:" + key);
Log.i("qiniu", "uptoken:" + uptoken);
File uploadFile = new File(filePath);
uploadManager.put(uploadFile, key, uptoken, new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject response) {
Log.i("qiniu", info.toString());
resultText.setText(info.toString());
}
}, null);
}
其中我通过打印的方式,确认了key和token是一致的。
而且,我在生成token的时候设置的有效期是36000(10个小时);
并且,我测试GO的Client上传可以;再测试Android版本,显示无效的token;回到GO版本,仍然是可以的。
RT....本身自己APP就有网络请求的架构,现在为使用千牛又要增加一个新jar包。建议换成OKHttp,还有请把happy-dns源代码copy到代码中(随着对方版本的升级而替换源代码),最终只生产一个jar包..好不好--这样不是更方便开发者~~
分片上传时,, 有的图片传完后,发挥的图片url 为空。。。 这个是什么原因
我看Java SDK 提交了,
现在Android Studio 是用 gradle 组织工程的, 从maven添加依赖也很方便.
JSONObject only return hash & key ,could return image url?
RT
现在只有异步的上传方法。
通过UploadOptions回调,能否加入同步的上传,一直等待其结束或者出错才返回。
七牛图片上传任务只是整个任务的一部分,我希望在一个自己开的线程里面完成整个任务(七牛图片上传任务只是一部分)。
这样子可以简化线程同步的问题。
估计这种应用场合很多人会碰到吧?
sdk中对于分片上传的片大小配置,如果片大小不能够整除块大小的话(即 BLOCK_SIZE % CHUNK_SIZE != 0),可能会出现read exceed block size的错误。
引起该问题的代码为
/library/src/main/java/com/qiniu/android/storage/ResumeUploader.java 中的
private int calcPutSize(int offset) {
int left = size - offset;
return left < Config.CHUNK_SIZE ? left : Config.CHUNK_SIZE;
}
如果配置中BLOCK_SIZE % CHUNK_SIZE != 0的话,每块的最后一片大小也需要考虑,而不仅仅是整个文件的最后一片大小。
不知是否是个bug
若使用以下代码开启StrictMode, 会在文件上传后抛出异常,应用退出,提示相应的RandomAccessFile未关闭。
if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
异常:
08-26 14:57:50.913 27269-27281/com.meiyaapp.meiya E/StrictMode﹕ A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:127)
at com.qiniu.android.storage.ResumeUploader.run(ResumeUploader.java:78)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
08-26 14:57:50.913 27269-27281/com.meiyaapp.meiya W/System.err﹕ StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
将StrictMode的开启代码移除后,应用就不会直接退出了,但提示的RandomAccessFile未关闭,应该是存在的。 我大致看了下com.qiniu.android.storage.ResumeUploader的代码,貌似确实没有关闭代码。
这个应该是要处理下的, 否则文件上传后,相应的文件对象都没有关闭,长期操作会不会对应用产生影响。
用同一key多次上传不同的文件,提示:file exist。如何调用SDK完成覆盖上传呢?
不知道你们考虑过普通的一个上传流程是怎样的没有?先从自己服务器上获取token,然后切换到主线程调用你们的api,再通过回调又切到主线程拿到结果,然后再开线程把key上传到自己的服务器,获取完整URL。整个流程本来只是一件事,完全可以封装到一个线程里。而因为你们的设计完全打破了。代码凌乱不堪。还要另加一个网络库....同时,一次提交根本无法提交多个文件,如果遇到需要上传多张图片的场景,这场景太美,我都不敢想象~希望能够直接提供一个上传api。解释清楚入参,出参。
文档里提到UpProgressHandler#progress会运行在主线程,可是,当我同时上传几个文件(共用一个UploadManager),这个时候,回调偶尔在主线程,偶尔不在主线程
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : true
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : false
is Main Loop : true
这个log是我在progress里面打的
sdk版本7.0.3
async http版本 1.4.6
红米2手机 已经 模拟器都是这样的错,用命令行进去那个目录,确实有那么一个文件的!报错的提示是:java.io.FileNotFoundException: /data/data/com.qiniu.qiniulab/files/QiniuAndroid/Mzc3TkFrRnpjNDVRampYQ0FGYWJ5SWxVZlVNPS5wcm9ncmVzcw==: open failed: ENOENT (No such file or directory)
实际上有那么一个文件,是不是 -rw------ 这个权限的问题
红米2手机进不去那个目录,提示没权限
我看到源码里有onProgress的回调,但是没有开放出来,希望增加这个功能
类似于Retrofit,封闭多个版本的网络请求库,使用的时候根据自己的需要选择
https://github.com/square/retrofit/tree/master/retrofit-converters
建议增加同步上传功能,因为后台线程并不只是上传数据到七牛服务器,还要上传数据到自己的服务器。
现在使用异步上传,需要:
1、一个线程从自己服务器获取上传凭证;
2、利用上传凭证上传数据到七牛服务器;
3、再开一个线程上传七牛返回的数据到自己的服务器。
如果使用同步上传的话,那么只需要一个线程就够了。
android-async-http/android-async-http#1000
建议使用1.4.7版本
什么时候加同步上传方式,什么时候加同步上传方式,什么时候加同步上传方式。现在只有异步方式上传。
使用现在的网络层必须依赖httpclient的包,能否考虑使用OkHttp,尽量减少工程引入的依赖包数量。
重现步骤:
1.通过UploadManager上传文件
2.断开网络
3.UpCompletionHandler永远没有回调
没有多文件上传方法,多文件上传,客户端做个循环上传单个文件吗?
由0到95%的过程是正常的,但是到了95%后就会一直卡着,十多二十秒之后才会上传完成。
我这里使用的是版本是
compile 'com.qiniu:qiniu-android-sdk:7.0.9
public void progress(String key, double percent) 不是在主线程的
public void progress(String key, double percent) 不是在主线程的
public void progress(String key, double percent) 不是在主线程的
重要的事情说三遍
同一个uptoken使用javaSDK可以
My putPolicy is:
scope: CONFIG.qiniu.scope
deadline: Math.floor(nextMonth.getTime() / 1000)
endUser: "#{ appId }/#{ userId }"
saveKey: '$(endUser)/$(x:targetId)/$(x:timestamp)'
returnBody: '{\"key\":$(key)}'
detectMime: 1
Android code, I use SDK 7.0.3:
UploadManager manager = new UploadManager();
Map<String, String> params = new HashMap<String, String>();
params.put("x:targetId", message.getRecipient());
params.put("x:timestamp", getTimestampString(new Date()));
final UploadOptions opt = new UploadOptions(params, null, true, null, null);
manager.put(filePath, null, token, new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject responseObject) {
LogUtil.info(LogUtil.LOG_TAG_CHAT, "Upload file finished with key: " + key + ", info: " + info);
}
}, opt);
I can successfully upload image, but there is no key
return, below is the log message:
Upload file finished with key: null, info: {ResponseInfo:com.qiniu.android.http.ResponseInfo@3e1293b1,status:200, reqId:wRIAAFC1CzaRn9cT, xlog:s.ph;s.ph;s.ph;PFDS;PFDS;PFDS:1;PTFDM;PFDT;s.gh;PFDS/613;PTFDM:1;PTFDS;rdb.g/no such key;DBD/404;DBG/404;v4.exist:1/Document not found;rs12_6.ins:1;qtbl.ins:2;mc.s;RS:3;rs.put:4;UP:14, xvia:null, host:upload.qiniu.com, ip:null, duration:0.034000 s, error:null}
The JavaScript SDK can get key
, Where do I wrong?
什么时候能适配6.0啊,使用七牛导致我的应用都没法适配6.0了~~~
Warning: com.qiniu.android.http.HttpManager: can't find referenced method 'void setRedirectHandler(org.apache.http.client.RedirectHandler)' in program class com.qiniu.android.http.AsyncHttpClientMod
Warning: com.qiniu.android.http.HttpManager: can't find referenced method 'com.loopj.android.http.RequestHandle post(android.content.Context,java.lang.String,org.apache.http.Header[],org.apache.http.HttpEntity,java.lang.String,com.loopj.android.http.ResponseHandlerInterface)' in program class com.qiniu.android.http.AsyncHttpClientMod
Warning: com.qiniu.android.http.HttpManager$2: can't find referenced method 'com.loopj.android.http.RequestHandle post(android.content.Context,java.lang.String,org.apache.http.Header[],org.apache.http.HttpEntity,java.lang.String,com.loopj.android.http.ResponseHandlerInterface)' in program class com.qiniu.android.http.AsyncHttpClientMod
Warning: there were 3 unresolved references to program class members.
A terrible problem!
E/dalvikvm: Could not find class 'rx.subjects.SubjectSubscriptionManager', referenced from method rx.subjects.PublishSubject.create
W/dalvikvm: VFY: unable to resolve new-instance 8872 (Lrx/subjects/SubjectSubscriptionManager;) in Lrx/subjects/PublishSubject;
一引用你们的sdk就报这个错误,然后应用就崩溃了。
下面是我引用的一些库:
compile 'com.android.support:multidex:1.0.1'
// https://github.com/google/gson
compile 'com.google.code.gson:gson:2.6.2'
// https://github.com/JakeWharton/butterknife
compile 'com.jakewharton:butterknife:7.0.1'
// https://github.com/orfjackal/retrolambda
retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.1.0'
// https://github.com/greenrobot/EventBus
compile 'org.greenrobot:eventbus:3.0.0'
// https://github.com/ReactiveX/RxJava
compile 'io.reactivex:rxjava:1.1.0'
// https://github.com/ReactiveX/RxAndroid
compile 'io.reactivex:rxandroid:1.1.0'
// https://projectlombok.org/
compile 'org.projectlombok:lombok:1.16.8'
// https://github.com/loopj/android-async-http
compile 'com.loopj.android:android-async-http:1.4.9'
// https://github.com/qiniu/android-sdk
compile 'com.qiniu:qiniu-android-sdk:7.2.+'
已经找到etag算法,但是如何使用?
hello,我在com.qiniu.android.storage.UploadManager类的源码里面看到这样的一段代码,
public void put(File file, final String key, String token, final UpCompletionHandler completionHandler,
final UploadOptions options) {
if (areInvalidArg(key, null, file, token, completionHandler)) {
return;
}
UpToken decodedToken = UpToken.parse(token);
if (decodedToken == null) {
final ResponseInfo info = ResponseInfo.invalidToken("invalid token");
AsyncRun.run(new Runnable() {
@OverRide
public void run() {
completionHandler.complete(key, info, null);
}
});
return;
}
long size = file.length();
if (size <= config.putThreshold) {
FormUploader.upload(httpManager, config, file, key, decodedToken, completionHandler, options);
return;
}
String recorderKey = config.keyGen.gen(key, file);
ResumeUploader uploader = new ResumeUploader(httpManager, config, file, key,
decodedToken, completionHandler, options, recorderKey);
AsyncRun.run(uploader);
}
在这个代码里面,如果是文件大小小与配置的文件大小,则使用表单上传,否则使用分片上传,但是在这里的分片上传是使用了AsyncRun,然后在ui线程跑,然后表单上传却是直接调用。
不知道我的理解有没有错,如果没有错的话,这个是基于什么样的考量呢?
如题,怎么修改上传文件的文件名啊。。。
Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
java.util.zip.ZipException: duplicate entry: com/loopj/android/http/AsyncHttpClient$1.class
最新的 7.0.9 版本。
打包Release版本时出现下面的警告导致打包失败
Warning:com.qiniu.android.http.HttpManager$3: can't find referenced method 'com.qiniu.android.http.IReport access$100(com.qiniu.android.http.HttpManager)' in program class com.qiniu.android.http.HttpManager
例如替换某张图片,需要将之前的替换或者直接删除
final int chunkSize = calcPutSize(offset);
ProgressHandler progress = new ProgressHandler() {
@Override
public void onProgress(int bytesWritten, int totalSize) {
double percent = (double) (offset + bytesWritten) / size;
if (percent > 0.95) {
percent = 0.95;
}
options.progressHandler.progress(key, percent);
}
};
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.