AWS Android SDK Rekognition 2.4.4 detectFaces 因空对象引用而失败
AWS Android SDK Rekognition 2.4.4 detectFaces fails with null object reference
我正在尝试使用 AWS Android SDK Reckognition 2.4.4 进行简单的面部检测调用。有人可以指出哪里出了问题吗?
我收到以下错误
FATAL EXCEPTION: main
Process: com.indus.myfirstapp, PID: 8887
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.indus.myfirstapp/com.indus.myfirstapp.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.deliverResults(ActivityThread.java:3929)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1288)
at java.net.InetAddress.lookupHostByName(InetAddress.java:432)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:253)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:368)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:351)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:341)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:259)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:454)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java)
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:1229)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.detectFaces(AmazonRekognitionClient.java:628)
at com.indus.myfirstapp.MainActivity.onActivityResult(MainActivity.java:95)
at android.app.Activity.dispatchActivityResult(Activity.java:6500)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3925)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
这是代码
package com.indus.myfirstapp;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.rekognition.model.Attribute;
import com.amazonaws.services.rekognition.model.DetectFacesRequest;
import com.amazonaws.services.rekognition.model.DetectFacesResult;
import com.amazonaws.services.rekognition.model.Image;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.ByteBuffer;
public class MainActivity extends AppCompatActivity {
//public static final String EXTRA_MESSAGE = "com.indus.myfirstapp.MESSAGE";
static final int REQUEST_IMAGE_CAPTURE = 1;
static AmazonRekognition client = null;
Image searchImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//call
new CredRetriever().execute();
}
class CredRetriever extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
AWSCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"us-west-2:xxxxx", // Identity pool ID
Regions.US_WEST_2 // Region
);
Log.i("TEST",credentialsProvider.getCredentials().toString());
client = new AmazonRekognitionClient(credentialsProvider);
return null;
}
}
public void startCamera(View view) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
ByteBuffer imageBytes = ByteBuffer.wrap(stream.toByteArray());
searchImage = new Image();
searchImage.withBytes(imageBytes);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(imageBitmap);
DetectFacesRequest request = new DetectFacesRequest()
.withAttributes(Attribute.ALL.toString())
.withImage(searchImage);
DetectFacesResult result = client.detectFaces(request);
result.getFaceDetails();
}
}
}
这行代码需要在后台线程中执行。
DetectFacesResult result = client.detectFaces(request);
我正在尝试使用 AWS Android SDK Reckognition 2.4.4 进行简单的面部检测调用。有人可以指出哪里出了问题吗?
我收到以下错误
FATAL EXCEPTION: main
Process: com.indus.myfirstapp, PID: 8887
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.indus.myfirstapp/com.indus.myfirstapp.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.deliverResults(ActivityThread.java:3929)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1288)
at java.net.InetAddress.lookupHostByName(InetAddress.java:432)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:253)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:368)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:351)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:341)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:259)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:454)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java)
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:1229)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.detectFaces(AmazonRekognitionClient.java:628)
at com.indus.myfirstapp.MainActivity.onActivityResult(MainActivity.java:95)
at android.app.Activity.dispatchActivityResult(Activity.java:6500)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3925)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
这是代码
package com.indus.myfirstapp;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.rekognition.model.Attribute;
import com.amazonaws.services.rekognition.model.DetectFacesRequest;
import com.amazonaws.services.rekognition.model.DetectFacesResult;
import com.amazonaws.services.rekognition.model.Image;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.ByteBuffer;
public class MainActivity extends AppCompatActivity {
//public static final String EXTRA_MESSAGE = "com.indus.myfirstapp.MESSAGE";
static final int REQUEST_IMAGE_CAPTURE = 1;
static AmazonRekognition client = null;
Image searchImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//call
new CredRetriever().execute();
}
class CredRetriever extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
AWSCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"us-west-2:xxxxx", // Identity pool ID
Regions.US_WEST_2 // Region
);
Log.i("TEST",credentialsProvider.getCredentials().toString());
client = new AmazonRekognitionClient(credentialsProvider);
return null;
}
}
public void startCamera(View view) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
ByteBuffer imageBytes = ByteBuffer.wrap(stream.toByteArray());
searchImage = new Image();
searchImage.withBytes(imageBytes);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(imageBitmap);
DetectFacesRequest request = new DetectFacesRequest()
.withAttributes(Attribute.ALL.toString())
.withImage(searchImage);
DetectFacesResult result = client.detectFaces(request);
result.getFaceDetails();
}
}
}
这行代码需要在后台线程中执行。
DetectFacesResult result = client.detectFaces(request);