android - AWS Facial Rekognition 尝试在 Android 应用程序中使用 BasicAWSCredentials 描述集合
问题描述
我正在尝试制作一个无需使用 S3、Cognito 或 Amplify 框架即可与 AWS Facial Rekognition 连接的 Android 应用程序。我想在应用程序中对我的 accessKey 和 secretKey 进行硬编码。现在我做了一个非常简单的示例应用程序,所以我可以在 Android Studio 中测试 Rekognition 的功能(这是主要目的)。
当我按下按钮时,我正在调用“DoIets”类的对象。但是我遇到了一个错误,我没有看到任何错误。我在 AndroidManifest.xml 中允许 Internet 连接,并且具有 accesKey en secretKey 的用户具有 AmazonRekognitionFullAccess 策略。在 gradle 文件中,我导入了“com.amazonaws:aws-android-sdk-core:2.10.+”和“com.amazonaws:aws-android-sdk-rekognition:2.10.0”。
这是“DoeIets.java”类
import android.util.Log;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.services.rekognition.model.DescribeCollectionRequest;
import com.amazonaws.services.rekognition.model.DescribeCollectionResult;
public class DoIets {
public void main() {
Log.w("Test", "In DoIets Class");
String collectionId = "MyCollectionName";
AWSCredentials credentials = new BasicAWSCredentials("MYACCESKEY", "MYSECRETKEY");
AmazonRekognition rekognitionClient = new AmazonRekognitionClient(credentials);
rekognitionClient.setRegion(Region.getRegion(Regions.EU_CENTRAL_1));
DescribeCollectionRequest request = new DescribeCollectionRequest().withCollectionId(collectionId);
DescribeCollectionResult describeCollectionResult = rekognitionClient.describeCollection(request);
Log.w("Test", "Face count" + describeCollectionResult.getFaceCount());
}
}
我得到的错误如下。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: be.example.testing, PID: 10174
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
at java.net.InetAddress.getAllByName(InetAddress.java:1152)
at com.android.okhttp.Dns$1.lookup(Dns.java:41)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30)
at com.amazonaws.http.UrlHttpClient.writeContentToConnection(UrlHttpClient.java:162)
at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:75)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:371)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.invoke(AmazonRekognitionClient.java:3006)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.describeCollection(AmazonRekognitionClient.java:762)
at be.example.testing.DoIets.main(DoIets.java:25)
at be.example.testing.MainActivity.doIets(MainActivity.java:25)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 10174 SIG: 9
解决方案
听起来 Android 对您在主线程上执行网络请求(阻塞调用)不满意。使方法异步将解决问题。
请参阅此相关问题:
推荐阅读
- apache-flink - Flink:state.checkpoints.dir 的本地目录
- c# - Azure 应用服务无法访问 SQL Server - 用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败
- node.js - 如何使用 knexjs 批量更新
- angular - 通过@Input 传递枚举类名
- javascript - 当我将 HTTPS 设置为 true 时,我的反应应用程序停止工作?
- visual-studio-code - 无法覆盖自定义 VS CODE 主题(Material Theme)令牌(tokenColorCustomizations)
- mysql - 从选择中插入失败并出现奇怪的错误
- javascript - 创建新元素时只拼接一个元素
- c++ - 应该接受不同输入参数的纯虚函数 - 这应该如何实现?
- python-3.x - CSV 阅读器在文本中插入括号