cprakashagr 的答案实际上可以创造奇迹。只是为了详细说明他的答案,您需要通过执行以下操作从 github 下载最新的 cloudinary 库:
git clone https://github.com/cloudinary/cloudinary_java.git
那你就得根据他的链接进行修改了:
https://github.com/cloudinary/cloudinary_java/pull/41
您不能使用 Android Studio 进行这些更改,因为这是一个 maven 项目,因此您需要使用另一个 IDE,例如 IntelliJ。
这就是我进行更改的方式:
- 您需要添加类:UploadCallback
- 您需要将类 Uploader 替换为他的类:https://github.com/cprakashagr/cloudinary_java/blob/master/cloudinary-core/src/main/java/com/cloudinary/Uploader.java
完成此操作后,进入 cloudinary_java 的主文件夹,然后进入终端。去输入mvn install然后按回车。您将看到 mvn 将为您目录中的不同文件夹构建 jar。构建完成后,例如,如果您导航到 cloudinary-core 文件夹,您将看到 cloudinary-core jar。
您必须从文件夹中复制cloudinary-core jar 并将其添加到您的android 项目根目录下的android 项目“libs”文件夹中。完成此操作后,它会出现在那里,右键单击 Android Studios 中的 jar,然后单击 "Add as Library",以便 android studios 将其添加为依赖项。
cloudinary-android jar 不需要添加为 jar,因为您可以从 gradle 中获取副本。您的最终 gradle 文件应如下所示:
compile('com.cloudinary:cloudinary-android:1.2.2') {
exclude module: 'cloudinary-core'
}
compile files('/Users/XXX/Documents/myApp/libs/cloudinary-core-1.4.2-SNAPSHOT.jar')
重建你的android studio项目,你会看到UploadCallback现在是一个你可以在你的android项目中使用的对象。这是您知道您的 jar 构建已成功修改的方式。
现在在服务类中,添加您的代码以进行云端直接上传。您需要将代码放在服务类中,因为您无法在 UI 线程上执行网络操作,并且如果您尝试会收到错误消息:
Map config = new HashMap();
config.put("cloud_name", "XXX");
Cloudinary mobileCloudinary = new Cloudinary(config);
Map map = null;
try {
map = mobileCloudinary.uploader()
.uploadLarge(this,
intent.getSerializableExtra(getString(R.string.file)),
ObjectUtils.asMap("public_id", 123),
"tags", "myphoto",
"folder", "mylibrary",
"unsigned", true,
"upload_preset", "XXX"),
51200);
} catch (IOException e) {
e.printStackTrace();
}
String imageUrl = map.get("url").toString();
Timber.e("imageUrl " + imageUrl);
您必须将缓冲区设置为足够大(但不能太大)以确保实际调用您的回调。当我第一次尝试这段代码时,我将缓冲区设置为非常大的值,比如200000000,并且没有调用回调,因为上传会一次完成。如果将其设置为较小的值,例如2048,则会定期调用回调,但是上传会变得很慢。由您决定适合您的应用的适当大小。对我来说是51200,这意味着每上传 50kb 的文件,就会发生回调。
一旦它开始工作,您需要将服务类的进度信息传输回您的活动类,以便您可以在屏幕上显示进度。我使用messageHandler 这样做。这是我的服务类中的消息方法:
public void sendMessage(float progress) {
Message message = Message.obtain();
message.arg1 = Math.round(progress);
try {
messageHandler.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
这是我在活动课上的messageHandler:
public class MessageHandler extends Handler {
@Override
public void handleMessage(final Message message) {
Timber.e("transfer: " + message.arg1);
}
}