类似的问题已经被要求了.但是由于Android平台兼容性的变化,这个似乎比以前的更复杂.
这是Pixel和Pixel2的错误日志,已注册Android Beta程序
08-16 13:20:53.146 9630-9630/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: me.project.android.dev, PID: 9630
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactory;
at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41)
at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43)
//project specific class reference removed
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.commons.logging.LogFactory" on path: DexPathList[[zip file "/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk"],nativeLibraryDirectories=[/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/lib/arm64, /data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41)
at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43)
//project specific class reference removed
at android.os.Handler.handleCallback(Handler.java:873)
at …Run Code Online (Sandbox Code Playgroud) android amazon-web-services android-proguard aws-sdk-android
我的代码如下所示:
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
Run Code Online (Sandbox Code Playgroud)
从'com.amazonaws:aws-android-sdk-s3:2.7.5'升级到'com.amazonaws:aws-android-sdk-s3:2.11.0'时,即使上传仍然有效:
E/nsferNetworkLossHandler: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving
E/UploadTask: TransferUtilityException: [com.amazonaws.mobileconnectors.s3.transferutility.TransferUtilityException: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving]
Run Code Online (Sandbox Code Playgroud)
当我更改代码以包括TransferNetworkLossHandler时:
TransferNetworkLossHandler.getInstance(context);
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
Run Code Online (Sandbox Code Playgroud)
不做任何事情,我再也没有错误。
但是,这不是此错误消息的预期目的。它告诉您使用TransferNetworkLossHandler,但是没有有关如何使用它的文档。
如果上传不起作用,我只想向用户显示错误(例如Toast或AlertDialog)。所以我根本不需要处理程序。但是我也不希望每次都将错误消息写入日志。另外,我也不想使用这种简单的解决方案,即仅获取一个实例而不对其执行任何操作。
在我的情况下,此处理程序的正确用法是什么?
我找不到有关如何使用 AWS 的 Amplify Android 库刷新访问令牌的信息。
在文档和一些论坛上,有人建议这一切都会自动发生。但就我而言,事实并非如此。
在应用程序中,我使用 Amplify Auth 进行用户身份验证,还使用 Amplify Storage 和 Amplify Predictions。
为了查询我的数据库,我使用DynamoDBMapper适用于 Android 的 AWS 开发工具包。
到目前为止,我已尝试通过以下方式强制刷新令牌:
auth.currentUserAWSMovileClient.getInstance().tokensAWSMobileClient.getInstance().currentUserState()Amplify.Auth.fetchAuthSession()前三个都不起作用。fetchAuthSession(...)是我现在使用的技术,但它是异步的,需要一些时间才能产生结果。我必须在我的splash activity. 否则,如果它是异步的并且存在对数据库的请求,该请求取决于其结果,则数据库调用将导致NotAuthorizedException.
另外,刷新令牌可以设置为 10 年左右,所以目前这不是问题。问题是旧访问令牌过期后不会创建新的访问令牌,并且我无法执行任何经过身份验证的用户操作。
有没有办法快速检查令牌是否有效——如果无效,则刷新它们?
android amazon-web-services amazon-cognito aws-amplify aws-sdk-android