雲通信android
首先咱們要去網易雲通訊上註冊一個帳號:網址:https://netease.im/git
github:代碼網址:https://github.com/qianshao1030/Tongxugithub
代碼實現緩存
Activity佈局:服務器
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_main" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context="com.example.asus.tongxun.MainActivity"> 9 <TextView 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:layout_gravity="center_horizontal" 13 android:background="@android:color/holo_green_light" 14 android:gravity="center" 15 android:paddingBottom="10dp" 16 android:paddingTop="10dp" 17 android:text="登陸" 18 android:textColor="@android:color/white" 19 android:textSize="20sp" /> 20 21 <LinearLayout 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" 24 android:layout_marginTop="20dp" 25 android:orientation="horizontal" 26 android:paddingLeft="20dp" 27 android:paddingRight="20dp"> 28 29 <TextView 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:text="賬號:" 33 android:textColor="@color/colorAccent" /> 34 35 <EditText 36 android:id="@+id/tv_account" 37 android:layout_width="match_parent" 38 android:layout_height="wrap_content" 39 android:hint="請輸入您的賬號!" /> 40 </LinearLayout> 41 42 <LinearLayout 43 android:layout_width="match_parent" 44 android:layout_height="wrap_content" 45 android:layout_marginTop="20dp" 46 android:orientation="horizontal" 47 android:paddingLeft="20dp" 48 android:paddingRight="20dp"> 49 50 <TextView 51 android:layout_width="wrap_content" 52 android:layout_height="wrap_content" 53 android:text="密碼:" 54 android:textColor="@color/colorAccent" /> 55 56 <EditText 57 android:id="@+id/tv_pw" 58 android:layout_width="match_parent" 59 android:layout_height="wrap_content" 60 android:hint="請輸入您的賬號!" /> 61 </LinearLayout> 62 63 <Button 64 android:id="@+id/btn_login" 65 android:layout_width="match_parent" 66 android:layout_height="wrap_content" 67 android:layout_marginTop="60dp" 68 android:text="登陸!" /> 69 70 </LinearLayout>
Activity:網絡
1 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 2 3 private EditText tv_account; 4 private EditText tv_pw; 5 private Button btn_login; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 initView(); 12 } 13 14 private void initView() { 15 tv_account = (EditText) findViewById(R.id.tv_account); 16 tv_pw = (EditText) findViewById(R.id.tv_pw); 17 btn_login = (Button) findViewById(R.id.btn_login); 18 19 btn_login.setOnClickListener(this); 20 } 21 22 @Override 23 public void onClick(View v) { 24 switch (v.getId()) { 25 case R.id.btn_login: 26 //封裝登陸信息. 27 LoginInfo info 28 = new LoginInfo(tv_account.getText().toString(),tv_pw.getText().toString()); 29 //請求服務器的回調 30 RequestCallback<LoginInfo> callback = 31 new RequestCallback<LoginInfo>() { 32 @Override 33 public void onSuccess(LoginInfo param) { 34 DemonstrateUtil 35 .showLogResult("onSuccess--"+param.getAccount()+"--"+param.getToken()); 36 DemonstrateUtil.showToastResult(MainActivity.this,"登陸成功!"); 37 38 // 能夠在此保存LoginInfo到本地,下次啓動APP作自動登陸用 39 40 //跳轉到消息頁面 41 startActivity(new Intent(MainActivity.this,WelcomeActivity.class)); 42 finish(); 43 } 44 45 @Override 46 public void onFailed(int code) { 47 DemonstrateUtil.showLogResult("登陸失敗!返回碼"+code); 48 } 49 50 @Override 51 public void onException(Throwable exception) { 52 DemonstrateUtil.showLogResult(exception.toString()); 53 } 54 55 }; 56 //發送請求. 57 NIMClient.getService(AuthService.class).login(info) 58 .setCallback(callback); 59 break; 60 } 61 } 62 }
Activity聊天佈局:session
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_welcome" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context="com.example.asus.tongxun.WelcomeActivity"> 9 <TextView 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:layout_gravity="center_horizontal" 13 android:background="@android:color/holo_green_light" 14 android:gravity="center" 15 android:paddingBottom="10dp" 16 android:paddingTop="10dp" 17 android:text="單聊" 18 android:textColor="@android:color/white" 19 android:textSize="20sp" /> 20 21 <LinearLayout 22 android:layout_width="match_parent" 23 android:layout_height="0dp" 24 android:layout_weight="1" 25 android:orientation="vertical" 26 android:paddingLeft="20dp" 27 android:paddingRight="20dp"> 28 29 <TextView 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:text="收到的消息:" /> 33 34 <TextView 35 android:id="@+id/tv_recivetv_in" 36 android:layout_width="wrap_content" 37 android:layout_height="0dp" 38 android:layout_weight="1" 39 android:text="1111" 40 android:textColor="@android:color/holo_red_light" /> 41 42 <TextView 43 android:layout_width="wrap_content" 44 android:layout_height="wrap_content" 45 android:text="發出的消息:" /> 46 47 <TextView 48 android:id="@+id/tv_send_out" 49 android:layout_width="wrap_content" 50 android:layout_height="0dp" 51 android:layout_weight="1" 52 android:text="2222" 53 android:textColor="@android:color/holo_blue_light" /> 54 </LinearLayout> 55 56 <EditText 57 android:id="@+id/et_input" 58 android:layout_width="match_parent" 59 android:layout_height="wrap_content" 60 android:layout_marginLeft="20dp" 61 android:layout_marginRight="20dp" 62 android:layout_marginTop="5dp" 63 android:hint="輸入消息..." /> 64 65 <LinearLayout 66 android:layout_width="match_parent" 67 android:layout_height="wrap_content" 68 android:orientation="horizontal" 69 android:paddingLeft="10dp" 70 android:paddingRight="10dp"> 71 72 <Button 73 android:id="@+id/btn_select_people" 74 android:layout_width="0dp" 75 android:layout_height="wrap_content" 76 android:layout_weight="1" 77 android:text="選擇聯繫人" /> 78 79 <Button 80 android:id="@+id/btn_send" 81 android:layout_width="0dp" 82 android:layout_height="wrap_content" 83 android:layout_weight="1" 84 android:text="發送" /> 85 86 <Button 87 android:id="@+id/btn_out" 88 android:layout_width="0dp" 89 android:layout_height="wrap_content" 90 android:layout_weight="1" 91 android:text="退出" /> 92 </LinearLayout> 93 94 </LinearLayout>
聊天的Activity:架構
1 public class WelcomeActivity extends AppCompatActivity implements View.OnClickListener { 2 3 private TextView tv_recivetv_in; 4 private TextView tv_send_out; 5 private EditText et_input; 6 private Button btn_select_people; 7 private Button btn_send; 8 private Button btn_out; 9 10 private Observer<List<IMMessage>> incomingMessageObserver; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_welcome); 16 initView(); 17 //註冊消息觀察者,registerObserver 18 registerObserver(); 19 } 20 21 private void registerObserver() { 22 // 處理新收到的消息,爲了上傳處理方便,SDK 保證參數 messages 所有來自同一個聊天對象。 23 //消息接收觀察者 24 incomingMessageObserver = new Observer<List<IMMessage>>() { 25 @Override 26 public void onEvent(List<IMMessage> imMessages) { 27 // 處理新收到的消息,爲了上傳處理方便,SDK 保證參數 messages 所有來自同一個聊天對象。 28 IMMessage imMessage = imMessages.get(0); 29 tv_recivetv_in.setText(imMessage.getFromNick() + "-->:" + imMessage.getContent()); 30 account = imMessage.getFromAccount(); 31 } 32 }; 33 //註冊消息接收觀察者, 34 //true,表明註冊.false,表明註銷 35 NIMClient.getService(MsgServiceObserve.class) 36 .observeReceiveMessage(incomingMessageObserver, true); 37 } 38 39 private void initView() { 40 tv_recivetv_in = (TextView) findViewById(R.id.tv_recivetv_in); 41 tv_send_out = (TextView) findViewById(R.id.tv_send_out); 42 et_input = (EditText) findViewById(R.id.et_input); 43 btn_select_people = (Button) findViewById(R.id.btn_select_people); 44 btn_send = (Button) findViewById(R.id.btn_send); 45 btn_out = (Button) findViewById(R.id.btn_out); 46 47 btn_select_people.setOnClickListener(this); 48 btn_send.setOnClickListener(this); 49 btn_out.setOnClickListener(this); 50 } 51 52 @Override 53 public void onClick(View v) { 54 switch (v.getId()) { 55 case R.id.btn_select_people: 56 //選擇聯繫人. 57 final String[] accounts = {"1690152226", "2871794243","123456"}; 58 final String[] items = { 59 "小鳥", 60 "大鳥", 61 "小梁", 62 }; 63 DialogUtil.showListDialog(WelcomeActivity.this, "請選擇聯繫人!", items, new DialogInterface.OnClickListener() { 64 @Override 65 public void onClick(DialogInterface dialog, int which) { 66 account = accounts[which]; 67 DemonstrateUtil.showToastResult(WelcomeActivity.this, items[which]); 68 } 69 }); 70 break; 71 case R.id.btn_send: 72 //發送消息 73 sendMessage(); 74 break; 75 case R.id.btn_out: 76 //退出登陸 77 loginOut(); 78 break; 79 } 80 } 81 private String account = "zxn002"; 82 83 private void sendMessage() { 84 // 以單聊類型爲例 85 SessionTypeEnum sessionType = SessionTypeEnum.P2P; 86 String text = et_input.getText().toString(); 87 // 建立一個文本消息 88 IMMessage textMessage = MessageBuilder.createTextMessage(account, sessionType, text); 89 90 // 發送給對方 91 NIMClient.getService(MsgService.class).sendMessage(textMessage, false); 92 tv_send_out.setText(text); 93 } 94 95 private void loginOut() { 96 NIMClient.getService(AuthService.class).logout(); 97 finish(); 98 startActivity(new Intent(this, MainActivity.class)); 99 } 100 101 @Override 102 protected void onDestroy() { 103 super.onDestroy(); 104 //註銷消息接收觀察者. 105 NIMClient.getService(MsgServiceObserve.class) 106 .observeReceiveMessage(incomingMessageObserver, false); 107 } 108 }
Application:
1 public class NimApplication extends Application{ 2 public void onCreate() { 3 // ... your codes 4 5 // SDK初始化(啓動後臺服務,若已經存在用戶登陸信息, SDK 將完成自動登陸) 6 NIMClient.init(this, loginInfo(), options()); 7 8 // ... your codes 9 if (NIMUtil.isMainProcess(this)) { 10 // 注意:如下操做必須在主進程中進行 11 // 一、UI相關初始化操做 12 // 二、相關Service調用 13 } 14 } 15 16 // 若是返回值爲 null,則所有使用默認參數。 17 private SDKOptions options() { 18 SDKOptions options = new SDKOptions(); 19 20 // 若是將新消息通知提醒託管給 SDK 完成,須要添加如下配置。不然無需設置。 21 StatusBarNotificationConfig config = new StatusBarNotificationConfig(); 22 config.notificationEntrance = WelcomeActivity.class; // 點擊通知欄跳轉到該Activity 23 config.notificationSmallIconId = R.mipmap.ic_launcher; 24 // 呼吸燈配置 25 config.ledARGB = Color.GREEN; 26 config.ledOnMs = 1000; 27 config.ledOffMs = 1500; 28 // 通知鈴聲的uri字符串 29 config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg"; 30 options.statusBarNotificationConfig = config; 31 32 // 配置保存圖片,文件,log 等數據的目錄 33 // 若是 options 中沒有設置這個值,SDK 會使用採用默認路徑做爲 SDK 的數據目錄。 34 // 該目錄目前包含 log, file, image, audio, video, thumb 這6個目錄。 35 String sdkPath = Environment.getExternalStorageDirectory() + "/" + getPackageName() + "/nim"; // 能夠不設置,那麼將採用默認路徑 36 // 若是第三方 APP 須要緩存清理功能, 清理這個目錄下面個子目錄的內容便可。 37 options.sdkStorageRootPath = sdkPath; 38 39 // 配置是否須要預下載附件縮略圖,默認爲 true 40 options.preloadAttach = true; 41 42 // 配置附件縮略圖的尺寸大小。表示向服務器請求縮略圖文件的大小 43 // 該值通常應根據屏幕尺寸來肯定, 默認值爲 Screen.width / 2 44 options.thumbnailSize = 480/2; 45 46 // 用戶資料提供者, 目前主要用於提供用戶資料,用於新消息通知欄中顯示消息來源的頭像和暱稱 47 options.userInfoProvider = new UserInfoProvider() { 48 @Override 49 public UserInfo getUserInfo(String account) { 50 return null; 51 } 52 53 @Override 54 public String getDisplayNameForMessageNotifier(String account, String sessionId, 55 SessionTypeEnum sessionType) { 56 return null; 57 } 58 59 @Override 60 public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionType, String sessionId) { 61 return null; 62 } 63 }; 64 return options; 65 } 66 67 // 若是已經存在用戶登陸信息,返回LoginInfo,不然返回null便可 68 private LoginInfo loginInfo() { 69 return null; 70 } 71 }
清單文件:app
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.asus.tongxun"> 4 5 <!-- 權限聲明 --> 6 <!-- 訪問網絡狀態 --> 7 <uses-permission android:name="android.permission.INTERNET" /> 8 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 9 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 10 <!-- 控制呼吸燈,振動器等,用於新消息提醒 --> 11 <uses-permission android:name="android.permission.FLASHLIGHT" /> 12 <uses-permission android:name="android.permission.VIBRATE" /> 13 <!-- 外置存儲存取權限 --> 14 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 15 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 16 17 <!-- 多媒體相關 --> 18 <uses-permission android:name="android.permission.CAMERA" /> 19 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 20 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 21 22 <!-- 若是須要實時音視頻通話模塊,下面的權限也是必須的。不然,能夠不加 --> 23 <uses-permission android:name="android.permission.BLUETOOTH" /> 24 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 25 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 26 <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 27 28 <uses-feature android:name="android.hardware.camera" /> 29 <uses-feature android:name="android.hardware.camera.autofocus" /> 30 <uses-feature 31 android:glEsVersion="0x00020000" 32 android:required="true" /> 33 <!-- SDK 權限申明, 第三方 APP 接入時,請將 com.netease.nim.demo 替換爲本身的包名 --> 34 <!-- 和下面的 uses-permission 一塊兒加入到你的 AndroidManifest 文件中。 --> 35 <permission 36 android:name="com.example.asus.tongxun.permission.RECEIVE_MSG" 37 android:protectionLevel="signature" /> 38 <!-- 接收 SDK 消息廣播權限, 第三方 APP 接入時,請將 com.netease.nim.demo 替換爲本身的包名 --> 39 <uses-permission android:name="com.example.asus.tongxun.permission.RECEIVE_MSG" /> 40 41 <application 42 android:name=".NimApplication" 43 android:allowBackup="true" 44 android:icon="@mipmap/ic_launcher" 45 android:label="@string/app_name" 46 android:supportsRtl="true" 47 android:theme="@style/AppTheme"> 48 49 <!-- 50 APP key, 能夠在這裏設置,也能夠在 SDKOptions 中提供。 51 若是 SDKOptions 中提供了,取 SDKOptions 中的值。 52 --> 53 <meta-data 54 android:name="com.netease.nim.appKey" 55 android:value="908e3770fb58ac268e0c5b9c3e341e14" /> 56 57 <!-- 聲明網易雲通訊後臺服務,如需保持後臺推送,使用獨立進程效果會更好。 --> 58 <service 59 android:name="com.netease.nimlib.service.NimService" 60 android:process=":core" /> 61 62 <!-- 運行後臺輔助服務 --> 63 <service 64 android:name="com.netease.nimlib.service.NimService$Aux" 65 android:process=":core" /> 66 67 <!-- 聲明網易雲通訊後臺輔助服務 --> 68 <service 69 android:name="com.netease.nimlib.job.NIMJobService" 70 android:exported="true" 71 android:permission="android.permission.BIND_JOB_SERVICE" 72 android:process=":core" /> 73 74 <!-- 75 網易雲通訊SDK的監視系統啓動和網絡變化的廣播接收器,用戶開機自啓動以及網絡變化時候從新登陸, 76 保持和 NimService 同一進程 77 --> 78 <receiver 79 android:name="com.netease.nimlib.service.NimReceiver" 80 android:exported="false" 81 android:process=":core"> 82 <intent-filter> 83 <action android:name="android.intent.action.BOOT_COMPLETED" /> 84 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 85 </intent-filter> 86 </receiver> 87 88 <!-- 網易雲通訊進程間通訊 Receiver --> 89 <receiver android:name="com.netease.nimlib.service.ResponseReceiver" /> 90 91 <!-- 網易雲通訊進程間通訊service --> 92 <service android:name="com.netease.nimlib.service.ResponseService" /> 93 94 <meta-data 95 android:name="com.netease.cosine.target" 96 android:value="" /> 97 <meta-data 98 android:name="com.netease.cosine.target.receiver" 99 android:value="com.netease.nimlib.service.NimReceiver" /> 100 101 <!-- !!!!!! --> 102 <!-- 103 <provider 104 android:name="com.netease.nimlib.ipc.NIMContentProvider" 105 android:authorities="com.example.asus.tongxun.ipc.provider" 106 android:exported="false" 107 android:process=":core" /> 108 --> 109 110 <activity android:name=".MainActivity"> 111 <intent-filter> 112 <action android:name="android.intent.action.MAIN" /> 113 114 <category android:name="android.intent.category.LAUNCHER" /> 115 </intent-filter> 116 </activity> 117 <activity android:name=".WelcomeActivity"></activity> 118 </application> 119 120 </manifest>
build.gradle:ide
apply plugin: 'com.android.application' android { compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.example.asus.tongxun" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } defaultConfig { ndk { //設置支持的SO庫架構 abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64" } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' testCompile 'junit:junit:4.12' // 添加依賴。注意,版本號必須一致。 // 基礎功能 (必需) compile 'com.netease.nimlib:basesdk:4.4.0' // 音視頻和互動白板服務須要 compile 'com.netease.nimlib:nrtc:4.4.0' // 音視頻須要 compile 'com.netease.nimlib:avchat:4.4.0' // 聊天室須要 compile 'com.netease.nimlib:chatroom:4.4.0' // 互動白板服務須要 compile 'com.netease.nimlib:rts:4.4.0' // 全文檢索服務須要 compile 'com.netease.nimlib:lucene:4.4.0' compile project(':library-demonstrate') }