Android 使用transfer manager上传Amazon s3似乎从未停止等待

Android 使用transfer manager上传Amazon s3似乎从未停止等待,android,amazon-web-services,amazon-s3,Android,Amazon Web Services,Amazon S3,我正在尝试创建一个服务,以便在后台上载文件列表。当我定期检查MultipleFileUpload对象时,它总是处于TransferState等待状态,上载的字节数和要上载的总字节数始终为0。在服务中运行TransferManager或以这种方式定期检查MultipleFileUpload是否有问题 我已经在手机和模拟器上进行了测试。以前,当我使用PutObjectRequest而不是TransferManager时,我能够使用相同的AmazonS3Client成功上载 以下是迄今为止的代码: /

我正在尝试创建一个服务,以便在后台上载文件列表。当我定期检查MultipleFileUpload对象时,它总是处于TransferState等待状态,上载的字节数和要上载的总字节数始终为0。在服务中运行TransferManager或以这种方式定期检查MultipleFileUpload是否有问题

我已经在手机和模拟器上进行了测试。以前,当我使用PutObjectRequest而不是TransferManager时,我能够使用相同的AmazonS3Client成功上载

以下是迄今为止的代码:

// OnCreate
    @Override
    public void onCreate() {

        Log.v(TAG, "Creating Upload Service");

        ClientConfiguration clientConfig=new ClientConfiguration();
        clientConfig.setConnectionTimeout(10*1000);

        AmazonS3Client s3Client = new AmazonS3Client(
                new BasicAWSCredentials(ACCESS_KEY_ID,
                        SECRET_KEY),clientConfig);

        s3Client.setEndpoint(AMAZON_ENDPOINT);

        transferManager= new TransferManager(s3Client);

        seekIntent = new Intent(BROADCAST_ACTION);
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // Insert notification start
        initNotification();

        String[] fileNames=intent.getExtras().getStringArray(MainActivity.UPLOAD_FILE_NAMES);

        String path=intent.getExtras().getString(MainActivity.UPLOAD_FILE_PATH);

        ArrayList<File> files=new ArrayList<File>();

        for (String fileName : fileNames) {
            files.add(new File(fileName));
        }

        upload= transferManager.uploadFileList(RECORDING_BUCKET, null,new File(path),files);
        seekIntent.putExtra(UPLOAD_BYTES_TOTAL_KEY, upload.getProgress().getTotalBytesToTransfer());

        transferManager.

        setupHandler();

        return START_STICKY;
    }

    // ---Send seekbar info to activity----
    private void setupHandler() {
        handler.removeCallbacks(sendUpdatesToUI);
        handler.postDelayed(sendUpdatesToUI, 1000); // 1 second
    }

    private Runnable sendUpdatesToUI = new Runnable() {
        public void run() {
            // // Log.d(TAG, "entered sendUpdatesToUI");

            seekIntent.putExtra(UPLOAD_BYTES_TRANSFERED_KEY, upload.getProgress().getBytesTransfered());

            if(upload.isDone())
            {
                int retCode=(upload.getState()==TransferState.Completed)?0:1;

                seekIntent.putExtra(UPLOAD_COMPLETION_CODE_KEY, retCode);
            }
            else
            {
                handler.postDelayed(this, 1000); 
            }

            sendBroadcast(seekIntent);
        }
    };
//OnCreate
@凌驾
public void onCreate(){
Log.v(标签“创建上传服务”);
ClientConfiguration clientConfig=new ClientConfiguration();
clientConfig.setConnectionTimeout(10*1000);
AmazonS3Client s3Client=新AmazonS3Client(
新的基本凭证(访问密钥ID、,
密码(U密钥),客户端配置);
s3Client.setEndpoint(AMAZON_端点);
transferManager=新的transferManager(s3Client);
seekIntent=新意图(广播行动);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//插入通知开始
初始化通知();
String[]fileNames=intent.getExtras().getStringArray(MainActivity.UPLOAD\u FILE\u name);
String path=intent.getExtras().getString(MainActivity.UPLOAD\u FILE\u path);
ArrayList files=新的ArrayList();
for(字符串文件名:文件名){
添加(新文件(文件名));
}
upload=transferManager.uploadFileList(记录存储桶,空,新文件(路径),文件);
请参见kintent.putExtra(上传字节总数键,UPLOAD.getProgress().getTotalBytesToTransfer());
转帐经理。
setupHandler();
返回开始时间;
}
//---将seekbar信息发送到活动----
私有void setupHandler(){
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI,1000);//1秒
}
private Runnable sendUpdatesToUI=new Runnable(){
公开募捐{
////Log.d(标记“entered sendUpdatesToUI”);
请参见kintent.putExtra(上传字节传输密钥,UPLOAD.getProgress().getByTestTransfered());
if(upload.isDone())
{
int retCode=(upload.getState()==TransferState.Completed)?0:1;
请参阅kintent.putExtra(上传完成代码、返回代码);
}
其他的
{
handler.postDelayed(这个,1000);
}
发送广播(seekIntent);
}
};

结果表明,我在理解uploadFileList方法的参数时犯了一个错误。我传递的文件是相对于目录文件的。事实证明,文件列表中的文件仍然需要它们的完整路径,而directory参数只是指出它们应该如何显示在bucket中。奇怪的是,这并没有导致错误,只是导致了我在问题中提到的行为。

我发现的另一个问题是,如果使用新的TransferUtility,必须声明服务

<service
android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" 
android:enabled="true" />

在您的AndroidManifest.xml中。这在一些但不是所有的文档中都突出显示,很容易被忽略