Android 亚马逊S3上传 工作记录

394 阅读1分钟

依赖

//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

/**
 *
 * @author: Aivan
 * @date: 2023/9/21
 * @desc:
 */
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() {
        //1.首先需要让运维申请账号和秘钥 创建bucket,你所有的上传的文件都在bucket这个文件下
        //2.初始化上传凭证
        val awsCreds: AWSCredentials = BasicAWSCredentials(accessKey, secretKey)

        //3.初始化S3 Client
        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)
        //LogUtils.e("uploadClient.getRegion()" + uploadClient.getRegion());

        //4.获取上传管理类TransferUtility
        transferUtility = TransferUtility.builder().s3Client(uploadClient).context(Utils.getApp()).build()
    }

    /**
     *
     * @param file File
     * @param dir String
     * @param successCallback Function1<[@kotlin.ParameterName] File, Unit>
     */
    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) {

        //有文件需要上传才初始化AmazonS3
        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));

参考:juejin.cn/post/696346…