Giter Site home page Giter Site logo

android-sdk's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-sdk's Issues

`saveKey` not work

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?

疑似bug反馈

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

和 multidex 一起使用会有问题

Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.

java.util.zip.ZipException: duplicate entry: com/loopj/android/http/AsyncHttpClient$1.class

最新的 7.0.9 版本。

什么时候加同步上传方式

什么时候加同步上传方式,什么时候加同步上传方式,什么时候加同步上传方式。现在只有异步方式上传。

可能与rxjava冲突?

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.+'

AndroidStuidio 打包 引入七牛sdk的项目 失败

打包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

UploadManager 的post方法是支持在非ui线程调用的吗?

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线程跑,然后表单上传却是直接调用。
不知道我的理解有没有错,如果没有错的话,这个是基于什么样的考量呢?

建议增加同步上传功能

建议增加同步上传功能,因为后台线程并不只是上传数据到七牛服务器,还要上传数据到自己的服务器。
现在使用异步上传,需要:
1、一个线程从自己服务器获取上传凭证;
2、利用上传凭证上传数据到七牛服务器;
3、再开一个线程上传七牛返回的数据到自己的服务器。
如果使用同步上传的话,那么只需要一个线程就够了。

loopj 1.4.9 remove apache jar

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!

同样的token在GO版本上可以,在Android版本上显示无效的token

同样的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版本,仍然是可以的。

提供直接提交的方法,返回固定json格式,开发者自己解析

不知道你们考虑过普通的一个上传流程是怎样的没有?先从自己服务器上获取token,然后切换到主线程调用你们的api,再通过回调又切到主线程拿到结果,然后再开线程把key上传到自己的服务器,获取完整URL。整个流程本来只是一件事,完全可以封装到一个线程里。而因为你们的设计完全打破了。代码凌乱不堪。还要另加一个网络库....同时,一次提交根本无法提交多个文件,如果遇到需要上传多张图片的场景,这场景太美,我都不敢想象~希望能够直接提供一个上传api。解释清楚入参,出参。

找不到HttpManager?! HttpManager类型是.class

错误信息:
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'

ResumeUploader的RandomAccessFile file 使用后未关闭

若使用以下代码开启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的代码,貌似确实没有关闭代码。
这个应该是要处理下的, 否则文件上传后,相应的文件对象都没有关闭,长期操作会不会对应用产生影响。

ResumeUploader#nextTask中为什么进度最大只会到0.95?

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);
            }
        };

UpProgressHandler#progress的行为不确定

文档里提到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

能否加入同步的上传方法?

现在只有异步的上传方法。

通过UploadOptions回调,能否加入同步的上传,一直等待其结束或者出错才返回。

七牛图片上传任务只是整个任务的一部分,我希望在一个自己开的线程里面完成整个任务(七牛图片上传任务只是一部分)。

这样子可以简化线程同步的问题。

估计这种应用场合很多人会碰到吧?

适配6.0

什么时候能适配6.0啊,使用七牛导致我的应用都没法适配6.0了~~~

有删除功能吗

例如替换某张图片,需要将之前的替换或者直接删除

7.0.9版的例子里,断点续传,一点击暂停后就提示报错,断点存储文件不存在,是我这边配置错了还是怎么回事呢?

红米2手机 已经 模拟器都是这样的错,用命令行进去那个目录,确实有那么一个文件的!报错的提示是:java.io.FileNotFoundException: /data/data/com.qiniu.qiniulab/files/QiniuAndroid/Mzc3TkFrRnpjNDVRampYQ0FGYWJ5SWxVZlVNPS5wcm9ncmVzcw==: open failed: ENOENT (No such file or directory)

实际上有那么一个文件,是不是 -rw------ 这个权限的问题

红米2手机进不去那个目录,提示没权限

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.