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 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 项目根目录中的“libs”文件夹中。完成后,它会出现在那里,右键单击 Android Studios 中的 jar,然后单击"Add as Library"
这样 Android Studio 就会将其添加为依赖项。
The 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 构建已成功修改的方式。
现在,在服务类中,添加用于 cloudinary 直接上传的代码。您需要将代码放入服务类中,因为您无法在 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);
}
}