2

アプリケーションを介して携帯電話で写真を撮り、その画像を携帯電話に保存したい。スタックオーバーフローの質問で提案された解決策の多くを試しましたが、マークされなかったので、正しい名前でファイルを保存する方法を構築しました...しかし、ファイルは空です(0kb)!

これが私のコードです

public class GameActivity extends Activity implements SurfaceHolder.Callback/*,Camera.PictureCallback*/ {

private Camera camera;
private SurfaceView surfaceCamera;
public Handler handler = new Handler(); 
private boolean isPreview=false;
private SurfaceHolder holder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gameactivity);
    surfaceCamera = (SurfaceView) findViewById(R.id.surfaceViewCamera);
    getWindow().setFormat(PixelFormat.UNKNOWN);
    holder = surfaceCamera.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    ImageView image = (ImageView) findViewById(R.id.imageView3);
    image.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
   camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);     
            return false;

}


Camera.ShutterCallback myShutterCallback = new Camera.ShutterCallback() {
    public void onShutter() {
      // TODO bl
    }
  };

PictureCallback myPictureCallback_RAW = new PictureCallback() {

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub

    }
};


PictureCallback myPictureCallback_JPG = new PictureCallback(){

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
            File imagesFolder = new File(Environment.getExternalStorageDirectory(), "/KersplattFolder");
            imagesFolder.mkdirs(); 
            String fileName = "image.jpg";
            File output = new File(imagesFolder, fileName);
            try {
                FileOutputStream fos = new FileOutputStream(output);
                fos.write(data[0]);
                fos.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

                Toast.makeText(GameActivity.this, 
                        "Image saved: ", 
                        Toast.LENGTH_LONG).show();
            camera.startPreview();
            }
};


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    if (isPreview) {
        camera.stopPreview();
    }
    Camera.Parameters p = camera.getParameters();
    p.setPreviewSize(width,height);
    camera.setParameters(p);
    try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    camera.startPreview();
    isPreview=true;
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();

}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    isPreview=false;
    camera.release();

}

EDIT1 : data[0] の代わりに data を配置すると、黒い画像も保存されますが、ファイルには重みがあるため、実際の画像はどこかにあると思います...

EDIT2 コードを追加しました

                File output = new File(imagesFolder, fileName);
            Uri outputFileUri = Uri.fromFile(output);
            String filePath = outputFileUri.getPath();
            File file= new File(filePath);
            try {
                FileOutputStream fos = new FileOutputStream(file,true);
                fos.write(data);
                fos.close();
            } 

相変わらず黒いイメージ

4

2 に答える 2

0

あなたのコード:fos.write(data [0]); 間違っている。例外が発生しなかったことに驚いています

写真を撮った後にバイト配列を保存するために使用したコードは次のとおりです。「データ」はバイト配列です。

String filePath = outputFileUri.getPath(); // .getEncodedPath();
    File file = new File(filePath);
    FileOutputStream os;
    try {
        os = new FileOutputStream(file, true);
        os.write(data);
        os.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2013-01-29T15:51:53.873 に答える
0

ここで説明されているように、Android マニフェストで必要なアクセス許可を定義しましたか?

<manifest ... >
    <uses-feature android:name="android.hardware.camera" />
    ...
</manifest ... >

更新: OK、data の後の括弧を削除します: data[] ではなく data です。その後、動作するはずです。

于 2013-01-29T15:37:43.237 に答える