私はサーバーコール時にイメージを取得し、そのイメージをサーバーに送信するアプリケーションを開発しています。私が定義したCameraSurfaceView
クラスのコードです。プログラムでプログラムを撮るにはどうすればいいですか?
private SurfaceHolder holder;
private Camera camera;
private Bitmap osb;
public void takeImage(){
Camera camera = this.getCamera();
CameraSurfaceView.HandlePictureStorage c = this.new HandlePictureStorage();
camera.takePicture(null, null, c);
}
public byte[] getImage(String type) {
if (osb==null) {
System.err.println("Camera.getImage: osb NULL");
return null;
}
CompressFormat format = CompressFormat.JPEG;
if (type.equals("PNG")) {
format = CompressFormat.PNG;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
System.err.println("Camera.getImage: decoded");
osb.compress(format, 100, out);
System.err.println("Camera.getImage: compressed");
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} finally {
//lock.unlock();
}
byte[] bytes = out.toByteArray();
return bytes;
}
public void saveImage(byte[] picture) {
System.err.println("saveImage");
osb = BitmapFactory.decodeByteArray(picture, 0, picture.length);
}
と内部クラスHandlePictureStorage
がPictureCallBack
@Override
public void onPictureTaken(byte[] picture, Camera camera)
{
CameraSurfaceView.this.saveImage(picture);
}
を実装して、私は外からtakeImage()
、その後getImage()
関数を呼び出すとき、私はクラスHandlePictureStorage
のonPictureTaken(byte[] picture, Camera camera)
上のコードでは、画像を保存するために、右takeImage()
後に実行されることが期待さgetImage()
の前には、getImage()
に検索するデータがあります。残念ながら
、私はlogcatに表示、右takeImage()
後とonPictureTaken()
前に実行getImage()
機能。したがって、画像が保存されていないので、takeImage
はヌルデータしか取得できないことは明らかです。 takeImage()
とgetImage()
を再度実行すると、関数getImage()
は前のショットの画像を返します。
あなたは何を言ってくれましたか? Konstantinに感謝します。私は画像が保存されたかどうかをチェックするためにセマフォーを追加し、その後にgetImage()を実行してこの問題を解決しました。 – user1033464
解決策を受け入れることを忘れないでください。%)コールバックからsaveImage()を呼び出すことができるので、セマフォの必要はありません。また、UI操作が必要な場合は、runOnUiThread()を使用することができます。 –