- 浏览: 276109 次
- 性别:
- 来自: 成都
博客专栏
-
Android腾讯微博客户...
浏览量:95832
文章分类
最新评论
-
依旧如风:
u012209919 写道一按“添加用户”就出错了,
Android腾讯微薄客户端开发十五:终结篇(分享源代码) -
bn922:
wxw1111wang 写道楼主黑屏怎么解决啊?急求你看看是不 ...
利用ffmpeg和SDL实现一个跨android版本的音视频播放器 -
wxw1111wang:
楼主黑屏怎么解决啊?急求
利用ffmpeg和SDL实现一个跨android版本的音视频播放器 -
lwbao28:
为什么下载下来解压后没有后缀名,都不知道怎么打开。
利用ffmpeg和SDL实现一个跨android版本的音视频播放器 -
璇儿0227:
为什么打开后页面显示不出来,而且没法添加账户?代码也没有显示错 ...
Android腾讯微薄客户端开发十五:终结篇(分享源代码)
凌晨发帖不容易啊, 有一个问题,谁做过android的自定义表情啊?貌似还没有发现有客户端有,都是图片,如果能像在电脑上那样自定义表情的功能多好,那位大哥知道,麻烦告知一声,呵呵。写完,睡觉。
我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.
写个工具类来测试已测试正则表达式来匹配表情。
在上方输入框中可以输入查询 格式为 @你选择的列表值
这个是话题输入界面,格式为#话题#
表情选择页面,这个其实是一个每行5列的GridView
此界面可看到你写的微博的内容,点击发送,发送成功
哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。
接下来,上代码。
add_weibo.xml:
表情解析先关 :下图是drawable文件下的表情文件
这个链接是专门用来发送带图片的微博的http://open.t.qq.com/api/t/add_pic?format=json&content=test&clientip=127.0.0.1&jing=&wei=
你好,下午在工作不方便回复,qq保密哈,有什么问题可在这留言,如果我知道,会回复你的。谢谢你的关注和支持,接下来有好东西我会继续分享给大家的
我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.
写个工具类来测试已测试正则表达式来匹配表情。
在上方输入框中可以输入查询 格式为 @你选择的列表值
这个是话题输入界面,格式为#话题#
表情选择页面,这个其实是一个每行5列的GridView
此界面可看到你写的微博的内容,点击发送,发送成功
哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。
接下来,上代码。
public class AddWeiboActivity extends Activity implements OnClickListener{ private DataHelper dataHelper; private UserInfo user; private String user_default_name; private MyWeiboSync weibo; private ListView listView; private EditText weibo_content; private Button send_btn; private Button add_cmamera_btn; private Button add_at_btn; private Button add_topic_btn; private Button add_expression_btn; private Button add_location_btn; private GridView expressionGrid; private List<Map<String,Object>> expressionList; private ExpressionAdapter expressionAdapter; private FrameLayout operation_layout; private RelativeLayout add_top_bar; private ListView atListView; private RelativeLayout atRootLayout; private EditText atEditText; private Button atEnterBtn; private TextView topic_tip; private RelativeLayout.LayoutParams atEdiLayoutParams,atEnterBtnLayoutParams,atListViewLayoutParams,topicTipViewLayoutParams; private JSONArray array; private Handler handler; private ArrayAdapter atAdapter; private List<String> atList; private AtThread thread; private List<String> matchStrList;//选择atList匹配的字符串 private int flag; private static int FLAG_1 = 1; private static int FLAG_2 = 2;//1和2代表atEnterBtn的父亲控件不同 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_weibo); setUpViews(); setUpListeners(); dataHelper = DataBaseContext.getInstance(getApplicationContext()); weibo = WeiboContext.getInstance(); SharedPreferences preferences = getSharedPreferences("default_user",Activity.MODE_PRIVATE); user_default_name = preferences.getString("user_default_name", "");//取得微博默认登录账号信息 handler = new AtHandler(); thread = new AtThread(); thread.start();//开启一个线程获取数据 } private void setUpViews(){ weibo_content = (EditText)findViewById(R.id.weibo_content); send_btn = (Button)findViewById(R.id.send_btn); add_cmamera_btn = (Button)findViewById(R.id.add_cmamera_btn); add_at_btn = (Button)findViewById(R.id.add_at_btn); add_topic_btn = (Button)findViewById(R.id.add_topic_btn); add_expression_btn = (Button)findViewById(R.id.add_expression_btn); add_location_btn = (Button)findViewById(R.id.add_location_btn); add_top_bar = (RelativeLayout)findViewById(R.id.add_top_bar); operation_layout = (FrameLayout)findViewById(R.id.operation_layout); expressionGrid = new GridView(this); expressionGrid.setNumColumns(5); expressionList = buildExpressionsList(); expressionAdapter = new ExpressionAdapter(AddWeiboActivity.this, expressionList); expressionGrid.setAdapter(expressionAdapter); //以下代码至本方法setUpViews结束,是个人纯粹蛋疼联系纯代码布局,各位老大可以改成xml布局,淡定 atRootLayout = new RelativeLayout(AddWeiboActivity.this); atEditText = new EditText(AddWeiboActivity.this); atEditText.setId(10000); atEnterBtn = new Button(AddWeiboActivity.this); atEnterBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_enter_selector)); atListView = new ListView(AddWeiboActivity.this); atListView.setCacheColorHint(Color.TRANSPARENT);//防止滑屏时出现黑快,不信可以注释掉此句试一试 atListView.setDivider(getResources().getDrawable(R.drawable.list_divider));//设置分割线 atListView.setBackgroundColor(Color.argb(255, 239, 239, 239));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的 topic_tip = new TextView(AddWeiboActivity.this); topic_tip.setText("请输入话题"); topic_tip.setTextSize(20); topic_tip.setTextColor(Color.argb(255, 90, 142, 189));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的 atRootLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); atEdiLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,80); atEnterBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); atListViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); topicTipViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //添加布局约束 atEdiLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE); atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE); atEnterBtnLayoutParams.setMargins(0, 10, 10, 0);//设置边距,分别代表左,上,右,下 atListViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE); atListViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId()); topicTipViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId()); } private void setUpListeners(){ send_btn.setOnClickListener(this); add_cmamera_btn.setOnClickListener(this); add_at_btn.setOnClickListener(this); add_topic_btn.setOnClickListener(this); add_expression_btn.setOnClickListener(this); add_location_btn.setOnClickListener(this); expressionGrid.setOnItemClickListener(new GridItemClickListener()); atListView.setOnItemClickListener(new AtListViewItemListener()); atEditText.addTextChangedListener(new MyTextWatcher()); atEnterBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { add_top_bar.setVisibility(View.VISIBLE); weibo_content.setVisibility(View.VISIBLE); operation_layout.setVisibility(View.GONE); operation_layout.removeAllViews();//别忘记要移除掉 if(flag==FLAG_1){ weibo_content.setText(weibo_content.getText()+"@"); }else if(flag==FLAG_2){ weibo_content.setText(weibo_content.getText()+"#"+atEditText.getText()+"#"); } } }); } class AtThread extends Thread { @Override public void run() { String jsonStr = weibo.getFans(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), 20, 0, user_default_name); try { JSONObject dataObj = new JSONObject(jsonStr).getJSONObject("data"); array = dataObj.getJSONArray("info"); } catch (JSONException e) { e.printStackTrace(); } //通知handler处理数据 Message msg = handler.obtainMessage(); handler.sendMessage(msg); } } class AtHandler extends Handler { @Override public void handleMessage(Message msg){ int size = array.length(); atList = new ArrayList<String>(); for(int i = 0;i<size;i++){ JSONObject data = array.optJSONObject(i); try { atList.add(data.getString("nick")+"("+data.getString("name")+")"); } catch (JSONException e) { e.printStackTrace(); } } matchStrList = new ArrayList<String>(); matchStrList.addAll(atList); atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,atList); atListView.setAdapter(atAdapter); } } class ExpressionAdapter extends BaseAdapter { private Context context; private LayoutInflater inflater; private List<Map<String,Object>> list; public ExpressionAdapter(Context context, List<Map<String,Object>> list) { super(); this.context = context; this.list = list; this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent){ Map<String,Object> map = list.get(position); ImageView image = new ImageView(context); image.setImageDrawable((Drawable)map.get("drawable")); return image; } } @Override public void onClick(View v) { if(operation_layout.getChildCount()>0){ add_top_bar.setVisibility(View.VISIBLE); weibo_content.setVisibility(View.VISIBLE); operation_layout.setVisibility(View.GONE); operation_layout.removeAllViews();//别忘记要移除掉 return; } switch (v.getId()) { case R.id.send_btn:{ String returnStr = weibo.publishMsg(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), weibo_content.getText().toString()); try { JSONObject dataObj = new JSONObject(returnStr); if("ok".equals(dataObj.getString("msg"))){ Toast.makeText(AddWeiboActivity.this, "发送成功", Toast.LENGTH_SHORT).show();//我日,记得要show,每次都搞忘记 } } catch (JSONException e) { e.printStackTrace(); } } break; case R.id.add_cmamera_btn:{ } break; case R.id.add_at_btn:{ // 动态的组装view atRootLayout.removeAllViews();// 组装前先把所有的孩子拿掉 atEditText.setText("@"); flag = FLAG_1;//区分atEnterBtn是在哪个界面按的 atRootLayout.addView(atEditText, atEdiLayoutParams); atRootLayout.addView(atEnterBtn, atEnterBtnLayoutParams); atRootLayout.addView(atListView, atListViewLayoutParams); operation_layout.addView(atRootLayout); add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响 weibo_content.setVisibility(View.GONE); operation_layout.setVisibility(View.VISIBLE); } break; case R.id.add_topic_btn:{ //动态的组装view atRootLayout.removeAllViews();//组装前先把所有的孩子拿掉 atEditText.setText(""); flag = FLAG_2;//区分atEnterBtn是在哪个界面按的 atRootLayout.addView(atEditText,atEdiLayoutParams); atRootLayout.addView(atEnterBtn,atEnterBtnLayoutParams); atRootLayout.addView(topic_tip,topicTipViewLayoutParams); operation_layout.addView(atRootLayout); add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响 weibo_content.setVisibility(View.GONE); operation_layout.setVisibility(View.VISIBLE); } break; case R.id.add_expression_btn:{ add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与表情选择的gridView相互影响 weibo_content.setVisibility(View.GONE); operation_layout.addView(expressionGrid); operation_layout.setVisibility(View.VISIBLE); } break; case R.id.add_location_btn:{ } break; default: break; } } private List<Map<String,Object>> buildExpressionsList(){ List<Map<String,Object>> list = new ArrayList<Map<String, Object>>(); DecimalFormat df = new DecimalFormat("000");//格式化数字 for(int i = 0;i<105;i++){ Map<String,Object> map = new HashMap<String, Object>(); String formatStr = "h"+df.format(i); int drawableId = 0 ; try { drawableId = R.drawable.class.getDeclaredField(formatStr).getInt(this);//反射取得id,这个地方循环套反射,是不是很耗性能啊,我没测试过,麻烦有好办法的兄弟姐妹分享一下 } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } Drawable drawable = getResources().getDrawable(drawableId); map.put("drawableId", formatStr); map.put("drawable",drawable); list.add(map); } return list; } class GridItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position,long arg3) { Map<String, Object> map = expressionList.get(position); String drawableId = (String)map.get("drawableId"); add_top_bar.setVisibility(View.VISIBLE); weibo_content.setVisibility(View.VISIBLE); operation_layout.setVisibility(View.GONE); operation_layout.removeAllViews();//别忘记要移除掉 String expressionStr=null; expressionStr = TextUtil.drawableIdToFaceName.get(drawableId); expressionStr="/"+expressionStr; weibo_content.setText(weibo_content.getText().toString()+expressionStr); } } class MyTextWatcher implements TextWatcher{ @Override public void afterTextChanged(Editable s){ String changingStr = atEditText.getText().toString(); if(changingStr.indexOf("@")!=-1){ changingStr = changingStr.substring(1); } int size = atList.size(); matchStrList.clear(); for(int i = 0;i<size;i++){ String currentStr = atList.get(i); if(currentStr.indexOf(changingStr)!=-1){ matchStrList.add(currentStr); } } atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,matchStrList); atAdapter.notifyDataSetChanged(); atListView.setAdapter(atAdapter); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before,int count) { } } class AtListViewItemListener implements OnItemClickListener{ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3){ add_top_bar.setVisibility(View.VISIBLE); weibo_content.setVisibility(View.VISIBLE); operation_layout.setVisibility(View.GONE); operation_layout.removeAllViews();//别忘记要移除掉 String str = matchStrList.get(position); String nickStr = str.substring(0,str.indexOf("(")); weibo_content.setText(weibo_content.getText()+"@"+nickStr); } } }
add_weibo.xml:
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff" xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/add_top_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:text="发送" android:id="@+id/send_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5.0dip" android:layout_alignParentRight="true"/> <TextView android:text="写广播" android:textSize="16.0sp" android:textColor="#ffffffff" android:ellipsize="middle" android:gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:layout_alignParentLeft="true" android:layout_marginLeft="10.0dip" android:layout_centerVertical="true"/> </RelativeLayout> <EditText android:id="@+id/weibo_content" android:gravity="top" android:layout_below="@id/add_top_bar" android:background="@null" android:textColor="@null" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <RelativeLayout android:id="@+id/add_bottom_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="50.0dip" android:layout_alignParentBottom="true" android:layout_marginTop="5.0dip"> <Button android:id="@+id/add_cmamera_btn" android:background="@drawable/add_pic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8.0dip" android:layout_marginRight="12.0dip" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <Button android:id="@+id/add_at_btn" android:background="@drawable/add_at_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_cmamera_btn" android:layout_centerVertical="true" /> <Button android:id="@+id/add_topic_btn" android:background="@drawable/add_topic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_at_btn" android:layout_centerVertical="true" /> <Button android:id="@+id/add_expression_btn" android:background="@drawable/add_emo_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_topic_btn" android:layout_centerVertical="true" /> <Button android:id="@+id/add_location_btn" android:background="@drawable/add_location_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/add_expression_btn" android:layout_centerVertical="true" /> <TextView android:textSize="12.0sp" android:text="140" android:textColor="#c6cbce" android:id="@+id/remain_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> </RelativeLayout> <FrameLayout android:layout_gravity="bottom" android:id="@+id/operation_layout" android:background="@android:color/transparent" android:paddingBottom="50.0dip" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>
表情解析先关 :下图是drawable文件下的表情文件
static{//表情文件和表情id的对应的HashMap<String,String> drawableIdToFaceName.put("h000","调皮"); drawableIdToFaceName.put("h001","呲牙"); drawableIdToFaceName.put("h002","惊讶"); drawableIdToFaceName.put("h003","难过"); drawableIdToFaceName.put("h004","酷"); drawableIdToFaceName.put("h005","冷汗"); drawableIdToFaceName.put("h006","抓狂");
评论
7 楼
ywspace
2011-12-14
楼主 太牛了 膜拜
6 楼
helloandroid
2011-11-24
river418 写道
不知道发图片是怎么实现的呢~
这个链接是专门用来发送带图片的微博的http://open.t.qq.com/api/t/add_pic?format=json&content=test&clientip=127.0.0.1&jing=&wei=
5 楼
river418
2011-11-23
不知道发图片是怎么实现的呢~
4 楼
xiaoyangh
2011-09-30
好厉害,如果能收徒弟就好了 。。。俺的漫长开发路啊
3 楼
zhaoyu_h
2011-08-24
楼主 偶像啊。。太厉害啦。。。 加油啊。。支持。。。
2 楼
helloandroid
2011-08-02
落日思晨 写道
l楼主万岁!太强悍了!呵呵!加我QQ啊!
你好,下午在工作不方便回复,qq保密哈,有什么问题可在这留言,如果我知道,会回复你的。谢谢你的关注和支持,接下来有好东西我会继续分享给大家的
1 楼
落日思晨
2011-08-02
l楼主万岁!太强悍了!呵呵!加我QQ啊!
发表评论
-
Android腾讯微薄客户端开发十五:终结篇(分享源代码)
2011-08-01 19:38 23105【有问题的同学请先仔 ... -
Android腾讯微薄客户端开发十四:首页menu菜单
2011-08-01 19:10 4740覆写onCreateOptionsMenu方法 @Over ... -
Android腾讯微薄客户端开发十三:提及篇(与我有关的微博)
2011-07-31 18:53 3164public class ReferActivity ext ... -
Android腾讯微薄客户端开发十二:博主的偶像
2011-07-31 18:34 2628点击收听,显示此博主的偶像列表,点击列表,将显示偶像的详情界 ... -
Android腾讯微薄客户端开发十一:博主的粉丝
2011-07-31 18:19 2383点击听众,显示博主的粉丝列表,点击列表中的粉丝,显示此粉丝详 ... -
Android腾讯微薄客户端开发十:博主广播篇
2011-07-31 17:59 2492点击广播,显示此博主所发表的所有微博 public cl ... -
Android腾讯微薄客户端开发九:博主详情界面篇(广播,听众,收听)
2011-07-31 17:52 3125点击顶部的标题栏,界面跳转到此博主的关注界面 关注界面,此 ... -
Android腾讯微薄客户端开发八:微博查看(转播,对话,点评)
2011-07-31 17:39 3065如果是自己的微博,可以干掉它 下面三幅图是转播,对话以 ... -
Android腾讯微薄客户端开发七:图片加圆角以及时间处理工具类
2011-07-30 13:36 4080给图片加上圆角效果好看多了。 public class ... -
Android腾讯微博客户端开发六:给用户加VIP认证以及美化微博显示内容
2011-07-30 13:07 3621哈哈,通过VIP标志看到赵薇是冒牌的,李开复和冯小刚是正品。 ... -
Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
2011-07-27 01:34 11220老规矩,先上图 这张图片左边部分和右边部分还是有很大的不同,不 ... -
Android腾讯微博客户端开发三:多账号管理的实现
2011-07-22 19:41 7684先看看效果。。 列表中的账号是保存在sqlite数据库中的, ... -
Android腾讯微博客户端开发二:相关工具篇
2011-07-22 18:19 5650工欲善其事,必先利其器。先给大家介绍3个我在做腾讯微博客户端开 ... -
Android腾讯微博客户端开发一:在下方的Tab的实现
2011-07-20 18:58 12652javaEye处女贴 下面的是res下drawabl ...
相关推荐
在移动应用开发领域,Android仿QQ客户端是一个常见的项目,它旨在模拟腾讯QQ客户端的主要功能,帮助开发者学习和理解Android平台上的应用设计与开发。这个项目涵盖了多个重要的Android知识点,包括UI设计、网络通信...
现有的Android微博客户端虽功能完备,但广告繁多和界面设计保守导致用户满意度不高,因此开发一款优化用户体验、无广告的微博客户端显得尤为必要。 微博作为一种微型博客,具有准入门槛低、即时通讯和强互动性的...
在开发基于Android的微博客户端时,需要考虑以下需求: - 优化界面设计,提供更美观、用户友好的体验。 - 实现消息推送功能,确保用户实时接收新消息。 - 强化好友管理,使手机端的好友管理如同Web浏览器一样便捷。 ...
因此,开发一款专注于用户体验、无广告干扰、界面新颖的基于Android的新浪微博客户端显得尤为必要。 四、微博的特点 1. 低准入门槛:微博以简洁的文字形式允许用户快速发布信息,无需复杂的写作技巧。 2. 即时通讯...
本报告主要针对基于 Android 的 SNS(Social Networking Service)社交网络客户应用进行需求调研,旨在开发一款满足用户需求的、无广告干扰的、具有创新界面设计的新浪微博客户端。 一、同类产品分析 1. 微信: ...
QQ作为中国最流行的IM软件之一,其功能丰富多样,包括文本聊天、语音通话、视频通话、群聊、表情发送等。本资源针对这些核心功能提供了一些基础实现,帮助开发者构建自己的IM应用。 首先,我们来看“xmpp”这一标签...
【标题】"openfire 类似QQ客户端 本测试 聊天功能都是ok的" 指的是一个基于XMPP协议的即时通讯系统Openfire,它被用于创建类似腾讯QQ的聊天应用。Openfire是一个开源、免费的企业级即时通讯服务器,支持多种平台,...
【标题】:“模仿腾讯QQ聊天功能的软件源码”揭示了这个项目的主要目标是复刻腾讯QQ的核心聊天体验。在编程领域,模仿一个成熟的产品,如QQ,是一种常见的学习和实践方式,它可以帮助开发者理解即时通讯(IM)系统的...
3. **客户端开发**:包括Android、iOS、Windows等多平台的客户端开发,涉及到UI设计、网络请求、数据解析、本地存储等多个方面。 4. **消息机制**:消息的发送、接收、存储和同步是核心部分。需要实现消息的序列化...
【仿QQ的设置与帮助】是一个项目,旨在学习和实现类似QQ的应用程序中的设置与帮助功能。这个项目可能包括了用户界面设计、功能模块的实现以及用户体验优化等多个方面,是对于即时通讯应用的一种模仿和实践。 在即时...
【标题】:“高仿QQ2013”是一款模拟腾讯QQ2013版本的聊天应用程序,旨在提供与原版QQ相似的用户体验。这款软件可能是由独立开发者或小型团队开发,用于学习、研究或者娱乐目的。它可能包含了QQ的主要功能,如即时...
QQ是中国非常流行的即时通讯软件,由腾讯公司开发。这里的“土豪金qq”可能是QQ的一个特别版本,其设计风格或功能集成了“土豪金”的元素,如金色主题、高级功能或者特别定制的服务。 在Android系统上运行iOS应用...
最后,QQ表情是特定于腾讯QQ平台的一套表情,这些表情可能包含了QQ用户的常用表情,比如小黄脸、小动物等,它们可能需要特别处理以适应QQ平台的标准或者兼容性需求。 总结来说,"emojis表情大全,高清HD64*64PNG原...
2. **客户端开发**:客户端通常包括桌面应用、移动应用(Android、iOS),需要设计用户友好的界面,实现消息的发送、接收和显示,以及文件操作等。 3. **服务器端开发**:服务器端负责处理用户请求,存储用户信息,...
5. **表情与文件传输**:增强用户体验,系统应支持表情包的发送和文件的上传下载,使得沟通更为生动和全面。 6. **安全性**:考虑到数据的敏感性,系统需要有强大的加密算法来保护用户的隐私和信息安全。 7. **...
【LumaQQME for Android】是一款专为Android平台设计的QQ客户端优化版本,它基于最新的QQ for Android源代码开发,旨在提供更加流畅、高效的聊天体验。这款应用在原版QQ的基础上进行了一系列的改进和增强,尤其在...
QQ即时通信程序是一款深受全球用户喜爱的在线通讯工具,由中国的腾讯公司开发并维护。它提供了丰富的功能,包括文字聊天、语音通话、视频通话、文件传输、群聊、表情包、朋友圈分享等,使得用户能够方便快捷地进行跨...
QQ聊天工具是一款模仿腾讯QQ设计的即时通讯应用,旨在提供类似QQ的基本功能,如添加好友、删除好友、发送消息以及搜索和查找好友等。这款工具的核心目标是让用户能够体验到便捷的在线交流,并且可能具备一些自定义或...
5. **功能特点**:尽管是针对3G环境,3GQQ仍应具备基本的QQ功能,如文字聊天、群聊、文件传输、表情发送等,可能还会有针对手机用户的界面布局和操作习惯。 6. **版本更新**:“v1.3”表明产品经过了多次迭代和优化...