Reputation: 41
I'm trying to compare two images using AWS Rekognition but I keep getting this unknown error. I've read alot of documentations and questions here but non has been able to resolve the problem. My code:
Float similarityThreshold = 70F;
AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
AmazonRekognition rekognitionClient = new AmazonRekognitionClient(credentials);
rekognitionClient.setRegion(Region.getRegion(Regions.US_EAST_2));
CompareFacesRequest compareFacesRequest = new CompareFacesRequest()
.withSourceImage(new Image().withS3Object(new S3Object().withName("image2.jpg").withBucket("***")))
.withTargetImage(new Image().withS3Object(new S3Object().withName("image1.jpg").withBucket("***")));
CompareFacesResult compareFacesResult = rekognitionClient.compareFaces(compareFacesRequest);
List <CompareFacesMatch> faceDetails =
compareFacesResult.getFaceMatches();
for (CompareFacesMatch match: faceDetails){
ComparedFace face= match.getFace();
BoundingBox position = face.getBoundingBox();
Log.i("compare","Face at " + position.getLeft().toString()
+ " " + position.getTop()
+ " matches with " + match.getSimilarity().toString()
+ "% confidence.");
}
List<ComparedFace> uncompared = compareFacesResult.getUnmatchedFaces();
Log.i("compare","There was " + uncompared.size()
+ " face(s) that did not match");
Here's my log Log points to compare faces line of code CompareFacesResult compareFacesResult = rekognitionClient.compareFaces(compareFacesRequest);
2021-07-18 01:39:33.988 16963-16963/... E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.*****e, PID: 16963
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
at java.net.InetAddress.getAllByName(InetAddress.java:1154)
at com.android.okhttp.Dns$1.lookup(Dns.java:39)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:258)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:26)
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:386)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:229)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.invoke(AmazonRekognitionClient.java:4521)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.compareFaces(AmazonRekognitionClient.java:487)
at com.****.registration_screens.SubmitPhoto.lambda$onCreate$0(SubmitPhoto.java:103)
at com.***.registration_screens.-$$Lambda$SubmitPhoto$lt0KUIz3Dr33aAQ8zZJQHwtPE-w.onClick(Unknown Source:0)
at android.view.View.performClick(View.java:6608)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:6585)
at android.view.View.access$3100(View.java:785)
at android.view.View$PerformClick.run(View.java:25921)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6864)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Upvotes: 0
Views: 200
Reputation: 23
This is an Android related error. You cannot perform a network related task on the main thread as it may hang/freeze your app's UI.
Rekognition API needs to be called on a background thread using Asynchtask (depricated in API 30) or using an executorService thread.
Upvotes: 0
Reputation: 523
This appears to be an Android related error (not Rekognition related). Android requires the user to perform networking operations (in this case, calling the Rekognition API) outside of the main thread as explained here:
How to fix 'android.os.NetworkOnMainThreadException'?
Upvotes: 1