即時通信實現

即時通信的依賴java

1 compile files('libs/nim-basesdk-4.5.1.jar')
2     compile files('libs/nim-chatroom-4.5.1.jar')
3     compile 'com.android.support:appcompat-v7:26.+'
4     compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'
5     testCompile 'junit:junit:4.12'
6     compile 'com.jakewharton:butterknife:8.8.1'
7     annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

即時通信使用雲信權限android

 1  <!-- 權限聲明 -->
 2     <!-- 訪問網絡狀態 -->
 3     <uses-permission android:name="android.permission.INTERNET" />
 4     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 5     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 6     <!-- 控制呼吸燈,振動器等,用於新消息提醒 -->
 7     <uses-permission android:name="android.permission.FLASHLIGHT" />
 8     <uses-permission android:name="android.permission.VIBRATE" />
 9     <!-- 外置存儲存取權限 -->
10     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
11     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
12 
13     <!-- 多媒體相關 -->
14     <uses-permission android:name="android.permission.CAMERA" />
15     <uses-permission android:name="android.permission.RECORD_AUDIO" />
16     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
17 
18     <!-- 若是須要實時音視頻通話模塊,下面的權限也是必須的。不然,能夠不加 -->
19     <uses-permission android:name="android.permission.BLUETOOTH" />
20     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
21     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
22     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
23 
24     <uses-feature android:name="android.hardware.camera" />
25     <uses-feature android:name="android.hardware.camera.autofocus" />
26     <uses-feature
27         android:glEsVersion="0x00020000"
28         android:required="true" />
29 
30     <!-- SDK 權限申明, 第三方 APP 接入時,請將 com.netease.nim.demo 替換爲本身的包名 -->
31     <!-- 和下面的 uses-permission 一塊兒加入到你的 AndroidManifest 文件中。 -->
32     <permission
33         android:name="lipengfei.xunxin.permission.RECEIVE_MSG"
34         android:protectionLevel="signature" />
35     <!-- 接收 SDK 消息廣播權限, 第三方 APP 接入時,請將 com.netease.nim.demo 替換爲本身的包名 -->
36     <uses-permission android:name="lipengfei.xunxin.permission.RECEIVE_MSG" />

在清單中application中activity以前加入app的key緩存

 1 <!--
 2              APP key, 能夠在這裏設置,也能夠在 SDKOptions 中提供。
 3             若是 SDKOptions 中提供了,取 SDKOptions 中的值。
 4         -->
 5         <meta-data
 6             android:name="com.netease.nim.appKey"
 7             android:value="6619d22be8ecc9e84ce7c64c99c8c4d9" />
 8 
 9         <!-- 雲信後臺服務,請使用獨立進程。 -->
10         <service
11             android:name="com.netease.nimlib.service.NimService"
12             android:process=":core" />
13 
14         <!-- 雲信後臺輔助服務 -->
15         <service
16             android:name="com.netease.nimlib.service.NimService$Aux"
17             android:process=":core" />
18 
19         <!-- 雲信後臺輔助服務 -->
20         <service
21             android:name="com.netease.nimlib.job.NIMJobService"
22             android:exported="true"
23             android:permission="android.permission.BIND_JOB_SERVICE"
24             android:process=":core" />
25 
26         <!-- 雲信監視系統啓動和網絡變化的廣播接收器,保持和 NimService 同一進程 -->
27         <receiver
28             android:name="com.netease.nimlib.service.NimReceiver"
29             android:exported="false"
30             android:process=":core">
31             <intent-filter>
32                 <action android:name="android.intent.action.BOOT_COMPLETED" />
33                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
34             </intent-filter>
35         </receiver>
36 
37         <!-- 雲信進程間通訊 Receiver -->
38         <receiver android:name="com.netease.nimlib.service.ResponseReceiver" />
39 
40         <!-- 雲信進程間通訊service -->
41         <service android:name="com.netease.nimlib.service.ResponseService" />
42 
43         <!-- 雲信進程間通訊provider -->
44         <!-- android:authorities="{包名}.ipc.provider", 請將com.netease.nim.demo替換爲本身的包名 -->
45         <provider
46             android:name="com.netease.nimlib.ipc.NIMContentProvider"
47             android:authorities="lipengfei.xunxin.ipc.provider"
48             android:exported="false"
49             android:process=":core" />

使用雲信SDK的方法服務器

 1 import android.app.Application;
 2 import android.graphics.Bitmap;
 3 import android.graphics.Color;
 4 import android.os.Environment;
 5 import com.netease.nimlib.sdk.NIMClient;
 6 import com.netease.nimlib.sdk.SDKOptions;
 7 import com.netease.nimlib.sdk.StatusBarNotificationConfig;
 8 import com.netease.nimlib.sdk.auth.LoginInfo;
 9 import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
10 import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
11 import com.netease.nimlib.sdk.uinfo.model.UserInfo;
12 
13 public class MyApp extends Application{
14     @Override
15     public void onCreate() {
16         super.onCreate();
17         NIMClient.init(this, loginInfo(), options());
18 
19     }
20     private SDKOptions options() {
21         SDKOptions options = new SDKOptions();
22 
23         // 若是將新消息通知提醒託管給 SDK 完成,須要添加如下配置。不然無需設置。
24         StatusBarNotificationConfig config = new StatusBarNotificationConfig();
25         // 呼吸燈配置
26         config.ledARGB = Color.GREEN;
27         config.ledOnMs = 1000;
28         config.ledOffMs = 1500;
29         // 通知鈴聲的uri字符串
30         config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg";
31         options.statusBarNotificationConfig = config;
32 
33         // 配置保存圖片,文件,log 等數據的目錄
34         // 若是 options 中沒有設置這個值,SDK 會使用下面代碼示例中的位置做爲 SDK 的數據目錄。
35         // 該目錄目前包含 log, file, image, audio, video, thumb 這6個目錄。
36         // 若是第三方 APP 須要緩存清理功能, 清理這個目錄下面個子目錄的內容便可。
37         String sdkPath = Environment.getExternalStorageDirectory() + "/" + getPackageName() + "/nim";
38         options.sdkStorageRootPath = sdkPath;
39 
40         // 配置是否須要預下載附件縮略圖,默認爲 true
41         options.preloadAttach = true;
42 
43         // 配置附件縮略圖的尺寸大小。表示向服務器請求縮略圖文件的大小
44         // 該值通常應根據屏幕尺寸來肯定, 默認值爲 Screen.width / 2
45         options.thumbnailSize = 480 / 2;
46 
47         // 用戶資料提供者, 目前主要用於提供用戶資料,用於新消息通知欄中顯示消息來源的頭像和暱稱
48         options.userInfoProvider = new UserInfoProvider() {
49             @Override
50             public UserInfo getUserInfo(String account) {
51                 return null;
52             }
53 
54 
55             public int getDefaultIconResId() {
56                 return R.mipmap.ic_launcher;
57             }
58 
59 
60             public Bitmap getTeamIcon(String tid) {
61                 return null;
62             }
63 
64 
65             public Bitmap getAvatarForMessageNotifier(String account) {
66                 return null;
67             }
68 
69             @Override
70             public String getDisplayNameForMessageNotifier(String account, String sessionId,
71                                                            SessionTypeEnum sessionType) {
72                 return null;
73             }
74 
75             @Override
76             public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionTypeEnum, String s) {
77                 return null;
78             }
79         };
80         return options;
81     }
82     // 若是已經存在用戶登陸信息,返回LoginInfo,不然返回null便可
83     private LoginInfo loginInfo() {
84         return null;
85     }
86 
87 
88 }

登陸通信的佈局網絡

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     xmlns:app="http://schemas.android.com/apk/res-auto"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     tools:context="lipengfei.xunxin.MainActivity">
 9 
10     <EditText
11         android:id="@+id/et_id"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:hint="請輸入帳號"
15         android:layout_margin="10dp"/>
16     <EditText
17         android:id="@+id/et_pass"
18         android:layout_width="match_parent"
19         android:layout_height="wrap_content"
20         android:hint="請輸入密碼"
21         android:layout_margin="10dp"
22         android:layout_below="@id/et_id"/>
23 
24     <LinearLayout
25         android:layout_width="match_parent"
26         android:layout_height="wrap_content"
27         android:orientation="horizontal"
28         android:layout_below="@id/et_pass">
29         <Button
30             android:id="@+id/btn1"
31             android:layout_width="0dp"
32             android:layout_height="wrap_content"
33             android:layout_weight="1"
34             android:text="登陸"/>
35         <Button
36             android:layout_width="0dp"
37             android:layout_height="wrap_content"
38             android:layout_weight="1"
39             android:text="註冊"/>
40     </LinearLayout>
41 
42 </RelativeLayout>

登陸通信的代碼實現session

 1 import android.content.Intent;
 2 import android.os.Bundle;
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.widget.Button;
 5 import android.widget.EditText;
 6 import android.widget.Toast;
 7 import com.netease.nimlib.sdk.NIMClient;
 8 import com.netease.nimlib.sdk.RequestCallback;
 9 import com.netease.nimlib.sdk.auth.AuthService;
10 import com.netease.nimlib.sdk.auth.LoginInfo;
11 import butterknife.BindView;
12 import butterknife.ButterKnife;
13 import butterknife.OnClick;
14 
15 public class MainActivity extends AppCompatActivity {
16 
17     @BindView(R.id.et_id)
18     EditText etId;
19     @BindView(R.id.et_pass)
20     EditText etPass;
21     @BindView(R.id.btn1)
22     Button btn1;
23 
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         ButterKnife.bind(this);
29     }
30 
31     @OnClick(R.id.btn1)
32     public void onViewClicked() {
33         LoginInfo info=new LoginInfo(etId.getText().toString(),etPass.getText().toString());
34         RequestCallback<LoginInfo> callback=new RequestCallback<LoginInfo>() {
35             @Override
36             public void onSuccess(LoginInfo loginInfo) {
37                 Toast.makeText(MainActivity.this, "登陸成功!!!", Toast.LENGTH_SHORT).show();
38                 startActivity(new Intent(MainActivity.this,Main2Activity.class));
39                 finish();
40             }
41 
42             @Override
43             public void onFailed(int i) {
44                 Toast.makeText(MainActivity.this, "登陸失敗!!!", Toast.LENGTH_SHORT).show();
45             }
46 
47             @Override
48             public void onException(Throwable throwable) {
49 
50             }
51         };
52         NIMClient.getService(AuthService.class).login(info).setCallback(callback);
53     }
54 }

單人聊天佈局app

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:orientation="vertical"
 8     tools:context="lipengfei.xunxin.Main2Activity">
 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>

單人聊天代碼實現ide

  1 import android.content.Intent;
  2 import android.os.Bundle;
  3 import android.support.v7.app.AppCompatActivity;
  4 import android.view.View;
  5 import android.widget.Button;
  6 import android.widget.EditText;
  7 import android.widget.TextView;
  8 import com.netease.nimlib.sdk.NIMClient;
  9 import com.netease.nimlib.sdk.Observer;
 10 import com.netease.nimlib.sdk.auth.AuthService;
 11 import com.netease.nimlib.sdk.msg.MessageBuilder;
 12 import com.netease.nimlib.sdk.msg.MsgService;
 13 import com.netease.nimlib.sdk.msg.MsgServiceObserve;
 14 import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
 15 import com.netease.nimlib.sdk.msg.model.IMMessage;
 16 
 17 import java.util.List;
 18 
 19 import butterknife.BindView;
 20 import butterknife.ButterKnife;
 21 import butterknife.OnClick;
 22 
 23 public class Main2Activity extends AppCompatActivity {
 24     private String account="z000002";
 25     private Observer<List<IMMessage>> observer;
 26     @BindView(R.id.tv_recivetv_in)
 27     TextView tvRecivetvIn;
 28     @BindView(R.id.tv_send_out)
 29     TextView tvSendOut;
 30     @BindView(R.id.et_input)
 31     EditText etInput;
 32     @BindView(R.id.btn_select_people)
 33     Button btnSelectPeople;
 34     @BindView(R.id.btn_send)
 35     Button btnSend;
 36     @BindView(R.id.btn_out)
 37     Button btnOut;
 38 
 39     @Override
 40     protected void onCreate(Bundle savedInstanceState) {
 41         super.onCreate(savedInstanceState);
 42         setContentView(R.layout.activity_main2);
 43         ButterKnife.bind(this);
 44         //註冊消息觀察者
 45         registerObserver();
 46     }
 47 
 48     private void registerObserver() {
 49         observer = new Observer<List<IMMessage>>() {
 50 
 51             @Override
 52 
 53 
 54             public void onEvent(List<IMMessage> imMessages) {
 55                 IMMessage message = imMessages.get(0);
 56                 String content = message.getContent();
 57                 String nick = message.getFromNick();
 58                 tvRecivetvIn.setText(nick+"--->"+content);
 59                 account=message.getFromAccount();
 60             }
 61         };
 62         NIMClient.getService(MsgServiceObserve.class)
 63                 .observeReceiveMessage(observer,true);
 64     }
 65 
 66     @OnClick({R.id.btn_select_people, R.id.btn_send, R.id.btn_out})
 67     public void onViewClicked(View view) {
 68         switch (view.getId()) {
 69             case R.id.btn_select_people://選擇聯繫人
 70 
 71                 break;
 72             case R.id.btn_send://發送按鈕
 73                 sendMessage();
 74                 break;
 75             case R.id.btn_out://退出登陸
 76                 loginOut();
 77                 break;
 78         }
 79     }
 80 
 81     private void loginOut() {
 82         NIMClient.getService(AuthService.class).logout();
 83         finish();
 84         startActivity(new Intent(Main2Activity.this,MainActivity.class));
 85     }
 86 
 87     private void sendMessage() {
 88         String text=etInput.getText().toString();
 89         IMMessage imMessage= MessageBuilder.createTextMessage(account, SessionTypeEnum.P2P,text);
 90         NIMClient.getService(MsgService.class).sendMessage(imMessage,false);
 91         tvSendOut.setText(text);
 92         etInput.setText("");
 93     }
 94 
 95     @Override
 96     protected void onDestroy() {
 97         super.onDestroy();
 98         NIMClient.getService(MsgServiceObserve.class)
 99                 .observeReceiveMessage(observer,false);
100     }
101 }
相關文章
相關標籤/搜索