2017-07-18 46 views
0

我想用AWS Android SDK Reckognition 2.4.4做一個簡單的人臉檢測調用。有人能指出發生了什麼問題嗎?AWS Android SDK Rekognition 2.4.4 detectFaces失敗,空對象引用

我正在以下錯誤

致命異常:主 工藝:com.indus.myfirstapp,PID:8887 了java.lang.RuntimeException:失敗遞送結果ResultInfo {誰= NULL,請求= 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。在Android.app.ActivityThread中使用ActivityThread.-wrap16(ActivityThread.java) $ hHandleMessage(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) 引起:android.os.NetworkOnMainThreadException at android.os.StrictMode $ An droidBlockGuardPolicy.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 $ 1.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 .okh ttp.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) 在com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:259) 在com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl。的java:454) 在com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114) 在com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245) 在com.android.okhttp.internal.huc.Delega tingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) 在com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java) 在com.amazonaws.http.UrlHttpClient.writeContentToConnection(UrlHttpClient.java:162) 在com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:75) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:371) at com.amazonaws.http.AmazonHttpClient。執行(AmazonHttpClient.java:212) 在com.amazonaws.services.rekognition.AmazonRekognitionClient.invoke(AmazonRekognitionClient.java:1229) 在com.amazonaws.services.rekognition.AmazonRekognitionClient.detectFaces(AmazonRekognitionClient.java:628) 在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 ) 在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(); 


     } 
    } 

} 

回答

0

這行代碼需要在後臺線程上執行。

DetectFacesResult result = client.detectFaces(request); 
+0

謝謝。我能夠使用線程來運行這個。 – ez2k1