【问题标题】:Why isn't setTransferListener being triggered in AWS?为什么没有在 AWS 中触发 setTransferListener?
【发布时间】:2016-06-19 03:53:28
【问题描述】:

我正在尝试将照片从 android 上传到 S3,我正在关注最新的 tutorial 如何在 S3 站点上,但似乎 TransferObserver 没有被触发。我所有的变量都是全局声明的。当我运行这段代码时:

               credentialsProvider = new CognitoCachingCredentialsProvider(
                        getApplicationContext(),
                        "us-east-SECRET", // Identity Pool ID
                        Regions.US_EAST_1 // Region
                );

                    // Instantiate an S3 Client
                    // Create an S3 client
                    s3 = new AmazonS3Client(credentialsProvider);

                    // Set the region of your s3 bucket
                    s3.setRegion(Region.getRegion(Regions.DEFAULT_REGION));

                    // Instantiate TransferUtility
                    transferUtility = new TransferUtility(s3, getApplicationContext());

                    //Upload a file to amazon s3
                    Log.i("imageFile", imageFile.toString());

                    observer = transferUtility.upload(
                            "foond",     /* The bucket to upload to */
                            "key",    /* The key for the uploaded object */
                            imageFile        /* The file where the data to upload exists */
                    );

                    Log.i("observer", observer.getAbsoluteFilePath());
                    Log.i("observer", observer.toString());
                    Log.i("observer", observer.getState().toString());
                    Log.i("observer", String.valueOf(observer.getBytesTransferred()));

                    observer.setTransferListener(new TransferListener() {
                        @Override
                        public void onStateChanged(int id, TransferState state) {
                            Log.i("id", String.valueOf(id));
                            Log.i("TransferState", String.valueOf(state));
                        }

                        @Override
                        public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                            Log.i("id", String.valueOf(id));
                            Log.i("bytesCurrent", String.valueOf(bytesCurrent));
                            Log.i("bytesTotal", String.valueOf(bytesTotal));
                        }

                        @Override
                        public void onError(int id, Exception ex) {
                            Log.e("Error", String.valueOf(ex));
                        }
                    });

                    Log.i("observer", observer.getState().toString());
                    Log.i("observer", String.valueOf(observer.getBytesTransferred()));

我在控制台中得到的是

I/OpenGLRenderer: Initialized EGL, version 1.4
W/art: Suspending all threads took: 21.244ms
D/CognitoCachingCredentialsProvider: Loading credentials from SharedPreferences
I/imageFile: /storage/emulated/0/DCIM/Camera/IMG_20160223_134442.jpg
V/RenderScript: 0x9ab29000 Launching thread(s), CPUs 4
I/observer: /storage/emulated/0/DCIM/Camera/IMG_20160223_134442.jpg
I/observer: com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver@6e1c6df
W/art: Suspending all threads took: 9.843ms
I/observer: WAITING
I/observer: 0
I/observer: WAITING
I/observer: 0

在我看来,setTransferListener 中没有任何日志被打印出来。为什么会这样?另外需要注意的是,图片并没有上传到 S3 上。

这是我对清单的权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

这是我导入的依赖项:

compile 'com.amazonaws:aws-android-sdk-core:2.+'
compile 'com.amazonaws:aws-android-sdk-cognito:2.+'
compile 'com.amazonaws:aws-android-sdk-s3:2.+'
compile 'com.amazonaws:aws-android-sdk-ddb:2.+'

我知道我的 S3 和 cognito 设置是正确的,因为我使用了 github 中提供的示例代码并且我有一个文件要上传。问题是代码不适合我在android studio中运行的android版本,我不想经历降级的麻烦。

这是我在 gradle 中的配置

compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "xxxxxxxxx"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}

TL;DR:TransferObserver 观察者 = transferUtility.upload 不工作。并且没有上传图片。

【问题讨论】:

  • 您使用的是哪个版本的适用于 Android 的 AWS 开发工具包?最新的是 v2.2.13。还有你的网络状态是什么?如果没有网络,TransferUtility 会一直等到它恢复。
  • @Yangfan 你怎么查?我只是按照上面描述中的教程进行操作。如果那不是最新的教程,那么我不知道在哪里可以找到。另外,我的网络很好。我已经能够通过我的应用访问其他网络通信。
  • 您的示例应用程序的设置是什么?您如何使用 AWS 开发工具包库?你用maven还是gradle?
  • @Yangfan 我的示例应用程序设置的工作方式完全相同。我正在使用 gradle 并且我已经更新了我的问题以包含我的依赖项。
  • @Yangfan 我发现了问题所在。这是因为 必须在 中。教程对此不太清楚。

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


【解决方案1】:

只需在清单中写下(提及服务)。

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

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 2021-08-05
    • 1970-01-01
    • 2021-05-23
    • 2021-06-21
    • 2019-02-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多