当前位置: 移动技术网 > IT编程>移动开发>Android > Android传递Bitmap对象在两个Activity之间

Android传递Bitmap对象在两个Activity之间

2019年07月24日  | 移动技术网IT编程  | 我要评论

关于文学的手抄报,地铁笨蛋5,校音器

通过内部存储方式实现了在两个activity之间传递bitmap对象以及其它支持串行化的java对象,关键点有如下:

1.  http客户端下载图片,通过imageview对象显示

2.  把imageview上的bitmap对象从当前activity传递到另外一个activity中并显示出来

3.  基于串行化传递java对象数据

首先看我是怎么实现http客户端下载图片,通过异步task接口实现http客户端下载图片并通过handler来更新imageview,代码如下:

package com.example.sharedemo; 
 
import java.io.ioexception; 
import java.io.inputstream; 
 
import org.apache.http.httpentity; 
import org.apache.http.httpresponse; 
import org.apache.http.httpstatus; 
import org.apache.http.client.clientprotocolexception; 
import org.apache.http.client.httpclient; 
import org.apache.http.client.methods.httpget; 
import org.apache.http.impl.client.defaulthttpclient; 
 
import android.graphics.bitmap; 
import android.graphics.bitmapfactory; 
import android.os.asynctask; 
import android.os.handler; 
import android.os.message; 
import android.util.log; 
 
public class imageloadtask extends asynctask<string, void, bitmap> { 
  private handler handler; 
 
  public imageloadtask(handler handler) { 
    this.handler = handler; 
  } 
 
  protected void onpostexecute(bitmap bitmap) { 
    message msg = new message(); 
    msg.obj = bitmap; 
    handler.sendmessage(msg); 
  } 
 
  @override 
  protected bitmap doinbackground(string... urls) { 
    bitmap bitmap = null; 
    // create http client 
    httpclient httpclient = new defaulthttpclient(); 
    try { 
      // get request 
      log.i("image-url", urls[0]); 
      httpget httprequest = new httpget(urls[0]); 
      httpresponse httpresponse = httpclient.execute(httprequest); 
      if (httpresponse.getstatusline().getstatuscode() == httpstatus.sc_ok) { 
        // get entity from response 
        httpentity httpentity = httpresponse.getentity(); 
        // read stream 
        inputstream is = httpentity.getcontent(); 
        bitmap = bitmapfactory.decodestream(is); 
        is.close(); 
        log.i("image", "already get the image by url : " + urls[0]); 
      } 
 
    } catch (clientprotocolexception e) { 
      e.printstacktrace(); 
    } catch (ioexception e) { 
      e.printstacktrace(); 
    } finally { 
      httpclient.getconnectionmanager().shutdown(); 
    } 
    return bitmap; 
  } 
 
} 

在当前的activity中通过按钮上的事件响应实现切换view到对应的activity中去,同时实现java串行化数据传递。mainactivity的代码如下:

package com.example.sharedemo; 
 
import java.io.bytearrayoutputstream; 
import java.io.fileoutputstream; 
 
import android.app.activity; 
import android.content.context; 
import android.content.intent; 
import android.graphics.bitmap; 
import android.graphics.matrix; 
import android.graphics.drawable.bitmapdrawable; 
import android.os.bundle; 
import android.os.handler; 
import android.os.message; 
import android.util.log; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.button; 
import android.widget.imageview; 
 
public class mainactivity extends activity implements onclicklistener{ 
  public final static string share_bitmap_command = "share-image"; 
  public final static string share_text_data_command = "share-text-data"; 
  private handler handler; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_main); 
    setuponclicklistener(); 
  } 
 
  private void setuponclicklistener() { 
    button bitmapbtn = (button)this.findviewbyid(r.id.bitmapsharebtn); 
    bitmapbtn.settag(share_bitmap_command); 
    bitmapbtn.setonclicklistener(this); 
    button textdatabtn = (button)this.findviewbyid(r.id.mapsharebtn); 
    textdatabtn.settag(share_text_data_command); 
    textdatabtn.setonclicklistener(this); 
    final imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); 
     
    handler = new handler() 
    { 
      public void handlemessage(message msg) { 
        bitmap bitmap = (bitmap)msg.obj; 
        if(bitmap != null) 
        { 
          /* 
          // 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始bitmap占用的内存 
          bitmap smallbitmap = zoombitmap(bitmap, bitmap.getwidth()/ 5, bitmap.getheight() / 5); 
          // 释放资源 
          bitmap.recycle(); 
          // 显示图片 
          imageview.setimagebitmap(smallbitmap); 
          imageview.invalidate(); 
          */ 
          imageview.setimagebitmap(bitmap); 
        } 
      } 
    }; 
    imageloadtask task = new imageloadtask(handler); 
    task.execute("http://img.blog.csdn.net/20150607143208238"); 
  } 
   
  public static bitmap zoombitmap(bitmap bitmap, int width, int height) { 
    int w = bitmap.getwidth(); 
    int h = bitmap.getheight(); 
    matrix matrix = new matrix(); 
    float scalewidth = ((float) width / w); 
    float scaleheight = ((float) height / h); 
    matrix.postscale(scalewidth, scaleheight); // 不改变原来图像大小 
    bitmap newbmp = bitmap.createbitmap(bitmap, 0, 0, w, h, matrix, true); 
    return newbmp; 
  } 
 
  @override 
  public void onclick(view v) { 
    object tag = v.gettag(); 
    log.i("command", tag.tostring()); 
    if(share_bitmap_command.equals(tag)) 
    { 
      intent intent = new intent(this.getapplicationcontext(), imageprocessactivity.class); 
      imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); 
      bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); 
      intent.putextra("selectedimage", bitmap); 
      intent.putextra("name", "lena"); 
      intent.putextra("description", "超级大美女"); 
      this.startactivity(intent);      
    } 
    else if(share_text_data_command.equals(tag)) 
    { 
      intent intent = new intent(this.getapplicationcontext(), imageprocessactivity.class); 
      imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); 
      bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); 
      // save it first then pass uri 
      imageinfobean dto = new imageinfobean(); 
      string uri = createimagefrombitmap(bitmap); 
      dto.setdescription("超级大美女"); 
      dto.setname("lena"); 
      dto.seturi(uri); 
       
      intent.putextra("tiger", dto); 
      this.startactivity(intent);  
    } 
  } 
   
  public string createimagefrombitmap(bitmap bitmap) { 
    string filename = "myimage"; 
    try { 
      bytearrayoutputstream bytes = new bytearrayoutputstream(); 
      bitmap.compress(bitmap.compressformat.jpeg, 100, bytes); 
      fileoutputstream fo = openfileoutput(filename, context.mode_private); 
      fo.write(bytes.tobytearray()); 
      fo.close(); 
    } catch (exception e) { 
      e.printstacktrace(); 
      filename = null; 
    } 
    log.i("filename", filename); 
    return filename; 
  } 
} 

对应另外一个activity中实现读取与组装bitmap对象显示的代码如下:

package com.example.sharedemo; 
 
import java.io.filenotfoundexception; 
 
import android.app.activity; 
import android.graphics.bitmap; 
import android.graphics.bitmapfactory; 
import android.os.bundle; 
import android.widget.imageview; 
import android.widget.textview; 
 
public class imageprocessactivity extends activity { 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.share_info); 
    backfilldata(); 
  } 
 
  private void backfilldata() { 
    object obj = this.getintent().getextras().get("tiger"); 
    imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); 
    textview text1 = (textview)this.findviewbyid(r.id.textview1); 
    textview text2 = (textview)this.findviewbyid(r.id.textview2); 
    try { 
      if(obj != null && obj instanceof imageinfobean) 
      { 
        imageinfobean dto = (imageinfobean)obj; 
        bitmap bitmap = bitmapfactory.decodestream(this.openfileinput(dto.geturi())); 
        imageview.setimagebitmap(bitmap); 
        imageview.invalidate(); // refresh 
         
        text1.settext("名称: " + dto.getname()); 
        text2.settext("描述: " + dto.getdescription()); 
        return; 
      } 
    } catch (filenotfoundexception e) { 
      e.printstacktrace(); 
    } 
     
    bitmap bitmap = (bitmap) this.getintent().getparcelableextra("selectedimage"); 
    string name = this.getintent().getextras().getstring("name"); 
    string description = this.getintent().getextras().getstring("description"); 
    if(bitmap != null) 
    { 
      imageview.setimagebitmap(bitmap); 
      imageview.invalidate(); // refresh 
    } 
    if(name != null) 
    { 
      text1.settext("名称: " + name); 
    } 
    if(description != null) 
    { 
      text2.settext("描述: " + description); 
    } 
  } 
 
} 

对应的java串行化对象类代码如下:

package com.example.sharedemo; 
 
import java.io.serializable; 
 
public class imageinfobean implements serializable { 
  /** 
   * 
   */ 
  private static final long serialversionuid = 1l; 
 
  public string getname() { 
    return name; 
  } 
 
  public void setname(string name) { 
    this.name = name; 
  } 
 
  public string getdescription() { 
    return description; 
  } 
 
  public void setdescription(string description) { 
    this.description = description; 
  } 
 
  public string geturi() { 
    return uri; 
  } 
 
  public void seturi(string uri) { 
    this.uri = uri; 
  } 
 
  private string name; 
  private string description; 
  private string uri; 
 
} 

最后声明:
别忘记在manifest文件添加网络访问的权限

<uses-permission android:name="android.permission.internet"/> 

第一个按钮【传递图片】将会演示我遇到错误,第二按钮【传递文本数据】
将会演示正确的处理结果,显示如下:

以上就是本文的全部内容,希望对大家的学习有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网