云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

腾讯云_抖音百度云_精选特惠

小七 141 0

对WhatsApp技术印象深刻?克隆WhatsApp技术构建文件上传Android应用

随着超过10亿人使用WhatsApp,该平台正在成为可靠和安全即时消息的首选。拥有如此多的用户意味着数据传输过程必须在所有平台上进行优化和可扩展。WhatsApp技术被吹捧为能够在从发送方到接收方的网络中实现显著的媒体质量保护,而这并非易事。在本文中,我们将构建一个WhatsApp的简单克隆,重点展示使用Cloudinary的androidsdk上传背景图像的过程。这个应用程序是使用Pusher来实现实时特性的。我们将分两个部分来完成这项工作,首先,我们将构建一个主要关注Cloudinary的文件上传和交付的应用程序。然后在第二部分中,我们将展示如何将Cloudinary的转换和优化特性应用于图像。为了继续这个项目,我们假设您对Android开发并不陌生,并且您已经为CompoundViews(本例中是ListView)使用过定制布局。如果还没有,请查看本教程。网络研讨会设置Android工作室项目按照下面的图片来设置你的Android项目。用于在本教程中,我们将使用许多第三方库,包括:Cloudinary Android SDK。推送Android SDK用于异步图像加载的毕加索用于生成异步HTTP请求的改造打开你的应用程序级别生成.gradle文件,添加以下行并同步您的项目:复制到剪贴板实施组:'com.cloudinary网站',名称:'cloudinary android',版本:'1.22.0'实施'通讯推进器:推送器java-客户端:1.5.0'实施'com.squareup.refinition2:转换器-gson:2.3.0版'实施'com.squareup.refinition2:改装:2.3.0'实施'毕加索网站:毕加索:2.5.2'在继续之前,请创建Cloudinary和Pusher帐户。您需要您的API凭据来启用应用程序和Cloudinary服务器之间的通信。打开AndroidManifest.xml归档并添加以下内容代码段:复制到剪贴板....{//从请求客户机收集数据//还要指定一个id和一个创建时间常量岗位=对象.分配({}, 需求主体, {id:uuid(),创建时间:new Date()});//使用`low创建文章`分贝.get('消息').推(柱).write();//回复创建的最后一篇帖子const newMessage=db.get('消息').last().value();推动器.触发器("消息"、"新消息"、"新消息");res.json文件(新消息);});//收听所选端口应用程序侦听(应用程序获取('port'),\u=>控制台.log('App at'+应用程序获取("端口");有了这个设置,我们就可以开始构建应用程序了。让我们从定制xml文件开始,以满足我们的需要。开放式活动_聊天室.xml文件并将其内容更改为存储库中的内容由于我们使用ListView显示聊天记录,因此需要创建一个自定义的ListView布局。因此,创建一个新的布局资源文件"message_xml",并修改其内容,以提供实现聊天所需的视图对象视图。下一个,添加两个向量资源。我们不会在这里讨论如何做到这一点。但是你可以查看官方的Android文档来了解如何做到这一点。现在,我们的XML文件可以继续使用了。接下来,我们必须开始添加应用程序逻辑应用逻辑为了实现应用程序所需的功能,我们将创建两个Java类Message和ListMessagesAdapter和一个名为ConstantsSo的接口创建一个名为Message的新Java类并将其内容修改为:Copy to clipboard公共类消息{公共字符串messageType,message,messageTime,user,image;}完成后,创建适配器类并修改其内容:复制到剪贴板公共类ListMessagesAdapter扩展了BaseAdapter{私人语境;私有列表消息;public ListMessagesAdapter(上下文上下文,列表消息){这个。上下文=上下文;这个。消息=消息;}@覆盖公共int getCount(){返回邮件大小();}@覆盖公共消息getItem(int位置){返回消息.get(位置);}@覆盖公共long getItemId(int位置){返回位置;}public void add(消息消息){消息.add(信息);notifyDataSetChanged();}@覆盖公共视图getView(int position,View convertView,ViewGroup parent){if(convertView==null){转换视图=LayoutFlater.from(上下文)。膨胀(右。消息布局\,父项,错误);}TextView消息内容=convertView.findViewById(右。id.message_内容);文本视图时间戳=convertView.findViewById(右。id.时间戳);ImageView imageSent=convertView.findViewById(右。id.image_已发送);视图布局视图=convertView.findViewById(右。id.view U布局);消息消息=消息.get(位置);如果(message.messageType.equals消息类型(常量.IMAGE)){图像发送.setVisibility(视图.可见);消息内容.setVisibility(视图。不见了);布局视图.setBackgroundColor(上下文.getResources().获取颜色(android.R。颜色.透明));时间戳.setTextColor(上下文.getResources().获取颜色(android.R。颜色。黑色));毕加索(上下文).负荷(消息.image).占位符(R。mipmap.ic_启动器).into(图像发送);}其他{图像发送.setVisibility(视图。不见了);消息内容.setVisibility(视图.可见);}时间戳.setText(消息.用户);消息内容.setText(消息.message);返回convertView;}}//正在更新ListView。public void add(消息消息){消息.add(信息);notifyDataSetChanged();}/**此方法向列表容器添加一个新项,随后通过调用"notifyDataSetChanged()"方法。**/最后,让我们为常量创建一个接口值:复制到剪贴板公共接口常量{字符串推动器_KEY="****************";推串器_CLUSTER_TYPE="us2";字符串消息"终结点="https://fast-temple-83483.herokuapp.com/";String IMAGE="IMAGE";String TEXT="TEXT";int IMAGE_CHOOSER_INTENT=10001;}接口文件包含我们稍后在其他类中引用的变量。将常量值放在同一个类中可以方便地访问它们。需要注意的一点是,您需要自己的PUSHERKEY(可以从Pusher上的profile仪表板获取)和MESSAGEEND_POINT(代表服务器链接)。下一步,打开主活动.java文件。将以下方法添加到onCreate()中方法:复制到剪贴板@覆盖受保护的void onCreate(Bundle savedInstanceState){...媒体管理器.init(这个)}Cloudinary Android SDK的入口点是MediaManager类。媒体管理器.init(这)使用前面元数据标记中指定的参数初始化项目。可以说,每个应用程序生命周期只能执行一次初始化。另一种无需修改AndroidManifest.xml文件将传递一个包含必要配置详细信息的HashMap作为媒体管理器.init()方法:复制到剪贴板Map config=new HashMap();配置输出("cloud_name","myCloudName");媒体管理器.init(此,配置);对于这个项目,我们将坚持前一种方法,因为我们已经修改了AndroidManifest.xml文件。配置推送程序库是时候配置我们的推送程序库了。将以下代码行添加到下面的onCreate()方法中。复制到剪贴板PusherOptions选项=新的PusherOptions();选项.setCluster(Constants.PUSHER_CLUSTER_类型);Pusher Pusher=新推进器(Constants.PUSHER_键,选项);信道信道=推送器订阅("消息");上面的片段是self解释性信息是您在服务器中创建的频道的名称。现在,我们需要订阅消息通道中的事件。因此,我们将订阅新的消息事件。复制到剪贴板通道.绑定("新消息",新订阅EventListener(){@覆盖public void onEvent(字符串channelName,字符串eventName,最终字符串数据){/..../}});推进器连接();现在,我们已经成功地标记到消息通道并订阅了新的消息事件。所以,每次我们向服务器发送一个HTTP请求时,它会将它重定向到Pusher,然后我们会在应用程序中得到这个"事件"的通知,然后我们可以在onEvent(…)方法中对它做出适当的反应。设置服务器通信