【问题标题】:Android : Bitmap image is not passed to another java activityAndroid:位图图像未传递给另一个java活动
【发布时间】:2016-01-22 05:55:18
【问题描述】:

我开发了一个应用程序,它允许以下操作: 1. 从图库中加载图像并使用 ImageView 查看。 2. 将 ImageView 中的图像保存到图库中。 3. 弹出一个警告对话框,单击“是”时打开另一个布局。

我想将图像位图从第一个活动传递到第二个活动。我遵循了几个例子,但图像没有被传递。我的编码如下。

LoadImage.java:

public class LoadImage extends Activity {

private static final int SELECT_PICTURE = 1;

private String selectedImagePath;
private ImageView img;
Button buttonSave;
final Context context = this;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_load_image);

    img = (ImageView)findViewById(R.id.ImageView01);
    buttonSave = (Button) findViewById(R.id.button2);

    ((Button) findViewById(R.id.Button01))
            .setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
                }
            });
    buttonSave.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            img.setDrawingCacheEnabled(true);
            Bitmap bitmap = img.getDrawingCache();

            String root = Environment.getExternalStorageDirectory().toString();
            File newDir = new File(root + "/PARSE");
            newDir.mkdirs();
            Random gen = new Random();
            int n = 10000;
            n = gen.nextInt(n);
            String fotoname = "Photo-"+ n +".jpg";
            File file = new File (newDir, fotoname);
            if (file.exists ()) file.delete ();
            try {
                FileOutputStream out = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
                Toast.makeText(getApplicationContext(), "Saved to your folder", Toast.LENGTH_SHORT).show();

            } catch (Exception e) {

            }
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

            // set title
            alertDialogBuilder.setTitle("Review the Answer?");

            // set dialog message
            alertDialogBuilder
                    .setMessage("Click yes to submit answer!")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // if this button is clicked, close
                            // current activity
                            Intent intent = new Intent(LoadImage.this, TestImage.class);
                            ByteArrayOutputStream bs = new ByteArrayOutputStream();

                            intent.putExtra("byteArray", bs.toByteArray());

                            startActivity(intent);

                    }
        })
                    .setNegativeButton("No",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();
        }
    });

}



public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            img.setImageURI(selectedImageUri);
        }

    }
}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
}

TestImage.java:

public class TestImage extends Activity {


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_image);

    Intent intent = getIntent();


    ImageView img = (ImageView) findViewById(R.id.ImageView01);

    if(getIntent().hasExtra("byteArray")) {
        ImageView previewThumbnail = new ImageView(this);
        Bitmap bitmap = BitmapFactory.decodeByteArray(
                getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);
        previewThumbnail.setImageBitmap(bitmap);
    }

    Bundle extras = getIntent().getExtras();
    byte[] byteArray = extras.getByteArray("byteArray");

    Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    img.setImageBitmap(bmp);
}
}

“intent”是第二个活动是灰色的,说明变量“intent”从未使用过。

谁能帮我解决这个问题。任何帮助深表感谢。谢谢。

更新!!

LoadImage.java:

buttonSave.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            img.setDrawingCacheEnabled(true);
            final Bitmap bitmap = img.getDrawingCache();

            String root = Environment.getExternalStorageDirectory().toString();
            File newDir = new File(root + "/PARSE");
            newDir.mkdirs();
            Random gen = new Random();
            int n = 10000;
            n = gen.nextInt(n);
            String fotoname = "Photo-"+ n +".jpg";
            File file = new File (newDir, fotoname);
            if (file.exists ()) file.delete ();
            try {
                FileOutputStream out = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
                Toast.makeText(getApplicationContext(), "Saved to your folder", Toast.LENGTH_SHORT).show();

            } catch (Exception e) {

            }
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

            // set title
            alertDialogBuilder.setTitle("Review the Answer?");

            // set dialog message
            alertDialogBuilder
                    .setMessage("Click yes to submit answer!")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // if this button is clicked, close
                            // current activity
                            Intent intent = new Intent(LoadImage.this, TestImage.class);
                            ByteArrayOutputStream stream = new ByteArrayOutputStream();
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                            byte[] bytes = stream.toByteArray();
                            intent.putExtra("bitmapbytes",bytes);

                            startActivity(intent);

                    }
        })
                    .setNegativeButton("No",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();
        }
    });

}

TestImage.java:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_image);

    byte[] bytes = getIntent().getData().getByteArrayExtra("bitmapbytes");
    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    ImageView img = (ImageView) findViewById(R.id.ImageView01);


    img.setImageBitmap(bmp);
}
}

【问题讨论】:

  • 请看下面我的回答。

标签: android android-intent bitmap


【解决方案1】:

活动

在 Activity 之间传递位图

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

在 Activity 类中

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

片段

在片段之间传递位图

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

在 SecondFragment 内接收

Bitmap bitmap = getArguments().getParcelable("bitmap");

传输大位图(压缩位图)

如果您遇到失败的活页夹事务,这意味着您通过将大元素从一个活动转移到另一个活动而超出了活页夹事务缓冲区。

所以在这种情况下,您必须将位图压缩为一个字节的数组,然后在另一个活动中解压缩它,就像这样

在第一个活动中

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

而在SecondActivity中

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

【讨论】:

  • 我使用了活动编码,在第二个活动中,“意图”是灰色的,表示“从未使用过意图”,“位图”也是灰色的,表示“正在投射”intent.getParcelableExtra("bitmap ") 到 Bitmap 是多余的。 @4k3R
  • 这意味着,您不必将其转换为位图。因此,您可以从 getIntent().getParcelableExtra("bitmap") 中删除 (Bitmap)。我已经更新了答案
  • 灰色表示,Android Studio 告诉您您没有在其他任何地方使用位图。这不是问题。只是一条消息。
  • 好的,但图像没有传递到第二个布局。日志猫:
  • noteapp E/JavaBinder﹕!!! Binder 交易失败!!! noteapp E/ViewRootImpl﹕sendUserActionEvent() mView == null E/JavaBinder﹕!!! Binder 交易失败!!! noteapp E/ViewRootImpl﹕sendUserActionEvent() mView == null
【解决方案2】:

Bitmap 实现 Parcelable,因此您可以随时在 Intent 中传递它:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

并在另一端检索它:

Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

【讨论】:

  • 按照您的建议更改编码:Intent intent = getIntent();位图 bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); ImageView img = (ImageView) findViewById(R.id.ImageView01); img.setImageBitmap(位图);
  • 现在“位图”为灰色,消息“将 'intent.getParcelableExtra("BitmapImage") 转换为位图是多余的。 @Suhas B
【解决方案3】:

是的,您可以通过 Intent 发送 Bitmap

Intent 意图 =new Intent(Context ,YourActivity.class); intent.putExtra("key",bitmap);

在 YourActivity.class 中接收位图

意图意图=getIntent(); 位图 image=intent.getParcelableExtra("key");

这适用于小尺寸位图

当 Bitmap 的大小很大时,它将无法通过 Intent 发送。因为 Intent 是指以键值对的形式发送一小组数据。

为此你可以通过Intent发送Bitmap的Uri

  Intent intent =new Intent(Context ,YourActivity.class);
  Uri uri;// Create the Uri From File Or From String.
  intent.putExtra("key",uri);

在 YourActivity.class 中

   Intent intent=getIntent();
   Uri uri=intent.getParcelableExtra("key");

从 Uri 创建位图。

希望对你有所帮助。

【讨论】:

    【解决方案4】:

    也许您的位图太大。您会在 logcat 中找到 FAILED BINDER TRANSACTION。所以看看FAILED BINDER TRANSACTION while passing Bitmap from one activity to another

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2016-06-21
      • 2023-03-23
      • 2016-01-15
      • 2019-12-29
      相关资源
      最近更新 更多