2

以下のコードで2つの問題があります。カメラアンドロイドのインテントを使用して「onclick」で写真を撮るだけで、ImageViewに画像が表示されます。

  1. アクティビティを終了せずに 2 枚または 3 枚の写真を撮った後、ディスプレイを回転させているときに outOfMemory エラーでクラッシュすることがよくあります。
  2. 初めて写真を撮るときはイメージビューが更新されますが、2回目または3回目は...画面を回転するまで画像が更新されません
  3. 外部ストレージではなく内部ストレージに画像を保存したいのですが、いくつかのチュートリアルを試したところ、カメラがスタックしてしまうため、その方法がわかりません!

    public class HandScryActivity extends Activity {

    private static int TAKE_PICTURE = 1;
    private MtgMatch myMatch;
    private File handFile;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handscry);  
        // Disable screen saver
        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
        // Load match 
        myMatch = MtgMatch.getSingletonMtgMatch();
        handFile = new File(Environment.getExternalStorageDirectory(), "test.jpg");
        if (myMatch.getHandUri() != null) { loadPicture(); }        
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        loadPicture();
    }
    
    // Handles onGame clicked buttons
    public void btnHandClick(View v) {
            Button clickedButton = (Button) v;
        // according to clicked button
        switch (clickedButton.getId()) {
            case R.id.btnBackToGame:
                this.finish();
                break;
            case R.id.btnTakePicture:              
                myMatch.setHandUri(Uri.fromFile(handFile));
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                
                intent.putExtra(MediaStore.EXTRA_OUTPUT, myMatch.getHandUri());
                startActivityForResult(intent, TAKE_PICTURE);
                break;              
            default:
                break;
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {                     
            if (requestCode == TAKE_PICTURE) {
                // Display image
                if (resultCode == RESULT_OK) {
                    loadPicture();
            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the image capture
            } else {
                // Image capture failed, advise user
            }
        }
    }
    
    // Put the photo inside frame
    private void loadPicture() {
            ImageView img = (ImageView) findViewById(R.id.imgHand);
            img.setImageURI(myMatch.getHandUri());
    }
    
    }
    
4

3 に答える 3

3

メモリ リークがあります。画面を回転させるとメモリが枯渇するのは、画面の回転によってアクティビティが自動的に破棄され、再構築されるためです。これは、onPause および onStart メソッドをオーバーライドしてデバッグ ステートメントを配置することで証明できます。その後、画面を回転させると、それらが呼び出されることがわかります。Android アクティビティのライフサイクルを理解する必要があります。

これらの画像への参照をメモリに保持しているため、メモリリークが発生します。メモリ使用量を追跡する必要があります。画面を傾けると、古いアクティビティがメモリに残り、新しいアクティビティが作成されます。ガベージ コレクターが不要なオブジェクトを収集するには、コード内にそれらへの参照が残っていないことを確認する必要があります。アプリケーションのメモリ使用量をグラフ化するツールがあり、メモリ リークの場所を特定できます。

このページの指示に従って、MAT にメモリ リークの場所を知らせてもらいます。

Androidのメモリアナライザーツール?

于 2012-04-15T16:11:07.127 に答える
0

これを試して、

画像ビューに画像を設定する前に、onActivityResult から取得したビットマップをデコードします。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap = BitmapFactory.decodeStream(is, null, options);

画像ビューで設定をデコードした後。

于 2015-09-24T11:25:37.180 に答える
0

発生している高いメモリ使用量を修正するには、カメラが返すファイルを取得してビットマップにロードし、ビットマップ ファクトリ オプションを使用して、サンプル サイズを使用するオプションを設定することをお勧めします。(これにより画像が縮小されますが、640x480 の画面に表示される 2560x1900 の画像は必要ない可能性が高いです) このチュートリアルを確認してください: http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception -when-decoding.html

于 2012-11-13T15:04:10.070 に答える