0

この質問が何度も聞かれることは知っていますが、答えはどれも本当に役に立ちませんでした。ギャラリーから画像を選択し、そのビュー全体をビットマップに変換しようとしています(スナップショットを撮ります)。ほとんどの場合は正常に動作しますが、時々ランタイムエラーが表示され、アプリがクラッシュします。たまに表示される理由がわかりませんでした。

以下は、ビューをビットマップに変換するための私の Java スニペットであり、onCreate() 内にあります。

save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(TAG, "Saving...");
                // bitmap

                ContentValues cv = new ContentValues();
                TextView name = (TextView) findViewById(R.id.name);
                cv.put("victimname", name.getText().toString());

                TextView gender = (TextView) findViewById(R.id.gender);
                if (gender.getText().equals("MALE")) {
                    cv.put("gender", 1);
                } else {
                    cv.put("gender", 0);

                }

                Button save = (Button) findViewById(R.id.save);
                save.setVisibility(View.INVISIBLE);
                ImageView bckground = (ImageView) findViewById(R.id.imageView1);
                bckground.setImageResource(R.drawable.photocropscreenclearout);

                View content = findViewById(R.id.rootView);
                content.setDrawingCacheEnabled(true);
                Bitmap bitmap = content.getDrawingCache();
                // actual width of the image (img is a Bitmap object)
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();

                // new width / height
                int newWidth = width / 2;
                int newHeight = height / 2;

                // calculate the scale
                float scaleWidth = (float) newWidth / width;
                float scaleHeight = (float) newHeight / height;

                // create a matrix for the manipulation
                Matrix matrix = new Matrix();

                // resize the bit map
                matrix.postScale(scaleWidth, scaleHeight);

                // recreate the new Bitmap and set it back
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                        matrix, true);

                Bitmap mb = bitmap.copy(Bitmap.Config.ARGB_8888, true);
                Canvas c = new Canvas(mb);

                // get the int for the colour which needs to be removed
                Paint p = new Paint();
                p.setARGB(255, 255, 255, 255); // ARGB for the color, in this
                                                // case red
                int removeColor = p.getColor(); // store this color's int for
                                                // later use
                p.setAlpha(0);

                p.setXfermode(new AvoidXfermode(removeColor, 30,
                        AvoidXfermode.Mode.TARGET));

                // draw transparent on the "brown" pixels
                c.drawPaint(p);


                ByteArrayOutputStream out = new ByteArrayOutputStream();
                // bitmap.compress(Bitmap.CompressFormat.PNG, 100,out);
                mb.compress(Bitmap.CompressFormat.PNG, 60, out);


                cv.put("imageData", out.toByteArray());
                DailiesCursor mySQLiteAdapter = new DailiesCursor(
                        getApplicationContext());
                mySQLiteAdapter.openDataBase();
                mySQLiteAdapter.insert("maindata", null, cv);

                Cursor contentRead = mySQLiteAdapter.getLast();
                startManagingCursor(contentRead);
                contentRead.moveToFirst();

                int id = 0;
                while (contentRead.isAfterLast() == false) {
                    id = contentRead.getInt(0);
                    contentRead.moveToNext();
                }
                contentRead.close();
                mySQLiteAdapter.close();

                Log.i(TAG, "Start Game!");
                // SELECT last_insert_rowid();
                content.setDrawingCacheEnabled(false);
                final Intent myIntent = new Intent(getApplicationContext(),
                        MainGame.class);
                myIntent.putExtra("_id", Integer.toString(id));
                startActivity(myIntent);
                finish();

            }

        });

編集 1: 以下は xml ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" 
        android:id="@+id/rootView">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:scaleType="fitXY"
        android:layout_weight="1"
        android:src="@drawable/photocropscreen" />

    <Button
        android:id="@+id/back"
       android:layout_width="100dp"
        android:layout_height="90dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"

        android:background="@null"
        android:text="BACK"
        android:textColor="#ffffff"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Button
        android:id="@+id/save"
        android:layout_width="100dp"
        android:layout_height="90dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"

          android:background="@null"
        android:text="SAVE"
          android:textColor="#ffffff"
        android:textAppearance="?android:attr/textAppearanceMedium" />


    <Button
        android:id="@+id/name"
       android:layout_width="100dp"
        android:layout_height="90dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"

        android:layout_marginBottom="50dp"
        android:text="NAME"
          android:textColor="#ffffff"
        android:background="@null"
        android:textAppearance="?android:attr/textAppearanceMedium" />


    <Button
        android:id="@+id/gender"
        android:layout_width="100dp"
        android:layout_height="90dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"

        android:layout_marginBottom="50dp"
        android:text="MALE"
          android:textColor="#ffffff"
        android:background="@null"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    </RelativeLayout>
4

0 に答える 0