78

Activity1という名前の Bitmap 変数がbmpあり、ビットマップを Activity2 に送信したい

以下は、インテントで渡すために使用するコードです。

Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",bmp);
startActivity(in1);

そしてActivity2では、次のコードを使用してビットマップにアクセスしようとしています

Bundle ex = getIntent().getExtras();
Bitmap bmp2 = ex.getParceable("image");
ImageView result = (ImageView)findViewById(R.Id.imageView1);
result.setImageBitmap(bmp);

アプリケーションは例外なく実行されますが、期待される結果が得られません

4

7 に答える 7

217

インテントに追加して送信し、デコードする前に、バイト配列に変換します。

//Convert to byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",byteArray);

次に、アクティビティ2で。

byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

編集

これをベストプラクティスで更新する必要があると思いました。

最初のアクティビティでは、ビットマップをディスクに保存してから、次のアクティビティでロードする必要があります。最初のアクティビティでビットマップをリサイクルして、ガベージコレクション用にプライミングしてください。

アクティビティ1:

try {
    //Write file
    String filename = "bitmap.png";
    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);

    //Cleanup
    stream.close();
    bmp.recycle();

    //Pop intent
    Intent in1 = new Intent(this, Activity2.class);
    in1.putExtra("image", filename);
    startActivity(in1);
} catch (Exception e) {
    e.printStackTrace();
}

アクティビティ2で、ビットマップをロードします。

Bitmap bmp = null;
String filename = getIntent().getStringExtra("image");
try {
    FileInputStream is = this.openFileInput(filename);
    bmp = BitmapFactory.decodeStream(is);
    is.close();
} catch (Exception e) {
    e.printStackTrace();
}

乾杯!

于 2012-06-13T08:03:24.773 に答える
13

場合によっては、ビットマップが大きすぎてエンコードおよびデコードできない場合や、インテントでバイト配列として渡す場合があります。これにより、OOM または悪い UI エクスペリエンスが発生する可能性があります。

ビットマップを新しいアクティビティ (それを使用するもの) の静的変数に入れることを検討することをお勧めします。これは、不要になったときに慎重に null になります (onDestroy を意味しますが、「isChangingConfigurations」が false を返す場合のみ)。

于 2015-05-21T06:39:41.903 に答える
4

Bitmap オブジェクトを渡す代わりに、Bitmap の Uri のみを渡すことができます。Bitmap オブジェクトが大きい場合、メモリの問題が発生します。

最初のアクティビティ。

intent.putExtra("uri", Uri);

SecondActivity からビットマップを取得します。

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri));
于 2016-11-21T07:30:04.997 に答える
0

インテントを介してデータを渡すことなく、これを解決することもできます。画像をメモリに保存し、次のアクティビティでその場所から画像をロードするだけです。これにより、大きなビットマップ データを渡すことによるアプリのクラッシュも回避できます。注: ロケーション パスをインテントに渡す必要さえありません。パスを覚えておいて、それを使用してください。

于 2016-02-10T09:41:00.547 に答える
-7
Bundle b = new Bundle();
b.putSerializable("Image", Bitmap);
mIntent.putExtras(b);
startActivity(mIntent);
于 2012-06-13T08:03:51.893 に答える