@Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {        
      super.onActivityResult(requestCode, resultCode, data);
      ContentResolver resolver = getContentResolver();
        /** 
         * 因为两种方式都用到了startActivityForResult方法, 
         * 这个方法执行完后都会执行onActivityResult方法, 所以为了区别到底选择了那个方式获取图片要进行判断, 
         * 这里的requestCode跟startActivityForResult里面第二个参数对应 
         */ 

      if (requestCode == 0) {//调用系统相册
          try {
              Uri originalUri = data.getData();//取数据
              mContent = readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));// 将图片内容解析成字节数组  
              myBitmap = getPicFromByTes(mContent, null);// 将字节数组转换为ImageView可调用的Bitmap对象
              myBitmap = Bitmap.createScaledBitmap(myBitmap, 120, 110, true);//强制图片大小
              contactAvatar.setImageBitmap(myBitmap);//绑定
              // originalUri=getContentResolver().insert(TB_CONTACT, values);
          } catch (Exception e) {
              System.out.print(e.getMessage());
          }
      } else if (requestCode == REQUEST_CAMERA) {//调用系统相机
          
          try {
              Log.v("AddContactActivity", "REQUEST_CAMERA=");
              super.onActivityResult(requestCode, resultCode, data);
              Bundle extras = data.getExtras();
              myBitmap = (Bitmap) extras.get("data");
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              myBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
              myBitmap = Bitmap.createScaledBitmap(myBitmap, 120, 110, true);
              Log.v("AddContactActivity", "REQUEST_CAMERl=");
              mContent = baos.toByteArray();
             
          } catch (Exception e) {
              e.printStackTrace();
          }
          
          contactAvatar.setImageBitmap(myBitmap);
          
      }  }
//相机调用的方法getPicFromByTes,将字节数组转换为ImageView可调用的Bitmap对象  
  private Bitmap getPicFromByTes(byte[] bytes, BitmapFactory.Options opts) {
  if (bytes != null)
      if (opts != null)
          
          return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
          
      else
          return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
      
  return null;}//相机调用readStream,将图片内容解析成字节数组 
private byte[] readStream(InputStream openInputStream) throws Exception {
  byte[] buffer = new byte[1024];
  int len = -1;
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  while ((len = openInputStream.read(buffer)) != -1) {
      outStream.write(buffer, 0, len);
  }
  byte[] data = outStream.toByteArray();
  outStream.close();
  openInputStream.close();
  return data;  // TODO Auto-generated method stub}我现在的问题是 如何把大图压缩很小  因为现在大图出现了溢出。一张图片插到数据库后  显示出来有1M这么大 两个方法中getPicFromByTes,readStream在那里处理图片压缩  越小越好。

解决方案 »

  1.   

    private Bitmap getPicFromByTes(byte[] bytes, BitmapFactory.Options opts);方法里面的opts你不要传null啊,你可以看看Options针对bitmap所做的操作,你要做的就是将大图片的内存压缩下。如果图片太大了,肯定会出现bitmap 的out of memery。
      

  2.   

    虽然传的空值  但是我可以在这个方法里做一个操作 
    opts.inSampleSize = 4;
    但还有个方法
      if(myBitmap !=null && ! myBitmap.isRecycled()){
          myBitmap.recycle();//回收
          myBitmap=null;    
      }   
        System.gc(); 
    但这句话加上后  没什么效果的
      

  3.   


    肯定是没效果,
    if(myBitmap !=null && ! myBitmap.isRecycled()){
      myBitmap.recycle();//回收
      myBitmap=null;   
      }   
    这段代码,是你用过了这个bitmap之后,将它回收了。你的问题是,用这个bitmap时,出现的内存溢出。你用了opts.inSampleSize = 4;之后,应该不会出现内存溢出了吧。 像我们做应用的,服务端的图片一般都会很小,即使图片很大,服务端都会做相应的压缩处理的,尽量让图片变小,没有那个公司会做很大的图片提供客户端用的。
      

  4.   

    处理完所有操作之后,回首位图对象。
     myBitmap.recycle();
      myBitmap=null;   
      

  5.   

    操作完Bitmap后使用recycle()回收下..最好调用System.gc()(但是太频繁使用gc()会卡~) 通知回收器回收下..其实recycle 和 gc 不一定会让垃圾回收器质性.只是起到一个提供的作用..这里告诉楼主个小东西我也刚弄明白..listview 中使用 bitmap滑动的时候会不停的执行 adapter的getView 方法 所以bitmap如果在getView中创建比较容易内存溢出 这时候用HashMap<int position,Bitmap bitmap>做个缓存就好了..