1

首先我调用 MediaStore.ACTION_IMAGE_CAPTURE 意图打开相机然后我从这个函数中获取保存的捕获图像路径。

private String getLastImageId(){
    String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
    String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
    if(imageCursor.moveToFirst()){
        int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
        String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        //imageCursor.close();
        return fullPath;
    }else{
        return "";
    }
}

然后我将该路径作为参数传递给产品对象属性。将该对象添加到产品列表中,该列表由自定义适配器显示。我在 listView 中显示产品标题和图像

在自定义适配器类中,我从它获取产品获取产品标题和路径从路径制作位图并将其分配给包含图像视图的产品持有者,对于第一张照片以这种方式工作很好,但在第二张照片上它给出了例外java.lang.outofmemory 我也尝试过给出的解决方案

java.lang.OutOfMemoryError:位图大小超出 VM 预算 - Android

在产品适配器中这样做

public class ProductAdopter extends ArrayAdapter<Product> {
Context context; 
int layoutResourceId;    
ArrayList<Product> data = null;
public ProductAdopter(Context context, int layoutResourceId, ArrayList<Product> product_data) {
    // TODO Auto-generated constructor stub
    super(context, layoutResourceId, product_data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = product_data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ProductHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((MainActivity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new ProductHolder();
        holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

        row.setTag(holder);
    }
    else
    {
        holder = (ProductHolder)row.getTag();
    }

    Product product = data.get(position);
    holder.txtTitle.setText(product.getName());
    File imgFile = new  File(product.icon);
    if(imgFile.exists()){

        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

        holder.imgIcon.setImageBitmap(myBitmap); 
        //myBitmap.recycle();
    }
    return row;
}
static class ProductHolder
{
    ImageView imgIcon;
    TextView txtTitle;
}
}
4

3 回答 3

5
 if(imgFile.exists()){

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;

   Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);
        holder.imgIcon.setImageBitmap(myBitmap); 
        //myBitmap.recycle();
    }

使用 inSampleSize 将比例位图加载到内存。对 inSampleSize 值使用 2 的幂对于解码器来说更快、更有效。但是,如果您计划将调整大小的版本缓存在内存或磁盘上,通常仍然值得将其解码为最合适的图像尺寸以节省空间。

有关更多信息,请参阅有效加载大型位图

于 2013-04-25T03:15:22.610 回答
0

如果您尝试自己解码大图像,您将遇到内存不足的问题。

尝试使用通用图像加载器。它将负责从本地存储或互联网加载所有图像。

https://github.com/nostra13/Android-Universal-Image-Loader

于 2013-04-25T03:08:13.393 回答
0

OutOfMemory 可能会很累,这里有一些您可以查看的选项

try { 
     //Create your bitmap here 

} catch (OutOfMemoryError ooM) {
        // You got out of memory now do something to recycle images
                    // Yes you can catch OOM.
        recycle();
}

如果您没有很多图像要处理,那么您可以试试这个。

    BitmapFactory.Options op = new BitmapFactory.Options();
    op.inSampleSize = 8;
    return BitmapFactory.decodeFile("<YOUR IMAGE FILE HERE>", op);

如果您有很多图像,上述组合可能会很有用

于 2013-04-25T04:43:02.310 回答