EChat(简易聊天项目)五、存储聊天记录中的图片

利用文件存储实现存储聊天记录中的图片

首先先需要使聊天界面可以发送图片,然后再对其进行存储操作

①修改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.xmlleft_msg.xml,同时增加right_img_item.xmlleft_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>

运行效果如图

            

  界面左下方有一个+”按钮       点击后选择跳转到相册         看到图片成功发送

     

    

    对应文件夹中发现存储成功                   点开确认是对应图片

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Spark的Echart数据分析与可视化功能项目是一个利用Spark技术进行大数据分析的项目,通过Echart技术进行数据可视化展示的项目。在这个项目,我们通过Spark技术处理大规模数据,进行数据清洗、转换、计算等操作,从而得出我们需要的数据分析结果。然后通过Echart技术将这些分析结果进行可视化展示,以便用户能够更直观地理解数据分析的结果。 这个项目有很多应用场景,比如在金融领域,我们可以通过这个项目进行大规模的交易数据分析,找出一些潜在的交易模式、异常情况等。在电商领域,我们可以通过这个项目进行用户行为数据分析,发现用户的购买行为、偏好等。在医疗领域,我们可以通过这个项目进行大规模的疾病数据分析,找出患病规律、病情趋势等。总之,这个项目可以帮助我们更好地理解大规模数据的特点和规律,为我们的决策提供更好的依据。 这个项目的优势在于,利用Spark技术能够快速处理大规模数据,并且Echart技术能够将数据分析结果以直观的可视化形式展示出来,帮助用户更好地理解数据分析结果。另外,这个项目还可以借助Spark的机器学习库进行一些高级的数据分析工作,为企业提供更多的数据分析服务。在未来,我们还可以进一步将这个项目与其他数据分析工具(如Tableau、Power BI等)进行整合,使得数据分析与可视化功能更加完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值