Старый пост, но он говорит о схожей проблеме, с которой я столкнулся, поэтому я мог бы также ответить на ту часть, которую я знаю:)
Вы, вероятно, делаете это неправильно. Я предлагаю вам использовать обратный вызов JPEG для хранения изображения:
mCamera.takePicture(null, null, callbackJPEG);
Таким образом, вы получите данные JPEG в подпрограмме, которые вы можете сохранить в неизмененном файле:
final Camera.PictureCallback mCall = new Camera.PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
//Needs <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
File sdCard = Environment.getExternalStorageDirectory();
File file = new File(sdCard, "pic.jpg");
fil = new FileOutputStream(file);
fil.write(data);
fil.close();
}
}
Что касается черной картинки, я обнаружил, что размещение простого Thread.sleep(250)
между camera.startPreview()
и camera.takePicture()
решает эту проблему на моем Galaxy Nexus.
Я понятия не имею, почему эта задержка необходима. Даже если я добавлю camera.setOneShotPreviewCallback()
и позвоню camera.takePicture()
из обратного вызова, изображение получится черным, если я не сделаю первую задержку ...
Да, и задержка не просто «какая-то» задержка. Это должно быть довольно длинное значение. Например, 250ms
иногда работает, иногда не на моем телефоне.