我在使用AWS Mobile SDK version 2.2.15时遇到了问题。仔细查看他们自己的S3TransferUtilitySample之后,我做了几次尝试,将文件自己上传到Amazon S3存储桶。

我的第一次尝试是尝试从Android自己的.upload()方法内部的AsyncTask中调用TransferUtility的doInBackground()方法。在那里没有成功,在reading about this issue之后,它启发了我尝试将SDK调用移出AsyncTask之外,并移到onPostExecute()下的UI线程中,因为怀疑调用本身是异步的并且AsyncTask在AWS上运行垃圾回收SDK对象。仍然没有运气,没有引发异常,除了没有真正上传的文件之外,没有任何错误的迹象。

我的第二次尝试是跟随this exact example。我下载了源代码,并能够为应用程序提供正确的标识池ID,区域,存储区,密钥和测试jpeg文件。我运行了应用程序,并且正在进行呼叫。该文件将其发送到AWS S3,没有任何问题。

我将它们的确切方法复制到应用程序的帮助程序类中,并使所有AWS开发工具包对象成为该类的静态字段,但是我仍然遇到同样的问题,没有引发任何异常。我最终使这些字段成为非静态字段,并在我的主要活动中将helper类实例化为一个对象,并安全地假定该对象不会被垃圾回收处理。依然没有!没有迹象表明这些呼叫失败!

我决定使用Android的Log.i()方法进行日志记录时非常慷慨,观察整个过程,甚至可以使用TransferUtility的.upload()方法,但是即使设置了TransferListener并充满了日志记录行,也没有状态更改,未调用onError()。 TransferUtility的.upload()及其生成的TransferObserver对象未报告运行测试应用程序的任何信息。

这里有几件事要注意:
*这里使用正确的身份池ID,没有问题
*我已经尝试同时使用2.2.15和2.2.13版本
*包括的所有依赖项都是.jar文件,项目还不是Gradle(尚未)
*清单中的服务与示例中的一样
*没有构建错误,Android Studio可以很好地构建项目
* TransferListener对象没有触发onStateChanged()onProgressChanged()onError()

有人遇到过AWS S3 SDK这样奇怪的问题吗?关于如何更好地调试此问题的任何建议?

这是现在的课程:

public class AmazonS3Helper
{
    Context context;

    public String bucket;
    public String key;

    public File file;

    public AmazonS3 s3;
    public TransferUtility utility;

    public AmazonS3Helper(JSONObject p, Context c)
    {
        Log.i("tag", "new AmazonS3Helper object");

        this.context = c;

        try
        {
            bucket    = p.getString("bucket");
            key        = p.getString("key");


            this.file = new File(
                c.getExternalFilesDir(null),
                "nn_temp_photo.jpg");

            credentialsProvider();
            setTransferUtility();

            upload();
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in new AmazonS3Helper object: " + x.getMessage());
        }
    }

    public void credentialsProvider()
    {
        Log.i("tag", "Providing credentials");

        try
        {
            CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                this.context,
                // This has been verified to return the correct identity pool
                MyApplicationClass.getPreference("aws.credentials"),
                Regions.US_EAST_1);

            setAmazonS3Client(credentialsProvider);
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in providing credentials: " + x.getMessage());
        }
    }

    public void setAmazonS3Client(CognitoCachingCredentialsProvider credentialsProvider)
    {
        Log.i("tag", "Setting amazon s3 client");

        try
        {
            s3 = new AmazonS3Client(credentialsProvider);
            s3.setRegion(Region.getRegion(Regions.US_EAST_1));
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in setting amazon s3 client:" + x.getMessage());
        }
    }

    public void setTransferUtility()
    {
        Log.i("tag", "Setting transfer utility");

        try
        {
            utility =
                new TransferUtility(
                    s3,
                    this.context);
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in setting transfer utility: " + x.getMessage());
        }
    }

    public void upload()
    {
        Log.i("tag", "uploading");

        try
        {
            TransferObserver transferObserver = utility.upload(
                bucket,
                key,
                file
            );

            transferObserverListener(transferObserver);
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in uploading: " + x.getMessage());
        }
    }

    public void transferObserverListener(TransferObserver transferObserver)
    {
        Log.i("tag", "transferObserverListener");

        try
        {
            transferObserver.setTransferListener(new TransferListener()
            {
                @Override
                public void onStateChanged(int id, TransferState state)
                {
                    Log.i("tag", state + "");
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal)
                {
                    int percentage = (int) (bytesCurrent / bytesTotal * 100);
                    Log.i("tag", percentage + "");
                }

                @Override
                public void onError(int id, Exception ex)
                {
                    Log.i("tag", "error");
                }
            });
        }
        catch (Exception x)
        {
            Log.i("tag", "Error in transferObserverListener: " + x.getMessage());
        }
    }
}




编辑
我忘了提,但正在测试的Android版本是Android Lollipop 5.1。

最佳答案

这是2.2.15中的错误。没有报告某些IO异常。在2.2.16中已修复。您可以尝试使用最新版本吗?

07-24 09:46
查看更多