-1

ユーザーがSDカードまたはカメラで撮影した画像を追加する必要があるカスタムリストビューを作成しています。このために、1つの画像ビューと2つのボタンを取得します。画像ビューの画像..カスタムリストビューでその画像URIを渡すと、初めて画像が追加されますが、2回目はアプリケーションがクラッシュします....誰かが答えを知っている場合は、それを投稿してください. 前もって感謝します!!

これがコードです。これはボタンクリック用です..

camera.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
                        Environment.getExternalStorageDirectory(), "temp.jpg")));
                startActivityForResult(intent, 2);

            }
        });

        sdcard.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent i = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);

                startActivityForResult(i, 0);

            }
        });

        adapter = new SimpleAdapter(
                this,
                list12,
                R.layout.list_row_1,
                new String[] { "name", "address", "location", "image" },
                new int[] { R.id.name, R.id.address, R.id.location, R.id.image });

        setListAdapter(adapter);

この後..

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 2) {
            File picture = new File(Environment.getExternalStorageDirectory()
                    + "/temp.jpg");

            imgUri = Uri.fromFile(picture);
            targetImage.setImageURI(imgUri);
            location1 = "Camera";
        }

        else {
            if (resultCode == RESULT_OK) {
                targetUri = data.getData();
                textTargetUri.setText(targetUri.toString());
                try {
                    bitmap = BitmapFactory.decodeStream(getContentResolver()
                            .openInputStream(targetUri));

                    //decodeBitmap(bitmap, 4, 4);

                    targetImage.setImageBitmap(bitmap);
                    location1 = "Sd card";

                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

そして、リストビューに画像を追加します

private void populateList() {

    HashMap<String, Object> temp11 = new HashMap<String, Object>();
    name1 = textname.getText().toString();
    address1 = textaddress.getText().toString();


    if (name1.equals("") || address1.equals("")) {
        String str = "Don't Leave field blank !";
        Toast toast = Toast.makeText(LastPage.this,

        str, Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.show();
    }

    else if (location1 == "Sd card") {

        textname.setText("");
        textaddress.setText("");
        temp11.put("name", name1);
        temp11.put("address", address1);

        temp11.put("location", location1);

        temp11.put("image", targetUri);
        targetImage.setImageBitmap(null);
        list12.add(0, temp11);
        adapter.notifyDataSetChanged();
    } else if (location1 == "Camera") {

        textname.setText("");
        textaddress.setText("");
        temp11.put("name", name1);
        temp11.put("address", address1);
        temp11.put("location", location1);

        temp11.put("image", imgUri);
        targetImage.setImageBitmap(null);
        list12.add(0, temp11);
        adapter.notifyDataSetChanged();
    }

ログキャット

04-20 00:03:49.599: E/AndroidRuntime(4129): FATAL EXCEPTION: main
04-20 00:03:49.599: E/AndroidRuntime(4129): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.ImageView.resolveUri(ImageView.java:521)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.ImageView.setImageURI(ImageView.java:305)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.SimpleAdapter.setViewImage(SimpleAdapter.java:264)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:192)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.AbsListView.obtainView(AbsListView.java:1610)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1264)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.ListView.onMeasure(ListView.java:1175)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.View.measure(View.java:8313)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.RelativeLayout.measureChild(RelativeLayout.java:566)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.View.measure(View.java:8313)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.View.measure(View.java:8313)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.View.measure(View.java:8313)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.ViewRoot.performTraversals(ViewRoot.java:845)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1866)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.os.Looper.loop(Looper.java:130)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at android.app.ActivityThread.main(ActivityThread.java:3687)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at java.lang.reflect.Method.invoke(Method.java:507)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-20 00:03:49.599: E/AndroidRuntime(4129):     at dalvik.system.NativeStart.main(Native Method)
04-20 00:03:58.999: W/dalvikvm(4206): VFY: unable to resolve virtual method 2385: Lcom/korovyansk/android/sample/slideout/SampleActivity;.getActionBar ()Landroid/app/ActionBar;
4

2 に答える 2

2

このドキュメントを読みましたか?

特に、メモリの管理方法を確認する必要があります。ビットマップをロードする前に、たとえば、そのサイズを縮小するために使用する必要があるオプションを確認する必要があります。

この回答は、画像を読み込もうとする前に、画像を再スケーリングするために必要なコードに役立つ場合があります。

于 2013-04-19T18:47:22.697 に答える
1

カメラからのかなり大きな画像?その画像のサイズを小さくしてみてください (カメラ設定で解像度を下げます)。

アプリで使用できるメモリを超えているようです:

あなたが投稿したログから:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget

しかし、それ以外では、おそらくメモリリークが発生しています。これらのビットマップなどは破棄 (リサイクル) する必要があります。

@DigCamaraは、回答にいくつかの優れたリンクを投稿しました! 本当に、あなたの状況を読む必要があります。

于 2013-04-19T18:44:10.957 に答える