使用转移管理器的亚马逊s3上传似乎永远不会停止等待

时间:2013-09-20 23:22:21

标签: android amazon-web-services amazon-s3

我正在尝试创建一个服务来在后台上传文件列表。当我定期检查MultipleFileUpload对象时,它总是在TransferState WAITING中,上传的字节数和要上传的总字节数总是为0.在服务中运行TransferManager或者以这种方式定期检查MultipleFileUpload会有问题吗? / p>

我在手机和模拟器上测试过。当我使用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);

        }
    };

2 个答案:

答案 0 :(得分:3)

原来我在理解uploadFileList方法的参数时犯了一个错误。我传入的文件是相对于目录文件的。事实证明,文件列表中的文件仍然需要它们的完整路径,而目录参数只是弄清楚它们应该如何显示在存储桶中。奇怪的是这不会导致错误,它只会导致我在问题中提到的行为。

答案 1 :(得分:0)

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

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

。这在一些但不是所有文档中都突出显示,很容易错过。