1

アプリでカメラを使用すると、メモリに問題があります。私は写真を撮るためにSurfaceViewを使用しました。log catで写真を撮った後、ヒープメモリが30 mb、場合によっては40mbに増加することを示しています。このため、アプリが「OutofMemoryException」もクラッシュすることがあります。ここに私のコードを提供しています。私を助けてください。

surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


capture.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            camera.takePicture(myShutterCallback, myPictureCallback_RAW,
                    myPictureCallback_JPG);
            capture.setClickable(false);
        }
    });



PictureCallback myPictureCallback_RAW = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {
        System.out.println("myPictureCallback_RAW");
    }
};




 PictureCallback myPictureCallback_JPG = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {


        try {

            bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0,
                    arg0.length);

        }
        catch (OutOfMemoryError e) {
                Toast.makeText(FromCamera.this, "Please try again",
                        Toast.LENGTH_SHORT).show();
        }catch (Exception e) {
            Toast.makeText(FromCamera.this, "Please try again",
                    Toast.LENGTH_SHORT).show();
        }

        capture.setEnabled(false);
        buttonBack.setVisibility(View.VISIBLE);
        buttonDone.setVisibility(View.VISIBLE);
        buttonBack.setEnabled(true);
        buttonDone.setEnabled(true);
    }
};



ShutterCallback myShutterCallback = new ShutterCallback() {
    @Override
    public void onShutter() {
        System.out.println("onShutter");
    }
};

ガベージコレクションを強制的に試しましたが、まだ役に立ちません。

public void surfaceDestroyed(SurfaceHolder holder) {
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
    previewing = false;
}
4

3 に答える 3

1

アプリのメモリ割り当てを調べる必要があります。関連する投稿を参照してください(最後にいくつかの素晴らしい記事がリンクされています)。

于 2012-10-20T09:49:23.210 に答える
0

使用後にカメラを離していますか?写真の撮影が完了したら、camera.release() を使用してカメラを解放し、メモリ使用量を再度評価してください。

あなたが試みることができるもう一つのことは、それを使用した後に表面を破壊し、それが役立つかどうかを確認することです.

于 2012-10-20T09:57:12.973 に答える
0

Bitmap を扱う場合、ガベージ コレクターがしばらく失敗することがあります。ビットマップを使用していないときは、必ず Bitmap メモリを解放してください。

if(!mBitmap.isRecycled())
mBitmap.recycle();

ビットマップメモリ​​を解放する

于 2012-10-20T10:09:31.060 に答える