来自onPictureTaken回调的decodeByteArray数据返回null

时间:2016-06-30 02:36:49

标签: android

在SO上有类似的问题,但没有一个符合我的具体情况。

我正在使用官方tutorial实施相机控制。

我拍摄的方式是调用mCamera.takePicture(null, null, this)然后从onPictureTaken接收回调。我遇到的问题是我无法将decodeByteArray数据传递到onPictureTakendecodeByteArray继续返回null。似乎字节数组的格式无效。

我尝试通过FileOutputStream保存字节数组,就像在教程中一样,然后通过decodeFile再次读取字节,它仍然返回null。我尝试捕获异常但没有被捕获。

请注意我可以保存照片。我无法从传递的参数中读取字节数。我似乎无法解决这个问题。

这是我的代码:

@Override
public void onPictureTaken(byte[] data, Camera camera)
{
    FileOutputStream out = null;
    String fileName =  Photo.getDirectory(this) + "/Confirm_" + mDateFormatter.format(new Date()) + ".jpg";

    try
    {
        File temp = new File(fileName);
        out = new FileOutputStream(temp);
        out.write(data);
        out.close();

        try
        {
            // This always returns NULL
            BitmapFactory.Options option = new BitmapFactory.Options();
            option.inJustDecodeBounds = true;
            option.inSampleSize = 2;
            Bitmap bitmap = BitmapFactory.decodeFile(fileName, option);

            if(bitmap == null) ; // TRUE
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        /*
        Camera.Parameters param = mCamera.getParameters();
        List<Camera.Size> sizes = param.getSupportedPictureSizes();
        Bitmap bitmap = BitmapFactory.decodeFile(fileName);

        for(Camera.Size s : sizes)
        {
            Log.i(PhotoApplication.TAG, "Size : " + s.width + " x " + s.height);
        }
        */

        Intent intent = new Intent();
        intent.putExtra(EXTRA_FILENAME, temp.getAbsolutePath() + "/" + temp.getName());
        setResult(RESULT_OK, intent);

        Toast.makeText(this, "Saving as : " + temp.getAbsolutePath() + "/" + temp.getName(), Toast.LENGTH_LONG).show();
    }
    catch(FileNotFoundException e)
    {

    }
    catch(IOException e)
    {

    }
    finally
    {
        try
        {
            if(out != null)
                out.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    finish();
}

1 个答案:

答案 0 :(得分:1)

问题是

option.inJustDecodeBounds = true;

根据文件

  

如果设置为true,解码器将返回null(无位图),但仍将设置out ...字段,允许调用者查询位图而无需为其像素分配内存。

如果您想要解码位图供以后使用,请将其删除或设置为false