利用文件存储实现存储聊天记录中的图片
首先先需要使聊天界面可以发送图片,然后再对其进行存储操作
①修改Msg类,增加了imgpath,即图片路径
public class Msg {
public static final int TYPE_RECEIVED = 0;
public static final int TYPE_SENT = 1;
public static final int TYPE_RECEIVED_IMG = 2;
public static final int TYPE_SENT_IMG = 3;
private String content;
private String imgpath;
private int type;
public Msg(String content,String imgpath, int type){
this.content = content;
this.imgpath = imgpath;
this.type = type;
}
public String getContent(){
return content;
}
public int getType(){
return type;
}
public String getImgpath() {
return imgpath;
}
}
②对MsgAdapter进行了大部分修改,添加了图片有关部分,以及图片的存储到本地,以及将消息的各部分分开处理,原先只有收发两类,现修改成了switch语句判断,有文字消息的收发和图片消息的收发,同时也更加便于之后的拓展
public class MsgAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<Msg> mMsgList;
static class R_MsgViewHolder extends RecyclerView.ViewHolder{
LinearLayout rightLayout;
TextView rightMsg;
public R_MsgViewHolder(View view){
super(view);
rightLayout = (LinearLayout)view.findViewById(R.id.right_layout);
rightMsg = (TextView)view.findViewById(R.id.right_msg);
}
}
static class L_MsgViewHolder extends RecyclerView.ViewHolder{
LinearLayout leftLayout;
TextView leftMsg;
public L_MsgViewHolder(View view){
super(view);
leftLayout = (LinearLayout)view.findViewById(R.id.left_layout);
leftMsg = (TextView)view.findViewById(R.id.left_msg);
}
}
static class R_ImgViewHolder extends RecyclerView.ViewHolder{
LinearLayout rightlayout_img;
ImageView rightImage;
public R_ImgViewHolder(View view){
super(view);
rightlayout_img = (LinearLayout)view.findViewById(R.id.right_layout_img);
rightImage = (ImageView)view.findViewById(R.id.right_image);
}
}
static class L_ImgViewHolder extends RecyclerView.ViewHolder{
LinearLayout leftlayout_img;
ImageView leftImage;
public L_ImgViewHolder(View view){
super(view);
leftlayout_img = (LinearLayout)view.findViewById(R.id.left_layout_img);
leftImage = (ImageView)view.findViewById(R.id.left_image);
}
}
public MsgAdapter(List<Msg> msgList){
mMsgList = msgList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder holder = null;
switch (viewType){
case Msg.TYPE_RECEIVED:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.left_msg_item, parent, false);
holder = new L_MsgViewHolder(view);
break;
case Msg.TYPE_RECEIVED_IMG:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.left_img_item,parent,false);
holder = new L_ImgViewHolder(view);
break;
case Msg.TYPE_SENT:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.right_msg_item,parent,false);
holder = new R_MsgViewHolder(view);
break;
case Msg.TYPE_SENT_IMG:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.right_img_item,parent,false);
holder = new R_ImgViewHolder(view);
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Msg msg = mMsgList.get(position);
int itemViewType = getItemViewType(position);
switch (itemViewType){
case Msg.TYPE_RECEIVED:
L_MsgLayout((L_MsgViewHolder) holder, msg, position);
break;
case Msg.TYPE_RECEIVED_IMG:
L_ImgLayout((L_ImgViewHolder) holder, msg,position);
break;
case Msg.TYPE_SENT:
R_MsgLayout((R_MsgViewHolder) holder, msg, position);
break;
case Msg.TYPE_SENT_IMG:
R_ImgLayout((R_ImgViewHolder) holder, msg, position);
break;
}
/*
if(msg.getType() == Msg.TYPE_RECEIVED){
//如果是收到的消息,则显示左边的消息布局,将右边的消息布局隐藏
holder.leftLayout.setVisibility(View.VISIBLE);
holder.rightLayout.setVisibility(View.GONE);
holder.leftMsg.setText(msg.getContent());
}else if (msg.getType() == Msg.TYPE_SENT){
//如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏
holder.rightLayout.setVisibility(View.VISIBLE);
holder.leftLayout.setVisibility(View.GONE);
holder.rightMsg.setText(msg.getContent());
}
*/
}
private void R_ImgLayout(final R_ImgViewHolder holder, final Msg msg,final int position) {
holder.rightlayout_img.setVisibility(View.VISIBLE);
Bitmap bm = BitmapFactory.decodeFile(msg.getImgpath());
holder.rightImage.setImageBitmap(bm);
saveBitmap(bm,"MyPictrue");
}
private void R_MsgLayout(final R_MsgViewHolder holder, final Msg msg, final int position) {
holder.rightLayout.setVisibility(View.VISIBLE);
holder.rightMsg.setText(msg.getContent());
}
private void L_ImgLayout(final L_ImgViewHolder holder, final Msg msg,final int position) {
holder.leftlayout_img.setVisibility(View.VISIBLE);
Bitmap bm = BitmapFactory.decodeFile(msg.getImgpath());
holder.leftImage.setImageBitmap(bm);
saveBitmap(bm,"YourPictrue");
}
private void L_MsgLayout(final L_MsgViewHolder holder, final Msg msg, final int position) {
holder.leftLayout.setVisibility(View.VISIBLE);
holder.leftMsg.setText(msg.getContent());
}
public int getItemViewType(int position) {
return mMsgList.get(position).getType();
}
@Override
public int getItemCount() {
return mMsgList.size();
}
/** 保存方法 */
public void saveBitmap(Bitmap bm,String picName) {
File f = new File("/sdcard/data/", picName);
if (f.exists()) {
f.delete();
}
try {
FileOutputStream out = new FileOutputStream(f);
bm.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
③同样聊天界面MessageActivity要进行修改,增加选择相册图片发送部分以及对应处理
/*
选择好友后进入的聊天界面
*/
public class MessageActivity extends AppCompatActivity {
private List<Msg> msgList = new ArrayList<>();
private EditText inputText;
private Button send;
private Button more;
private ImageView imageView;
//调用系统相册-选择图片
private static final int IMAGE = 1;
private RecyclerView msgRecyclerView;
private MsgAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将正在创建的活动添加到活动管理器中
ActivityCollector.addActivity(this);
setContentView(R.layout.message__layout);
initMsg();//初始化消息数据
inputText = (EditText) findViewById(R.id.input_text);
send = (Button) findViewById(R.id.send);
msgRecyclerView = (RecyclerView) findViewById(R.id.msg_recycle_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
msgRecyclerView.setLayoutManager(layoutManager);
adapter = new MsgAdapter(msgList);
msgRecyclerView.setAdapter(adapter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = inputText.getText().toString();
if (!"".equals(content)){
Msg msg = new Msg(content,null,Msg.TYPE_SENT);
msgList.add(msg);
adapter.notifyItemInserted(msgList.size() - 1);//当有新消息时,刷新RecyclerView中的显示
msgRecyclerView.scrollToPosition(msgList.size() - 1);//将RecyclerView定位到最后一行
inputText.setText("");//清空输入框中的内容
}
}
});
more = (Button)findViewById(R.id.more);
more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用相册
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, IMAGE);
}
});
}
private void initMsg() {
Msg msg1 = new Msg("Hello guy.",null, Msg.TYPE_RECEIVED);
msgList.add(msg1);
Msg msg2 = new Msg("Hello.Who is that?",null, Msg.TYPE_SENT);
msgList.add(msg2);
Msg msg3 = new Msg("This is Tom. Nice talking to you.",null,Msg.TYPE_RECEIVED);
msgList.add(msg3);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//获取图片路径
if (requestCode == IMAGE && resultCode == Activity.RESULT_OK && data != null) {
Uri selectedImage = data.getData();
String[] filePathColumns = {MediaStore.Images.Media.DATA};
Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
String imagePath = c.getString(columnIndex);
//showImage(imagePath);
Msg msg = new Msg(null,imagePath,Msg.TYPE_SENT_IMG);
msgList.add(msg);
adapter.notifyItemInserted(msgList.size() - 1);//当有新消息时,刷新RecyclerView中的显示
msgRecyclerView.scrollToPosition(msgList.size() - 1);//将RecyclerView定位到最后一行
c.close();
}
}
...
}
④message_layout.xml发送栏下方增加一个按钮,点击即打开相册选择图片
<Button
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/more"/>
⑤原先的msg_item.xml分成right_msg.xml和left_msg.xml,同时增加right_img_item.xml和left_img_item.xml
给出两例,其余同理此处省略
1. left_img_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<LinearLayout
android:id="@+id/left_layout_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:background="@drawable/message_left">
<ImageView
android:id="@+id/left_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
2. left_msg_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:background="@drawable/message_left">
<TextView
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:textColor="#fff"/>
</LinearLayout>
</LinearLayout>
运行效果如图
界面左下方有一个“+”按钮 点击后选择跳转到相册 看到图片成功发送
对应文件夹中发现存储成功 点开确认是对应图片