Takepicture hängt auf Android 2.3.3

Ich habe einige Codes von Aufnahme, die in Android 2.1 und 2.2 funktioniert. Aber diese Codes brach bei Android 2.3. Nachdem ich Zeit gehabt habe, dieses Problem zu beheben, das vergeblich ging, möchte ich hier um Hilfe bitten.

Mein Code fließt, um Bild zu machen ist wie folgt:

  • Android: Bluetooth-Druck
  • Android: Stifte TabLayout zum Scrollview
  • Begrenzung der Anzahl der Zeilen in einer ContentResolver.query () - Funktion
  • Gibt es eine programmatische Möglichkeit zu erkennen, ob die Kamera einen optischen Zoom hat?
  • In App Billing getPrice () Android
  • Gibt es irgendwelche http Proxies wie Fiedler oder wireshark auf Android?
  • Erstellen einer Klasse Camlayer erweitert SurfaceView

    public class CamLayer extends SurfaceView implements SurfaceHolder.Callback { private void init(Context context){ // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mCamera = Camera.open(); } public CamLayer(Context context) { super(context); init(context); } public CamLayer(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Log.i(TAG+".surfaceChanged", "being called!"); Log.i(TAG+".surfaceChanged", "w="+w); Log.i(TAG+".surfaceChanged", "h="+h); if (isPreviewRunning) { mCamera.stopPreview(); } try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(mPreviewCallback); } catch (IOException e) { Log.e(TAG+".surfaceCreated", "mCamera.setPreviewDisplay(holder);"); } Camera.Parameters p = mCamera.getParameters(); setOptimalSize(p, w, h, SIZEOFPREVIEW); setOptimalSize(p, w, h, SIZEOFPICTURE); mCamera.setParameters(p); mCamera.startPreview(); isPreviewRunning = true; } public void takePicture(){ Log.i(TAG+".takePicture", "being called!"); mCamera.takePicture(null, null, mPictureCallback); Log.i(TAG+".takePicture", "call ended!"); } } 

    CamLayer.takePicture() wird von externen Klassen aufgerufen, um zu starten.

    Das Problem ist, dass bei Android 2.3.3 die takePicture hängen wird, so dass ein ANR-Problem gefunden wird. In /data/anr/traces.txt finden Sie unten. Wie Sie sehen können, kommt das native_takePicture niemals zurück.

    DALVIKGEWINDE:

     (mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x40022170 self=0xce68 | sysTid=2411 nice=0 sched=0/0 cgrp=default handle=-1345006464 at android.hardware.Camera.native_takePicture(Native Method) at android.hardware.Camera.takePicture(Camera.java:746) at android.hardware.Camera.takePicture(Camera.java:710) at oms.cj.tube.camera.CamLayer.takePicture(CamLayer.java:256) at oms.cj.tube.camera.DefineColor.takePicture(DefineColor.java:61) at oms.cj.tube.camera.DefineColor.onKeyUp(DefineColor.java:71) at android.view.KeyEvent.dispatch(KeyEvent.java:1280) at android.app.Activity.dispatchKeyEvent(Activity.java:2078) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:16 66) at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2571) at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2546) at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3691) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) 

    Gibt es jemanden, der das gleiche Problem hat? Und wissen, wie man es repariert?

  • PictureCallback.onPictureTaken hat niemals angerufen
  • Android ersetzt das aktuelle Fragment mit einem anderen Fragment
  • Tut Google-Gebühr für Einkäufe in App?
  • Wie bekomme ich die grobe Lage mit Wifi oder GSM oder GPS, was auch immer verfügbar ist?
  • AsyncTask Android Beispiel
  • Wie bekomme ich Screen-Metriken außerhalb einer Aktivität?
  • 5 Solutions collect form web for “Takepicture hängt auf Android 2.3.3”

    Ich habe auch beobachtet mCamera.takePicture (null, null, Handler) zum Einfrieren. Ich habe versucht, den Vorschau-Handler zu löschen: mCamera.setPreviewCallback (null) vor dem Aufruf von takePicture (), und es funktioniert jetzt.

    Ich hatte genau das gleiche Problem heute beim Testen unserer App auf einem Samsung Exhibit 4G mit Android 2.3.3 und löste es mit einem Workaround.

    Ich rufe nicht mehr auf, sondern benutze den letzten Vorschau-Rückruf als Bild.

    Das Problem ist, dass der Vorschau-Rückruf den Datenpuffer mit dem NV21-Format sendet.

    So musst du das Bild mit diesem Prozess konvertieren: NV21 -> RGB -> Bitmap laden -> Komprimieren auf JPEG

    Unser Code sieht jetzt so aus:

      camera.setPreviewCallback(new PreviewCallback() { @Override public synchronized void onPreviewFrame(byte[] data, Camera arg1) { if (!mTakePicture) { CameraPreview.this.invalidate(); } else { if (mTakePictureCallback != null && !mPictureTaken) { int rgb[] = new int[previewSize.width*previewSize.height]; decodeYUV420SP(rgb, data, previewSize.width, previewSize.height); Bitmap memoryImage = Bitmap.createBitmap(rgb, previewSize.width, previewSize.height, Bitmap.Config.ARGB_8888); ByteArrayOutputStream baos = new ByteArrayOutputStream(); memoryImage.compress(CompressFormat.JPEG, 100, baos); shutterSound(); setBackgroundDrawable(new BitmapDrawable(getContext().getResources(), memoryImage)); mTakePictureCallback.onPictureTaken(baos.toByteArray(), arg1); } mPictureTaken = true; camera.stopPreview(); } } }); 

    Der Code von decodeYUV420SP ist hier http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array wer fand es auf Ketai http://code.google. Com / p / ketai /

    Wenn du ein Bild machst, setze einfach die Variable mTakePicture auf true

    Ich arbeite an einer besseren Version, aber das sollte dich gehen.

    Ich bin mir nicht sicher, was die setOptimalSize-Methode in Ihrem Code verwendet, aber stellen Sie sicher, dass Sie Kamera-Parameter eingestellt haben

     mCamera.setPictureSize(captureSize.width, captureSize.height); mCamera.setPictureFormat(ImageFormat.JPEG); 

    Das Problem liegt in der Tatsache, dass unten Codes geschrieben sind.

    1. Es ist ein PreviewCallback definiert,

       PreviewCallback mPreviewCallback = new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { //Log.i(TAG+".mPreviewCallback.onPreviewFrame", "being called!"); } }; 
    2. MCamera.setPreviewCallback (mPreviewCallback);

    3. MCamera.takeBild ()

    Das funktioniert in 2.1 / 2.2, aber nicht in 2.3.

    Nicht sicher, ob Android-Team unterstützt diese Art der Verwendung von Kamera. Wenn der oben genannte Fluss erwartet wird, dann sollte das Android-Team dieses Problem beheben.

    Ich lief in dieses Problem mit GB-Handys, und für mich, es stellte sich heraus, weil ich war calling camera.startPreview () direkt nach dem Aufrufen von camera.takePicture (), und dies war verursacht einige Thread-Sperren in Android. Das Update war, um camera.startPreview () in den Rückruf zu bewegen, der in camera.takePicture () übergeben wurde, so dass es nur einmal aufgerufen wurde, sobald die Bilddaten in (Beispielcode unten) waren. Dies ist natürlich nur relevant, wenn Sie daran interessiert sind, die Vorschau neu zu starten, nachdem das Bild aufgenommen wurde.

     // BAD BAD DON'T DO THIS! public void myTakePicture(Camera.PictureCallback callback) { mCamera.takePicture(null, null, null, callback); mCamera.startPreview(); } // ... // The way that worked for me public void myTakePicture(final Camera.PictureCallback callback) { mCamera.takePicture(null, null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] pictureData, Camera camera) { callback.onPictureTaken(pictureData, camera); mCamera.takePicture(); } }); } 

    Dies machte nicht nur die ANR weg, wenn sie takePicture anrief, sondern auch einen einheimischen Crash auf startPreview, der bei einigen höheren Endgeräten geschah (insbesondere ein> = 4.3 Nexus 5). Ich hoffe es hilft!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.