android - 在android中使用位图的问题

标签 android bitmap

我有以下问题:

First activity

Android 相机打开,用户可以拍照。拍照后,第二个 Activity 启动。

Second activity

在此 Activity 中,用户可以查看照片。 为此,我从第一个 Activity 中收到了这样的图片:

Bundle extras = getIntent().getExtras();

然后我创建了以下位图:

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        options.inDither = true; 
        byte[] imageData = extras.getByteArray("imageData");
        myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);

        Matrix mat = new Matrix();
        mat.postRotate(90);
        bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(),
                myImage.getHeight(), mat, true);
        //...operations on the bitmapResult

结果位图存储在 sdcard 中,在离开此 Activity 之前,我回收了我的位图以避免内存问题:

bitmapResult.recycle();
bitmapResult=null;

完成所有这些后,我们继续进行 Activity 3。

Third activity

在此 Activity 中,用户可以看到不同尺寸的图片。图片取自sdcard

最大的问题是,当用户点击后退按钮时,从 Activity three 转到 Activity two,但我的应用程序崩溃了,因为正在尝试执行 对回收后的位图进行操作。

如果我不在第二个 Activity 中回收位图,当我在我的应用程序中上下移动几次时,我会得到 OutOfMemeory Exception

有什么想法吗?

最佳答案

当您的用户在Activity 2 不要直接进入Activity 3(图库) . 首先,完成Activity 2,返回一个结果给Activity 1。然后开始 Activity 3

您的第一个/主要 Activity :

public class TakeAPicture extends Activity {

    public static final int REQUEST_PICTURE_WAS_TAKEN = 100;
    public static final int REQUEST_SHOW_GALLERY = 101;
    public static final int RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY = 102;
    public static final int RESULT_BACK_FROM_GALLERY = 103;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.takeapicture);

        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),
                        PictureTaken.class);
                startActivityForResult(i, REQUEST_PICTURE_WAS_TAKEN);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case REQUEST_PICTURE_WAS_TAKEN:
            if (resultCode == RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY) {
                Intent i = new Intent(getApplicationContext(), Gallery.class);
                startActivityForResult(i, REQUEST_SHOW_GALLERY);
            }
            break;
        default:
            break;
        }
    }
}

在你的第二个 Activity 中你必须做这样的事情:

public class PictureTaken extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picturetaken);

        Button btn = (Button) findViewById(R.id.button2);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                PictureTaken.this
                        .setResult(TakeAPicture.RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY);
                PictureTaken.this.finish();
            }
        });
    }
}

问候

关于android - 在android中使用位图的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7270364/

相关文章:

c - 从 Windows 剪贴板获取 32 位 RGBA 图像

android - 单击重试按钮时出现异步错误 "Current thread must have a looper"

android - 从Gradle脚本调用命令行工具

android - 如何通过代码模拟点击最近的应用?

android - 当 Canvas 设置为位图时,Android.Graphics.Camera 在哪里设置其 X、Y 和 Z 轴?

android - URI 和位图图像之间的区别

android - 使用 libgdx 绘制大背景图像 - 最佳实践?

java - PayPal Cordova 插件不适用于电子邮件地址

android - 检查透明度是否存在并仅加载 RGB 值

android - 将简单的大 View 保存为位图