android 轻松实现在线即时聊天【图片、语音、表情、文字】等!含源码!

原文:http://blog.csdn.net/gulaer/article/details/12160251


之前做够在线及时聊天,小型企业基本上都是通过xmpp协议实现,但是我之前公司做的多多少少会出现一些问题,今天在查找资料的时候,无意发现了一个很好的东西,某公司开发了一套即时聊天sdk,虽然也是由xmpp协议开发,但是稳定性和实现简答方面确实容易得多,通俗易懂。关于公司名字不说了,大家自己去搜吧,不然等会有打广告嫌疑!

    涵盖了android和ios,下面给出简单的sdk介绍:

Android SDK 使用指南

     首先将libs文件夹下的appkefu_sdk.jar加入到项目工程libs文件夹下(如果没有,则创建文件夹,仅针对eclipse开发环境). 其次,将res文件夹下所有文件拷贝到项目res文件夹下。在项目中使用appkefu_sdk.jar主要有两种方式,具体可参考示例程序AppKeFuDemoSimple和AppKeFuDemoAdvanced, 二者的主要区别在于前者每次会话的时候都会尝试与服务器建立新的会话,当关闭聊天窗口的时候关闭会话,断开与服务器的链接。后者则尝试在项目启动的时候 建立与服务器的一次性会话,在项目运行期间,所有的会话窗口公用此会话链接,直到项目结束运行或者网络故障

     AppKeFuDemoSimple 调用此方法启动会话窗口


[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">/**  
  2. * @param kefuName 客服的用户名  
  3. */  
  4. private void startChat(String kefuName) {  
  5. Log.d(TAG, "startChat:"+kefuName);  
  6. String jid = kefuName + "@appkefu.com";  
  7. Intent intent = new Intent(this, ChatActivity.class);  
  8. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  9. Contact contact = new Contact(jid);  
  10. intent.setData(contact.toUri());  
  11. startActivity(intent);    
  12. }</span>  

AppKeFuDemoSimple 在AndroidManifest.xml中添加:


[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">    <uses-permission android:name="android.permission.INTERNET" />  
  2.     <uses-permission android:name="android.permission.VIBRATE" /></span>  


[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">    <activity android:name="com.appkefu.lib.ChatActivity" android:theme="@android:style/Theme.NoTitleBar" />  
  2.     <service android:name="com.appkefu.lib.service.AppService" /></span>  

AppKeFuDemoAdvanced 主要分为四部分:AppKeFuApplication,MainActivity,LoginActivity和AndroidManifest.xml
[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">    import android.app.Application;  
  2.        
  3.     /**  
  4.     * @author Administrator  
  5.     *  
  6.     */  
  7.     public class AppKeFuApplication extends Application {  
  8.        
  9.     private boolean mIsConnected = false;  
  10.        
  11.     public AppKeFuApplication(){  
  12.     }  
  13.     @Override  
  14.     public void onCreate() {  
  15.     super.onCreate();  
  16.     }  
  17.     @Override  
  18.     public void onTerminate() {  
  19.     super.onTerminate();  
  20.     }  
  21.     public boolean isConnected() {  
  22.     return mIsConnected;  
  23.     }  
  24.     public void setConnected(boolean isConnected) {  
  25.     mIsConnected = isConnected;  
  26.     }  
  27.     }  
  28. </span>  

[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">import com.appkefu.lib.ChatViewActivity;  
  2. import com.appkefu.lib.service.Contact;  
  3.    
  4. import android.os.Bundle;  
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.util.Log;  
  8. import android.view.Menu;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.Toast;  
  13.    
  14. public class MainActivity extends Activity {  
  15.    
  16. private static final String TAG = MainActivity.class.getSimpleName();  
  17. private static final int LOGIN_REQUEST_CODE = 1;  
  18.    
  19. private Button chatAdmin;  
  20. private Button chatKeFu1;  
  21. private Button chatKeFu2;  
  22.    
  23. private AppKeFuApplication app;  
  24.    
  25. @Override  
  26. protected void onCreate(Bundle savedInstanceState) {  
  27. super.onCreate(savedInstanceState);  
  28. setContentView(R.layout.activity_main);  
  29. chatAdmin = (Button)findViewById(R.id.chat_admin);  
  30. chatAdmin.setOnClickListener(listener);  
  31. chatKeFu1 = (Button)findViewById(R.id.chat_kefu1);  
  32. chatKeFu1.setOnClickListener(listener);  
  33. chatKeFu2 = (Button)findViewById(R.id.chat_kefu2);  
  34. chatKeFu2.setOnClickListener(listener);  
  35. app = (AppKeFuApplication)getApplication();  
  36. }  
  37.    
  38. @Override  
  39. public boolean onCreateOptionsMenu(Menu menu) {  
  40. // Inflate the menu; this adds items to the action bar if it is present.  
  41. getMenuInflater().inflate(R.menu.activity_main, menu);  
  42. return true;  
  43. }  
  44. @Override  
  45. protected void onStart() {  
  46. super.onStart();  
  47. Log.d(TAG, "onStart");  
  48. if(!app.isConnected()){  
  49. Log.d(TAG, "start login");  
  50. Intent login = new Intent(this, LoginActivity.class);  
  51. startActivityForResult(login, LOGIN_REQUEST_CODE);  
  52. }  
  53. else  
  54. {  
  55. Log.d(TAG, "already logged in");  
  56. }  
  57.    
  58. }  
  59. @Override  
  60. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  61. if (requestCode == LOGIN_REQUEST_CODE) {  
  62. if (resultCode == Activity.RESULT_OK)  
  63. {  
  64. Log.d(TAG, "Activity.RESULT_OK");  
  65. app.setConnected(true);  
  66.    
  67. }  
  68. else if (resultCode == Activity.RESULT_CANCELED)  
  69. {  
  70. Log.d(TAG, "Activity.RESULT_CANCELED");  
  71. app.setConnected(false);  
  72. chatAdmin.setEnabled(false);  
  73. chatKeFu1.setEnabled(false);  
  74. chatKeFu2.setEnabled(false);  
  75. Toast.makeText(this, "登录失败", Toast.LENGTH_LONG).show();  
  76. }  
  77. }  
  78. }  
  79. @Override  
  80. protected void onRestart() {  
  81. super.onRestart();  
  82. Log.d(TAG, "onRestart");  
  83. }  
  84. @Override  
  85. protected void onResume() {  
  86. super.onResume();  
  87. Log.d(TAG, "onResume");  
  88. }  
  89. @Override  
  90. protected void onPause() {  
  91. super.onPause();  
  92. Log.d(TAG, "onPause");  
  93. }  
  94. @Override  
  95. protected void onStop() {  
  96. super.onStop();  
  97.    
  98. Log.d(TAG, "onStop");  
  99. }  
  100. @Override  
  101. protected void onDestroy() {  
  102. super.onDestroy();  
  103. Log.d(TAG, "onDestroy");  
  104. }  
  105.    
  106. private OnClickListener listener = new OnClickListener() {    
  107. @Override  
  108. public void onClick(View v) {  
  109. // TODO Auto-generated method stub  
  110. switch(v.getId()){  
  111. case R.id.chat_admin:  
  112. startChat("admin");  
  113. break;  
  114. case R.id.chat_kefu1:  
  115. startChat("kefu1");  
  116. break;  
  117. case R.id.chat_kefu2:  
  118. startChat("kefu2");  
  119. break;  
  120. default:  
  121. break;  
  122. }  
  123. }  
  124. };  
  125. private void startChat(String kefuName) {  
  126. String jid = kefuName + "@appkefu.com";  
  127. Intent intent = new Intent(this, ChatViewActivity.class);  
  128. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  129. Contact contact = new Contact(jid);  
  130. intent.setData(contact.toUri());  
  131. startActivity(intent);  
  132. </span>  

[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">import com.appkefu.lib.service.AppService;  
  2. import com.appkefu.lib.service.LoginAsyncTask;  
  3. import com.appkefu.lib.service.XmppFacade;  
  4.    
  5. import android.os.AsyncTask;  
  6. import android.os.Bundle;  
  7. import android.os.IBinder;  
  8. import android.app.Activity;  
  9. import android.content.ComponentName;  
  10. import android.content.Context;  
  11. import android.content.Intent;  
  12. import android.content.ServiceConnection;  
  13. import android.util.Log;  
  14. import android.view.Menu;  
  15.    
  16. public class LoginActivity extends Activity {  
  17. private static final String TAG = LoginActivity.class.getSimpleName();  
  18. private XmppFacade mXmppFacade;  
  19. private AsyncTask mLoginTask;  
  20. private boolean mBinded = false;  
  21. @Override  
  22. protected void onCreate(Bundle savedInstanceState) {  
  23. super.onCreate(savedInstanceState);  
  24. setContentView(R.layout.activity_splash);  
  25. }  
  26. @Override  
  27. public boolean onCreateOptionsMenu(Menu menu) {  
  28. // Inflate the menu; this adds items to the action bar if it is present.  
  29. getMenuInflater().inflate(R.menu.activity_splash, menu);  
  30. return true;  
  31. }  
  32. @Override  
  33. protected void onStart() {  
  34. super.onStart();  
  35. Log.d(TAG, "onStart");  
  36. if(mLoginTask == null)  
  37. mLoginTask = new LoginTask();  
  38. if (!mBinded) {  
  39. Intent intent = new Intent(LoginActivity.this, AppService.class);  
  40. bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  41. }  
  42. }  
  43. @Override  
  44. protected void onRestart() {  
  45. super.onRestart();  
  46. Log.d(TAG, "onRestart");      
  47. }  
  48. @Override  
  49. protected void onResume() {  
  50. super.onResume();  
  51. Log.d(TAG, "onResume");  
  52. }  
  53. @Override  
  54. protected void onPause() {  
  55. super.onPause();  
  56. Log.d(TAG, "onPause");  
  57. }  
  58. @Override  
  59. protected void onStop() {  
  60. super.onStop();  
  61. if (mBinded) {  
  62. unbindService(conn);  
  63. mBinded = false;  
  64. }  
  65. mXmppFacade = null;  
  66. //newChat = null;  
  67. Log.d(TAG, "onStop");  
  68. }  
  69. @Override  
  70. protected void onDestroy() {  
  71. super.onDestroy();  
  72. Log.d(TAG, "onDestroy");  
  73. }  
  74. private ServiceConnection conn = new ServiceConnection() {  
  75. @Override  
  76. public void onServiceDisconnected(ComponentName name) {  
  77. // TODO Auto-generated method stub  
  78. Log.d(TAG, "MainActivity.onServiceDisconnected");  
  79. }  
  80. @Override  
  81. public void onServiceConnected(ComponentName name, IBinder service) {  
  82. // TODO Auto-generated method stub  
  83. Log.d(TAG, "MainActivity.onServiceConnected");  
  84. mXmppFacade = (XmppFacade) service;  
  85. mLoginTask.execute(mXmppFacade);  
  86. mBinded = true;  
  87. }  
  88. };  
  89. private class LoginTask extends LoginAsyncTask {  
  90. LoginTask() {  
  91. Log.d(TAG, "LoginTask.Construction");  
  92. }  
  93. @Override  
  94. protected void onPostExecute(Boolean result) {  
  95. Log.d(TAG, "LoginTask.onPostExecute");  
  96. if (result == null || !result) { // Task cancelled or exception  
  97. if (!result) {  
  98. Intent i = new Intent();  
  99. i.putExtra("message", getErrorMessage());  
  100. LoginActivity.this.setResult(Activity.RESULT_CANCELED, i);  
  101. } else  
  102. LoginActivity.this.setResult(Activity.RESULT_CANCELED);  
  103. LoginActivity.this.finish();  
  104. }  
  105. else  
  106. {  
  107. //login succeed  
  108. Log.d(TAG, "LoginTask.onPostExecute.true ");  
  109. LoginActivity.this.startService(new Intent(LoginActivity.this, AppService.class));  
  110. LoginActivity.this.setResult(RESULT_OK);  
  111. LoginActivity.this.finish();  
  112. }  
  113. }  
  114. @Override  
  115. protected void onProgressUpdate(Integer... values) {  
  116. Log.d(TAG, "LoginTask.onProgressUpdate");  
  117. }  
  118. @Override  
  119. protected void onCancelled() {  
  120. super.onCancelled();  
  121. Log.d(TAG, "LoginTask.onCancelled");  
  122. Intent intent = new Intent(LoginActivity.this, AppService.class);  
  123. LoginActivity.this.stopService(intent);  
  124. }  
  125. }  
  126. </span>  

在Application标签中加


[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">android:name="com.appkefu.demo.advanced.AppKeFuApplication"</span>  

[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">    <uses-permission android:name="android.permission.INTERNET" />  
  2.     <uses-permission android:name="android.permission.VIBRATE" /></span>  

[html]  view plain copy print ?
  1. <span style="font-family:Microsoft YaHei; font-size:14px">    <activity android:name="com.appkefu.lib.ChatViewActivity" android:theme="@android:style/Theme.NoTitleBar" />  
  2.     <service android:name="com.appkefu.lib.service.AppService" /></span>  

更多详细资料链接点击查看


官方Demo下载:http://download.csdn.net/detail/gulaer/6338067

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值