在SO上有类似的问题,但没有一个符合我的具体情况。
我正在使用官方tutorial实施相机控制。
我拍摄的方式是调用mCamera.takePicture(null, null, this)
然后从onPictureTaken
接收回调。我遇到的问题是我无法将decodeByteArray
数据传递到onPictureTaken
。 decodeByteArray
继续返回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();
}
答案 0 :(得分:1)
问题是
option.inJustDecodeBounds = true;
根据文件
如果设置为true,解码器将返回null(无位图),但仍将设置out ...字段,允许调用者查询位图而无需为其像素分配内存。
如果您想要解码位图供以后使用,请将其删除或设置为false
。