依赖
//noinspection UseTomlInstead
implementation 'com.amazonaws:aws-android-sdk-core:2.73.0'
//noinspection UseTomlInstead
implementation 'com.amazonaws:aws-android-sdk-s3:2.73.0'
//api 'com.amazonaws:aws-android-sdk-ddb:2.73.0'
直接上代码
import com.amazonaws.auth.AWSCredentials
import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener
import com.amazonaws.mobileconnectors.s3.transferutility.TransferState
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.S3ClientOptions
import com.amazonaws.services.s3.model.Region
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.Utils
import java.io.File
class AmazonS3Upload {
private var transferUtility: TransferUtility? = null
private val accessKey: String = BuildConfig.AmazonS3AccessKey
private val secretKey: String = BuildConfig.AmazonS3SecretKey
private val bucket: String = BuildConfig.AmazonS3Bucket
init {
initAmazonS3()
}
private fun initAmazonS3() {
val awsCreds: AWSCredentials = BasicAWSCredentials(accessKey, secretKey)
val clientOptions = S3ClientOptions.builder().setAccelerateModeEnabled(false).build()
val uploadClient = AmazonS3Client(awsCreds)
uploadClient.setRegion(com.amazonaws.regions.Region.getRegion(Region.AP_HongKong.toString()))
uploadClient.setS3ClientOptions(clientOptions)
transferUtility = TransferUtility.builder().s3Client(uploadClient).context(Utils.getApp()).build()
}
fun reqUpload(file: File, dir: String, successCallback:(file:File) -> Unit) {
LogUtils.d("AmazonS3Upload ------ dir : $dir ")
val transferObserver = transferUtility?.upload(bucket, dir, file)
transferObserver?.setTransferListener(object : TransferListener {
override fun onStateChanged(id: Int, state: TransferState) {
when (state) {
TransferState.COMPLETED -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged COMPLETED")
successCallback(file)
}
TransferState.FAILED -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged FAILED")
}
TransferState.CANCELED -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged CANCELED")
}
TransferState.WAITING -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged WAITING")
}
TransferState.IN_PROGRESS -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged IN_PROGRESS")
}
TransferState.PAUSED -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged PAUSED")
}
TransferState.RESUMED_WAITING -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged RESUMED_WAITING")
}
TransferState.WAITING_FOR_NETWORK -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged WAITING_FOR_NETWORK")
}
TransferState.PART_COMPLETED -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged PART_COMPLETED")
}
TransferState.PENDING_CANCEL -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged PENDING_CANCEL")
}
TransferState.PENDING_PAUSE -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged PENDING_PAUSE")
}
TransferState.PENDING_NETWORK_DISCONNECT -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged PENDING_NETWORK_DISCONNECT")
}
TransferState.UNKNOWN -> {
LogUtils.d("AmazonS3Upload reqUpload onStateChanged UNKNOWN")
}
}
}
override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
LogUtils.d("AmazonS3Upload reqUpload onProgressChanged", "bytesCurrent$bytesCurrent bytesTotal $bytesTotal")
}
override fun onError(id: Int, ex: Exception) {
LogUtils.d("AmazonS3Upload reqUpload onError ex : $ex")
}
})
}
}
调用的地方
private void uploadLogInternal() {
String crashDir = getCrashDir();
File crashFile = new File(crashDir);
File[] logs = crashFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
if (logs != null) {
AmazonS3Upload amazonS3Upload = new AmazonS3Upload();
for (File log : logs) {
LogUtils.d("准备上传崩溃日志:" + log.getAbsolutePath());
amazonS3Upload.reqUpload(log,"Android/" + log.getName(), new Function1<File, Unit>() {
@Override
public Unit invoke(File file) {
uploadSuccess(file);
return null;
}
});
}
}
}
总结
经测试:在测试,升级 :2.73.0 后 不需要在清单文件 注册 并手动开启 TransferService
如果你的报错是:com.amazonaws.mobileconnectors.s3.transferutility.TransferService (has extras) } U=0: not found
解决:在清单文件注册 TransferService,并手动开启
<service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"/>
Utils.getApp().startService(new Intent(Utils.getApp(), TransferService.class));