2017-03-19 2 views
1

Ma tâche consiste à obtenir des images de prévisualisation de la caméra, à les traiter et à mettre à jour un TextView dans ma mise en page.Je fais référence à l'exemple de camera2 de google et ai réussi à obtenir des cadres en utilisant la méthode OnImageAvailable() de OnImageAvailableListener ne peut pas mettre à jour le contenu de mon TextView dans la définition OnImageAvailable() (accidents de l'application). Je suis assez nouveau pour la programmation Android et Java. Toute façon de mettre à jour mon TextView après avoir obtenu chaque image.Mise à jour de TextView MainActivity dans ImageReader OnImageAvailable

Définition de OnImageAvailable (partie d'un fragment, pas le CameraActivity, comme l'échantillon de google):

public final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
      = new ImageReader.OnImageAvailableListener() { 

     @Override 
     public void onImageAvailable(ImageReader reader) { 
      Image image = null; 
      try { 
       image = reader.acquireLatestImage(); 
       ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
       byte[] imageBytes = new byte[buffer.remaining()]; 
       buffer.get(imageBytes); 
       final Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
       textView.append("a"); // crashes here 
      } finally { 
       if (image != null) { 
        image.close(); 
       } 
      } 
     } 
    }; 

journal Crash d'Android Moniteur:

03-19 13:14:12.384 13895-14107/com.example.android.camera2basic E/AndroidRuntime: FATAL EXCEPTION: CameraBackground 
                        Process: com.example.android.camera2basic, PID: 13895 
                        android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
                         at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6462) 
                         at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:932) 
                         at android.view.ViewGroup.invalidateChild(ViewGroup.java:4692) 
                         at android.view.View.invalidateInternal(View.java:11806) 
                         at android.view.View.invalidate(View.java:11770) 
                         at android.view.View.invalidate(View.java:11754) 
                         at android.widget.TextView.checkForRelayout(TextView.java:6867) 
                         at android.widget.TextView.setText(TextView.java:4063) 
                         at android.widget.TextView.setText(TextView.java:3921) 
                         at android.widget.TextView.append(TextView.java:3627) 
                         at android.widget.TextView.append(TextView.java:3617) 
                         at com.example.android.camera2basic.Camera2BasicFragment$6.onImageAvailable(Camera2BasicFragment.java:760) 
                         at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:548) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:135) 
                         at android.os.HandlerThread.run(HandlerThread.java:61) 
+0

Mettez votre code détail à l'intérieur « OnImageAvailable () " – moon

+0

poster le crash aussi –

Répondre

0

Vous devez mettre dans un runnable /fil. Je ne suis pas vraiment versé avec elle, mais peut-être que cela pourrait aider, mais si elle ne le fait pas, je suis plus sûr qu'il est orienté dans la bonne direction à une solution

public final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
      = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(final ImageReader reader) { 
      Image image = null; 
      try { 
       image = reader.acquireLatestImage(); 
       ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
       byte[] imageBytes = new byte[buffer.remaining()]; 
       buffer.get(imageBytes); 
       final Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 

       YourClassNameHere.this.runOnUIThread(new Runnable() { 
        @Override 
        public void run() { 
         textView.append("a"); // crashes here 
       }); 

      } finally { 
       if (image != null) { 
        image.close(); 
       } 
      } 
      } 

    } 
    }; 
+0

La définition OnImageAvailable() est dans un fragment et non dans l'activité principale. J'ai essayé getactivity(). RunOnUIThread() et cela a fonctionné. Merci beaucoup. –