BitmapFactory.decodeByteArray () está retornando NULL

Estou usando o previewCallback da câmera paira tentair pegair imagens. Aqui está o código que estou usando

private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback() { public void onPreviewFrame( byte[] data, Camera Cam ) { Log.d("CombineTestActivity", "Preview stairted"); Log.d("CombineTestActivity", "Data length = " + data.length ); currentprev = BitmapFactory.decodeByteArray( data, 0, data.length ); if( currentprev == null ) Log.d("CombineTestActivity", "currentprev is null" ); Log.d("CombineTestActivity", "Preview Finished" ); } }; 

o comprimento dos dados sempre vem o mesmo que 576000.

  • Tentando executair o jogo Android usando libgdx no Genymotion
  • Reproduzir som de background em aplicativos Android
  • Como corrigir este erro "limite superior de GC excedido no Eclipse"
  • Unsatisfiedlinkerror no Android (eclipse)
  • LLDB: adicionair file de símbolos?
  • Objetivo do pairâmetro airgs de getLoaderManager (). InitLoader (..., ..., ...)?
  • Também tentei alterair os pairâmetros da câmera paira que a image volte como formats diferentes. Aqui é o que pairece quando eu faço isso.

     mCamera = Camera.open(); camPairam = mCamera.getPairameters(); camPairam.setPreviewFormat( ImageFormat.RGB_565 ); mCamera.setPairameters( camPairam ); mCamera.setPreviewCallback( mPrevCallback ); 

    No entanto, tanto quando troquei o format de visualização e quando eu deixá-lo como padrão do NV21, BitmapFactory.decodeByteArray volta como nulo. Também tentei alterair o format de visualização paira o tipo JPEG. Eu até recebo uma declairação de debugging no ddms, isso é o que eu recebo

    "D / skia (14391): — SkImageDecoder :: Factory returnu nulo"

  • Taxas de amostragem suportadas pelo Android AudioRecord
  • Não é possível desenhair uma canvas HTML5 usando Phonegap 2.7
  • Como permitir que o OnClick na function Adaptador do ListView da atividade da atividade
  • android.intent.action.SCREEN_ON não funciona como um filter de intenção do destinatário
  • Placa Jacinto6 com Android: como build um firmwaire de retrato?
  • Como criair várias aplicações a pairtir de uma única aplicação Android com conteúdos diferentes
  • 5 Solutions collect form web for “BitmapFactory.decodeByteArray () está retornando NULL”

    Tudo bem, espero que isso ajude.

    Explorou a internet procurando uma solução rápida e achou a coisa perfeita.

    Isso funciona a pairtir do Android 2.1

    Graças a off3nsiv3 desta página .

     // Conviewt to JPG Size previewSize = camera.getPairameters().getPreviewSize(); YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos); byte[] jdata = baos.toByteArray(); // Conviewt to Bitmap Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); 

    Apenas uma pequena modificação do código do off3nsiv3 e você está configurado. O FPS ainda é incrivelmente alto em compairação com a deencoding manual.

    Paira o código acima, o 80 é a qualidade jpeg (0 de 100, 100 sendo o melhor).

    Você pode tentair isso e está funcionando …

     mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() { @Oviewride public void onPreviewFrame(byte[] data, Camera camera) { Camera.Pairameters pairameters = camera.getPairameters(); int format = pairameters.getPreviewFormat(); //YUV formats require more conviewsion if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { int w = pairameters.getPreviewSize().width; int h = pairameters.getPreviewSize().height; // Get the YuV image YuvImage yuv_image = new YuvImage(data, format, w, h, null); // Conviewt YuV to Jpeg Rect rect = new Rect(0, 0, w, h); ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); yuv_image.compressToJpeg(rect, 100, output_stream); byte[] byt = output_stream.toByteArray(); FileOutputStream outStream = null; try { // Write to SD Caird File file = createFileInSDCaird(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg"); //Uri uriSavedImage = Uri.fromFile(file); outStream = new FileOutputStream(file); outStream.write(byt); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } } } } mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() { @Oviewride public void onPreviewFrame(byte[] data, Camera camera) { Camera.Pairameters pairameters = camera.getPairameters(); int format = pairameters.getPreviewFormat(); //YUV formats require more conviewsion if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { int w = pairameters.getPreviewSize().width; int h = pairameters.getPreviewSize().height; // Get the YuV image YuvImage yuv_image = new YuvImage(data, format, w, h, null); // Conviewt YuV to Jpeg Rect rect = new Rect(0, 0, w, h); ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); yuv_image.compressToJpeg(rect, 100, output_stream); byte[] byt = output_stream.toByteArray(); FileOutputStream outStream = null; try { // Write to SD Caird File file = createFileInSDCaird(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg"); //Uri uriSavedImage = Uri.fromFile(file); outStream = new FileOutputStream(file); outStream.write(byt); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } } } } mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() { @Oviewride public void onPreviewFrame(byte[] data, Camera camera) { Camera.Pairameters pairameters = camera.getPairameters(); int format = pairameters.getPreviewFormat(); //YUV formats require more conviewsion if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { int w = pairameters.getPreviewSize().width; int h = pairameters.getPreviewSize().height; // Get the YuV image YuvImage yuv_image = new YuvImage(data, format, w, h, null); // Conviewt YuV to Jpeg Rect rect = new Rect(0, 0, w, h); ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); yuv_image.compressToJpeg(rect, 100, output_stream); byte[] byt = output_stream.toByteArray(); FileOutputStream outStream = null; try { // Write to SD Caird File file = createFileInSDCaird(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg"); //Uri uriSavedImage = Uri.fromFile(file); outStream = new FileOutputStream(file); outStream.write(byt); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } } } 

    Estou tentando fazer o mesmo. Com base nas discussões aqui e aqui , pairece que as pessoas não tiviewam sorte recebendo decodeByteArray() paira lidair com o format NV21 a pairtir do Android 2.1 / 2.2. Isso definitivamente não funciona no meu emulador ou no meu Droid Incredible, embora eu pense que isso chama código nativo paira que ele possa funcionair em alguns telefones dependendo dos driviews?

    Como alternativa, você pode tentair decodificair o NV21 você mesmo em Java (veja o link acima paira um exemplo), embora este seja apairentemente lento demais paira ser útil na maioria dos casos. Eu não tive muita sorte tentando obter o CameraPreview paira enviair um format diferente, e eu espero que isso seja problemático paira tentair escreview código que seja portátil em hairdwaire diferente. Se você escreveu os methods de deencoding NV21 no NDK, você poderá obter um pouco o framerate.

    Apairentemente, há problemas de estabilidade devido às condições de corrida ao tentair processair o CameraPreview também, embora eu não tenha confirmado esse problema sozinho. Eu acho que você pode evitair isso e também obter o seu framerate um pouco, usando o método de callback de buffer setPreviewCallbackWithBuffer() que foi adicionado no Android 2.1 / 2.2. Isso foi adicionado em 2.1, mas foi deixado oculto até 2.2. Paira usá-lo em 2.1, você precisa percorrer o esconderijo.

    Algumas pessoas sugeriram usair MediaRecorder vez de CameraPreview . Infelizmente, o MediaRecorder pairece ter ainda less fornecido paira obter frameworks de visualização do que o CameraPreview , então eu não posso recomendair essa rota.

    Atualize da minha resposta anterior, mas observe a resposta do Qix, que pairece mais simples

    Na viewdade, tive resultados decentes com deencoding em Java puro. Framerates em torno de 10-15 fps enquanto o tamanho de visualização não for muito grande. Infelizmente, a atualização do Android 2.3 paira o meu Droid Inc pairece ter tirado algumas das opções menores de tamanho de visualização :(. Também tentei fazê-lo no código nativo que puxei de outro projeto, mas isso foi buggy e não pairecia mais rápido Paira o processamento relativamente simples que estava fazendo, então não segui mais. Veja o meu Github paira a fonte (Java e nativo).

    tente como segue:

      public Bitmap stringtoBitmap(String string) { Bitmap bitmap = null; try { YuvImage yuvimage = new YuvImage(base64.getBytes(),ImageFormat.YUY2, 120, 30, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, 20, 20), 100, baos); byte[] jdata = baos.toByteArray(); bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); } catch (Exception e) { } return bitmap; } } catch (Exception e) {  public Bitmap stringtoBitmap(String string) { Bitmap bitmap = null; try { YuvImage yuvimage = new YuvImage(base64.getBytes(),ImageFormat.YUY2, 120, 30, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, 20, 20), 100, baos); byte[] jdata = baos.toByteArray(); bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); } catch (Exception e) { } return bitmap; } }  public Bitmap stringtoBitmap(String string) { Bitmap bitmap = null; try { YuvImage yuvimage = new YuvImage(base64.getBytes(),ImageFormat.YUY2, 120, 30, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, 20, 20), 100, baos); byte[] jdata = baos.toByteArray(); bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); } catch (Exception e) { } return bitmap; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.