NIMSDK-AOS  10.10.13
NIMClient.java
浏览该文件的文档.
1 package com.netease.nimlib.sdk;
2 
3 import android.app.Application;
4 import android.content.Context;
5 import android.text.TextUtils;
6 import android.util.Log;
7 import com.netease.nimlib.BuildConfig;
8 import com.netease.nimlib.SDKCache;
9 import com.netease.nimlib.SDKCacheUI;
10 import com.netease.nimlib.SDKState;
11 import com.netease.nimlib.SDKStateUI;
12 import com.netease.nimlib.abtest.ABTestConfigHelper;
13 import com.netease.nimlib.abtest.ABTestManager;
14 import com.netease.nimlib.apm.NimEventStrategyManager;
15 import com.netease.nimlib.biz.UICore;
16 import com.netease.nimlib.common.infra.Handlers;
17 import com.netease.nimlib.invocation.sync.base.APISyncHelper;
18 import com.netease.nimlib.log.NimLog;
19 import com.netease.nimlib.log.model.LogDesensitizationConfigHelper;
20 import com.netease.nimlib.plugin.interact.IChatRoomInteract;
21 import com.netease.nimlib.plugin.interact.PluginInteractManager;
22 import com.netease.nimlib.report.ApiTraceEventManager;
29 import com.netease.nimlib.util.storage.NimStorageUtil;
30 import com.netease.nimlib.v2.impl.V2NIMErrorImpl;
31 import java.util.Objects;
32 
33 /**
34  * SDK 核心接口类,用于初始化 SDK,获取各个服务能力接口,获取当前状态等功能。
35  */
36 public class NIMClient {
37 
38  public static final String TAG = "NIMClient";
39  /**
40  * [初始化 SDK 方式一] 在 {@link Application#onCreate()} 中调用该方法在应用启动时初始化 SDK。
41  *
42  * @par 使用场景:
43  * 属于常规初始化方式,适用绝大多数的初始化场景。
44  * @par 使用建议:
45  * 建议在 {@link Application#onCreate()} 中添加进程判断,SDK 的初始化方法必须在主进程中调用。不要把业务逻辑写入 core 进程,理论上,core 进程的 {@link Application#onCreate()}(或者 Application 的其他方法)只能做与 NIM SDK 相关的工作。IM 进程启动时也不要初始化第三方库。
46  * @par 调用时机:
47  * 请确保在调用其他 API 前先调用该方法初始化 SDK。
48  * @par 参数说明:
49  * <table>
50  * <tr>
51  * <th>参数名称</th>
52  * <th>描述</th>
53  * </tr>
54  * <tr>
55  * <td>context</td>
56  * <td>调用上下文</td>
57  * </tr>
58  * <tr>
59  * <td>info</td>
60  * <td>手动登录成功的用户信息。如 account(即 accid)和 token<ul><li>如果提供,SDK 在初始化的同时将自动调用登录接口进行登录(同时将打开用户相关的数据库)</li><li>如果当前还没有登录成功的用户,传入 null,后续可以手动调用 {@link com.netease.nimlib.sdk.auth.AuthService#login(LoginInfo)} 方法进行登录</li></ul></td>
61  * </tr>
62  * <tr>
63  * <td>options</td>
64  * <td>SDK 的其他初始化配置。如 App Key、第三方离线推送配置、是否开启会话已读多端同步等<ul><li>其中 App Key 如果已在集成 SDK 时(AndroidManifest.xml 中通过 meta-data 的方式设置)传入,则此处不需要再传入,<strong>否则必须传入</strong>,如果两处都设置了,取此处的值</li><li>如果传入为 null,则全部使用默认参数</li></ul></td>
65  * </tr>
66  * </table>
67  * @par 相关回调:
68  * {@link com.netease.nimlib.sdk.lifecycle.SdkLifecycleObserver#observeMainProcessInitCompleteResult(Observer, boolean)} :初始化进程回调
69  *
70  */
71  public static void init(Context context, LoginInfo info, SDKOptions options) {
72  final long startTime = System.currentTimeMillis();
73  if (LogDesensitizationConfigHelper.printToLogcat(options)) {
74  Log.i(TAG, "NIMClient init");
75  }
76  SDKCache.config(context, info, options);
77 
78  // 老的初始化接口,需要判断进程
79  if (NIMUtil.isMainProcess(context)) {
80  SDKState.setProcessTag(2);
81  SDKCacheUI.initServiceManager();
82 
83  if (SDKCache.getOptions().asyncInitSDK) {
84  asyncInitUI(startTime, "init", "asyncInitSDK in init");
85  } else {
86  SDKCache.initUI();
87  Handlers.sharedInstance().newMiscHandler().post(() -> {
88  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime,"NIMClient","init");
89  });
90  }
91  }
92  }
93 
94  /**
95  * [初始化 SDK 方式二] 在 {@link Application#onCreate()} 中配置 SDK(仅仅是配置,不影响性能),具体可配置的参数同 {@link NIMClient#init(Context, LoginInfo, SDKOptions)}。
96  *
97  * @par 使用场景:
98  * 适用于需要用户授权隐私信息采集的业务场景。与常规初始化 SDK 方式相比,该方式耗时更少,且更适配弱 IM 场景(应用仅需在其部分业务中使用 IM 能力(不需要在应用启动时就做 IM 自动登录),且并不需要保证消息、通知和数据的实时性的场景)。
99  * @par 使用建议:
100  * 该初始化方式一般不再需要做进程判断。
101  * @par 使用限制:
102  * 该接口适用的 SDK 版本:v5.0.0及以上。<br>
103  * {@link NIMClient#config(Context, LoginInfo, SDKOptions)} 方法必须与 {@link NIMClient#initSDK()} 方法搭配使用,在应用代码的任意位置初始化 SDK。
104  * @par 参数说明:
105  * <table>
106  * <tr>
107  * <th>参数名称</th>
108  * <th>描述</th>
109  * </tr>
110  * <tr>
111  * <td>context</td>
112  * <td>调用上下文</td>
113  * </tr>
114  * <tr>
115  * <td>info</td>
116  * <td>手动登录成功的用户信息。如 account(即 accid)和 token<ul><li>如果提供,SDK 在初始化的同时将自动调用登录接口进行登录(同时将打开用户相关的数据库)</li><li>如果当前还没有登录成功的用户,传入 null,后续可以手动调用 {@link com.netease.nimlib.sdk.auth.AuthService#login(LoginInfo)} 方法进行登录</li></ul></td>
117  * </tr>
118  * <tr>
119  * <td>options</td>
120  * <td>SDK 的其他初始化配置。如 App Key、第三方离线推送配置、是否开启会话已读多端同步等<ul><li>其中 App Key 如果已在集成 SDK 时(AndroidManifest.xml 中通过 meta-data 的方式设置)传入,则此处不需要再传入,<strong>否则必须传入</strong>,如果两处都设置了,取此处的值</li><li>如果传入为 null,则全部使用默认参数</li><li>可通过 {@link SDKOptions#asyncInitSDK} 参数配置进行同步/异步初始化</li><li>可通过 {@link SDKOptions#reducedIM} 参数实现支持弱 IM 模式,延迟加载 push 进程服务等<strong>(非弱 IM 场景慎用)</strong></li></ul></td>
121  * </tr>
122  * </table>
123  *
124  */
125  public static void config(Context context, LoginInfo info, SDKOptions options) {
126  final long startTime = System.currentTimeMillis();
127  if (LogDesensitizationConfigHelper.printToLogcat(options)) {
128  Log.i(TAG, "NIMClient config");
129  }
130  SDKCache.config(context, info, options);
131 
132  //config时马上设置主进程标志位,防止LocalAgent构造时return导致空指针
133  boolean isMainProcess = NIMUtil.isMainProcessPure(context) > 0;
134  if (isMainProcess) {
135  SDKState.setProcessTag(2);
136  Handlers.sharedInstance().newMiscHandler().post(() -> {
137  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime,"NIMClient","config");
138  });
139  }
140 
141  if (isMainProcess && SDKCache.isSingleProcessMode()
142  && ABTestConfigHelper.getUIConfigMode(context, options) == 1) {
143  NimLog.ui("pre-create UICore in config, uiConfigMode=1");
144  UICore.sharedInstance();
145  }
146  }
147 
148  /**
149  * [初始化 SDK 方式二] 在 UI 进程主线程上按需初始化 SDK(不放在 {@link Application#onCreate()} 中初始化)。与 {@link NIMClient#config(Context, LoginInfo, SDKOptions)} 方法搭配使用。
150  *
151  * @par 使用场景:
152  * 适用于需要用户授权隐私信息采集的业务场景。与常规初始化 SDK 方式相比,该方式耗时更少,且更适配弱 IM 场景(应用仅需在其部分业务中使用 IM 能力(不需要在应用启动时就做 IM 自动登录),且并不需要保证消息、通知和数据的实时性的场景)。
153  * @par 使用建议:
154  * 该初始化方式一般不再需要做进程判断。
155  * @par 使用限制:
156  * 该接口适用的 SDK 版本:v5.0.0及以上。<br>
157  * 该方法需要与 {@link NIMClient#config(Context, LoginInfo, SDKOptions)} 方法搭配使用,即先在 Application#onCreate 中调用 config 方法,然后在应用代码的任意位置调用 {@link NIMClient#initSDK()} 方法初始化 SDK。
158  *
159  */
160  public static void initSDK() {
161  final long startTime = System.currentTimeMillis();
162  if (LogDesensitizationConfigHelper.printToLogcat()) {
163  Log.i(TAG, "NIMClient initSDK");
164  }
165  SDKCacheUI.initServiceManager();
166 
167  if (SDKCache.getOptions().asyncInitSDK) {
168  asyncInitUI(startTime, "initSDK", "asyncInitSDK in initSDK");
169  } else {
170  SDKCache.initUI();
171  if (NIMUtil.isMainProcess(SDKCache.getContext())) {
172  Handlers.sharedInstance().newMiscHandler().post(() -> {
173  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime,"NIMClient","initSDK");
174  });
175  }
176  }
177 
178  }
179 
180  /**
181  * [初始化 SDK 方式三] 在 UI 进程主线程上按需初始化 SDK(不一定放在 {@link Application#onCreate()} 中初始化)。
182  *
183  * @par 使用建议:
184  * 除特殊需求,不建议使用该方式进行初始化 SDK。
185  * @par 使用限制:
186  * 该接口适用的 SDK 版本:v 及以上。
187  * @par 参数说明:
188  * <table>
189  * <tr>
190  * <th>参数名称</th>
191  * <th>描述</th>
192  * </tr>
193  * <tr>
194  * <td>context</td>
195  * <td>调用上下文</td>
196  * </tr>
197  * <tr>
198  * <td>info</td>
199  * <td>手动登录成功的用户信息。如 account(即 accid)和 token<ul><li>如果提供,SDK 在初始化的同时将自动调用登录接口进行登录(同时将打开用户相关的数据库)</li><li>如果当前还没有登录成功的用户,传入 null,后续可以手动调用 {@link com.netease.nimlib.sdk.auth.AuthService#login(LoginInfo)} 方法进行登录</li></ul></td>
200  * </tr>
201  * <tr>
202  * <td>options</td>
203  * <td>SDK 的其他初始化配置。如 App Key、第三方离线推送配置、是否开启会话已读多端同步等<ul><li>其中 App Key 如果已在集成 SDK 时(AndroidManifest.xml 中通过 meta-data 的方式设置)传入,则此处不需要再传入,<strong>否则必须传入</strong>,如果两处都设置了,取此处的值</li><li>如果传入为 null,则全部使用默认参数</li><li>可通过 {@link SDKOptions#asyncInitSDK} 参数配置进行同步/异步初始化</li><li>可通过 {@link SDKOptions#reducedIM} 参数实现支持弱 IM 模式,延迟加载 push 进程服务等<strong>(非弱 IM 场景慎用)</strong></li></ul></td>
204  * </tr>
205  * </table>
206  *
207  */
208  public static void initDelay(Context context, LoginInfo info, SDKOptions options) {
209  final long startTime = System.currentTimeMillis();
210  if (LogDesensitizationConfigHelper.printToLogcat(options)) {
211  Log.i(TAG, "NIMClient initDelay");
212  }
213 
214  // 老的初始化接口,需要判断进程
215  if (NIMUtil.isMainProcess(context)) {
216  SDKState.setProcessTag(2);
217  SDKCache.config(context, info, options, true, true);
218  SDKCacheUI.initServiceManager();
219 
220  if (SDKCache.getOptions().asyncInitSDK) {
221  asyncInitUI(startTime, "initDelay", "asyncInitSDK in initDelay");
222  } else {
223  SDKCache.initUI();
224  Handlers.sharedInstance().newMiscHandler().post(() -> {
225  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime,"NIMClient","initDelay");
226  });
227  }
228  }
229  }
230 
231  private static void asyncInitUI(long startTime, String stage, String threadName) {
232  NimLog.ui("async initUI...");
233  SDKCacheUI.newCountDownLatch(1);
234 
235  new Thread(() -> {
236  try {
237  SDKCache.initUI();
238  if (NIMUtil.isMainProcess(SDKCache.getContext())) {
239  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime, "NIMClient", stage);
240  }
241  NimLog.ui("async initUI done!");
242  } catch (Throwable throwable) {
243  NimLog.e(TAG, "async initUI error", throwable);
244  SDKCacheUI.countDown();
245  }
246  }, threadName).start();
247  }
248 
249  public static void initV2(Context context, SDKOptions options) {
250  final long startTime = System.currentTimeMillis();
251  if (LogDesensitizationConfigHelper.printToLogcat(options)) {
252  Log.i(TAG, "NIMClient initV2");
253  }
254  if (NIMUtil.isMainProcess(context)){
255  SDKState.setProcessTag(2);
256  SDKCache.config(context, null, options, false, true, true);
257  SDKCache.initUI();
258  Handlers.sharedInstance().newMiscHandler().post(() -> {
259  ApiTraceEventManager.getInstance().recordPendingTrackEvent(startTime,"NIMClient","initV2");
260  });
261 
262  }
263  }
264 
265 
266  /**
267  * 获取云信各服务接口。
268  *
269  * @par 调用时机:
270  * 调用 NIM SDK 其他接口前,需要先调用该接口。
271  * @par 参数说明:
272  * <table>
273  * <tr>
274  * <th>参数名称</th>
275  * <th>描述</th>
276  * </tr>
277  * <tr>
278  * <td>clazz</td>
279  * <td>服务接口类型实例</td>
280  * </tr>
281  * <tr>
282  * <td><T></td>
283  * <td>服务接口类型</td>
284  * </tr>
285  * </table>
286  * @par 返回:
287  * 服务接口
288  *
289  */
290  public static <T> T getService(Class<T> clazz) {
291  return SDKCacheUI.getService(clazz);
292  }
293 
294  /**
295  * 在非 UI 线程中调用云信 SDK 异步 API,强制将异步调用转换为同步调用。
296  * @par 使用场景:
297  * 需要在没有 Looper 的非 UI 线程上同步调用云信 API,但是对应的接口云信没有同步版本,只有异步版本。例如,启动一个线程或者线程池处理云信 SDK 数据。
298  * @par 使用建议:
299  * 如果 SDK 提供了对应的同步API,请不要使用该方法强制转换一个异步 API。<br>
300  * 该方法将阻塞调用者线程,直到异步 API 有结果响应。因此,除特殊场景不建议使用!
301  * @par 使用限制:
302  * 不允许在 UI 线程上或者带 Looper 的非 UI 线程上使用该异步到同步的强制转换(不符合 Android规范)!否则结果会返回错误码 {@link ResponseCode#RES_API_SYNC_RUN_ON_LOOPER_THREAD_EXCEPTION}。
303  * @par 注意事项:
304  * 带 Looper 的非 UI 线程调用云信异步 API,会在调用线程执行回调(4.4.0 版本之前的 SDK 版本,会统一回调到 UI 线程上)。
305  * @par 参数说明:
306  * <table>
307  * <tr>
308  * <th>参数名称</th>
309  * <th>描述</th>
310  * </tr>
311  * <tr>
312  * <td>future</td>
313  * <td>异步 API 调用返回的回调</td>
314  * </tr>
315  * <tr>
316  * <td><T></td>
317  * <td>结果的数据类型</td>
318  * </tr>
319  * <tr>
320  * <td>time</td>
321  * <td>最大同步等待时间,单位毫秒,一般设置为 30000,超时后该方法直接返回错误,错误码参见 {@link ResponseCode#RES_API_SYNC_TIMEOUT}</td>
322  * </tr>
323  * </table>
324  * @par 返回:
325  * 在非 UI 线程上同步等待异步调用结果
326  *
327  */
328  public static <T> RequestResult<T> syncRequest(InvocationFuture<T> future, long time) {
329  return APISyncHelper.syncRequest(future, time);
330  }
331 
332  /**
333  * 在非 UI 线程调用云信 SDK 异步 API,强制将异步调用转换为同步调用。该接口已废弃,请使用 {@link NIMClient#syncRequest(InvocationFuture, long)} 接口。
334  * @par 参数说明:
335  * <table>
336  * <tr>
337  * <th>参数名称</th>
338  * <th>描述</th>
339  * </tr>
340  * <tr>
341  * <td>future</td>
342  * <td>异步 API 调用返回的回调</td>
343  * </tr>
344  * <tr>
345  * <td><T></td>
346  * <td>结果的数据类型</td>
347  * </tr>
348  * </table>
349  * @par 返回:
350  * 在非 UI 线程上同步等待异步调用结果
351  *
352  */
354  return APISyncHelper.syncRequest(future, 30 * 1000L);
355  }
356 
357  /**
358  * 获取最近一次 ABTest HTTP 请求返回的原始 body。
359  *
360  * @par 返回:
361  * ABTest HTTP 回调返回的原始 body;若尚未收到 ABTest HTTP 响应,返回 null。
362  */
363  public static String getABTestHttpRawBody() {
364  return ABTestManager.getInstance().getABTestHttpRawBody();
365  }
366 
367  /**
368  * 获取当前用户的 IM 账号(accid)。
369  * @par 返回:
370  * 当前用户的 IM 账号(accid)
371  */
372  public static String getCurrentAccount(){
373  String account = SDKCacheUI.getAccount();
374  if(account == null){
375  account = "";
376  }
377  return account;
378  }
379 
380  /**
381  * 获取当前应用的 AppKey。
382  * @par 返回:
383  * 当前应用的 AppKey
384  */
385  public static String getAppKey(){
386  try {
387  String appKey = SDKCache.getAppKey();
388  if(appKey == null)
389  {
390  return "";
391  }
392  return appKey;
393  } catch (Exception e) {
394  return "";
395  }
396  }
397 
398  /**
399  * 获取当前用户的状态。
400  *
401  * <p>该方法仅适用于 V1。V2 的登录状态与连接状态相互独立,请分别使用
402  * {@link com.netease.nimlib.sdk.v2.auth.V2NIMLoginService#getLoginStatus()} 和
403  * {@link com.netease.nimlib.sdk.v2.auth.V2NIMLoginService#getConnectStatus()} 获取。</p>
404  *
405  * @par 返回:
406  * 当前用户的状态 {@link StatusCode}
407  */
408  public static StatusCode getStatus() {
409  return SDKStateUI.getStatus();
410  }
411 
412  /**
413  * 获取SDK初始化选项
414  * @return SDKOptions
415  */
416  public static SDKOptions getSDKOptions(){
417  return SDKCache.safeGetOptions();
418  }
419 
420  /**
421  * 获取 SDK 当前的登录模式。
422  *
423  * @par 返回:
424  * 当前的登录模式 {@link ModeCode}包括以下三种模式:<ul><li>INIT:初始状态 </li><li>IM:IM 登录模式(可以登录聊天室,但需要保持 IM 和聊天室连接)</li><li>CHAT_ROOM_INDEPENDENT:聊天室独立登录模式(不需要 IM 连接)</li></ul>
425  */
426 
427  public static ModeCode getMode() {
428  return SDKStateUI.getMode();
429  }
430 
431  /**
432  * 通知栏消息提醒开关。
433  * @par 调用限制:
434  * 只有 {@link StatusBarNotificationConfig} 配置不为空时才有效。<br>
435  * SDKOptions.StatusBarNotificationConfig 默认为 null,即 SDK 不提供通知栏提醒功能,由客户 APP自行实现。因此如需启用通知栏消息提醒功能,需要先设置初始化参数 StatusBarNotificationConfig。
436  * @par 参数说明:
437  * on :开关,true 为开启,false 为关闭,默认开启
438  */
439  public static void toggleNotification(boolean on) {
440  SDKCacheUI.toggleNotification(on);
441  }
442 
443 
444  /**
445  * 撤回消息需要通知栏提醒的开关。
446  * @par 调用限制:
447  *只有 StatusBarNotificationConfig 配置不为空且通知栏消息提醒({@link NIMClient#toggleNotification(boolean)})开启时才有效。
448  * @par 参数说明:
449  * on :开关,true 为开启,false 为关闭,默认开启
450  *
451  */
452  public static void toggleRevokeMessageNotification(boolean on) {
453  SDKCacheUI.toggleRevokeMessageNotification(on);
454  }
455 
456  /**
457  * 更新通知栏消息提醒配置,包括是否需要振动提醒、是否需要响铃提醒等。
458  * @par 使用场景:
459  * 若未在初始化(SDKOptions.StatusBarNotificationConfig)时设置通知栏消息的配置项,或者初始化时设置了,但是需要修改其配置项,可调用该接口实现通知栏消息提醒配置的更新。
460  * @par 参数说明:
461  * config 通知栏消息提醒的配置项,包括响铃提醒、振动提醒、免打扰设置等
462  *
463  */
465  SDKCacheUI.updateStatusBarNotificationConfig(config);
466  }
467 
468  /**
469  * 更新系统文案。
470  * @par 使用场景:
471  * 当系统语言发生变化时,可以调用该接口更新文案配置,实现 SDK 对多语言的支持。也可以用于定制通知栏消息提醒的文案。
472  * @par 注意事项:
473  * 配置不能立即生效,所有文案均需要在下次使用时才会生效。
474  * @par 参数说明:
475  * strings SDK 中用到的文案字符串定义,目前仅状态栏消息提醒处使用。如果您没有提供自定义值,只使用默认值
476  */
477  public static void updateStrings(NimStrings strings) {
478  SDKCacheUI.updateStrings(strings);
479  }
480 
481  /**
482  * 获取 SDK 数据缓存目录路径。
483  * @par 调用时机:
484  * 建议在初始化 SDK 之后调用。
485  * @par 返回:
486  * SDK 数据缓存目录路径(包含子目录,如日志文件 log、消息中的文件 file、消息中的原图 image、消息中的音频 audio、消息中的原视频 video、图片/视频消息中的缩略图 thumb 等)
487  */
488  public static String getSdkStorageDirPath() {
489  return NimStorageUtil.getRootPath();
490  }
491 
492  /**
493  * 运行时获取当前 SDK 版本号。
494  * @par 返回:
495  * 当前 SDK 版本号,例如 "1.0.0"
496  */
497  public static String getSDKVersion() {
498  return BuildConfig.VERSION_NAME;
499  }
500 
501 
502  /**
503  * 更新 SDK NOS Token 场景配置。对于 SDK NOS Token,云信 SDK 有默认值 ,若用户不单独配置,则直接采用默认值。
504  * @par 默认值对应场景:
505  * <ul><li>NimNosSceneKeyConstant::NIM_DEFAULT_PROFILE:用户和群组资料(例如头像)的上传默认走该场景</li><li>NimNosSceneKeyConstant::NIM_DEFAULT_IM:私聊、群聊、聊天室发送图片、音频、视频、文件等动作默认走该场景</li><li>NimNosSceneKeyConstant::NIM_SYSTEM_NOS_SCENE:SDK 内部上传文件(例如日志)默认走该场景,并且对应的过期时间不允许修改</li></ul>
506  * 默认场景对应的默认过期时间为 NEVER_EXPIRE(永不过期,资源一直存在于服务器),用户可以修改默认场景(除 NIM_SYSTEM_NOS_SCENE 场景)的过期时间。<br>
507  * 同时用户可以新增自定义场景并指定对应的过期时间(sceneKey-> expireTimeByDay),目前最多增加 10 个场景。
508  * @par 使用场景:
509  * 如果用户发送消息或上传文件等动作,需要指定其他的场景(指定 NOS 服务网络),可以先新增自定义场景,后续只需要传入相应的 sceneKey 即可。
510  * @par 使用建议:
511  * 在配置时,强烈建议将相应的 sceneKey 常量化,以方便使用,具体请参考 {@link com.netease.nimlib.NimNosSceneKeyConstant}。
512  * @par 参数说明:
513  * config NOS Token 场景配置
514  * @par 相关接口:
515  * <ul><li>{@link NosTokenSceneConfig#appendCustomScene(String, int)}:增加自定义场景</li><li>{@link NosTokenSceneConfig#updateDefaultProfileSceneExpireTime(int)}:更新默认场景(NIM_DEFAULT_PROFILE)的过期时间</li><li>{@link NosTokenSceneConfig#updateDefaultIMSceneExpireTime(int)}:更新默认场景(NIM_DEFAULT_IM)的过期时间</li></ul>
516  *
517  */
519  SDKCacheUI.updateTokenSceneConfig(config);
520  }
521 
522  /**
523  * 更新获取设备信息的相关配置。包括配置是否获取产品型号、是否获取制造商信息、是否获取品牌信息,null 表示都可以获取,没有限制。
524  * @par 注意事项:
525  * 不获取设备信息可能会影响功能的使用,若需要设置为不获取设备信息,请联系云信技术支持。
526  * @par 参数说明:
527  * captureDeviceInfoConfig 设备信息获取配置,包括配置是否获取产品型号、是否获取制造商信息、是否获取品牌信息
528  */
529  public static void updateCaptureDeviceInfoOption(CaptureDeviceInfoConfig captureDeviceInfoConfig) {
530  SDKCacheUI.updateCaptureDeviceInfoOption(captureDeviceInfoConfig);
531  }
532 
533  /**
534  * 更新 SDK 的 AppKey
535  * 当IM处于未登录状态,且所有聊天室实例全部销毁,且appkey不为null或空串时更新成功,否则更新失败
536  * @param appKey
537  * @return V2NIMError 错误码, 错误码表示200成功,其他失败
538  */
539  public static V2NIMError updateAppKey(String appKey) {
540  if(!SDKCache.hasInited()){
541  NimLog.e(TAG,"IM is not in init state");
542  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_ILLEGAL_STATE.getCode(),"IM is not in init state");
543  }
544  if(TextUtils.isEmpty(appKey)){
545  NimLog.e(TAG,"appKey is empty");
546  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_INVALID_PARAMETER.getCode(),"appKey is empty");
547  }
548 
549  if(Objects.equals(appKey, SDKCache.getAppKey())){
550  NimLog.i(TAG,"appKey is same as last time,no need to update");
551  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_SUCCESS.getCode(),"");
552  }
553 
554  if(SDKCacheUI.getAuthInfo() != null || SDKStateUI.getStatus() != StatusCode.UNLOGIN){
555  NimLog.e(TAG,"IM is not in logout state");
556  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_ILLEGAL_STATE.getCode(),"IM is not in logout state");
557  }
558  IChatRoomInteract interact = PluginInteractManager.getInstance().getInteract(IChatRoomInteract.class);
559  if (interact != null) {
560  boolean result = interact.isV2ChatroomAllDestroy();
561  if (!result) {
562  NimLog.e(TAG,"V2NIMChatroomClient is not all destroy");
563  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_ILLEGAL_STATE.getCode(),"V2NIMChatroomClient is not all destroy");
564  }
565  }
566 
567  SDKCache.setAppKey(appKey);
568  //
569  Handlers.sharedInstance().newHandler().post(() -> {
570  ABTestManager.getInstance().loadAndPullABTest(SDKCache.getContext(),true);
571  NimEventStrategyManager.getInstance().reset();
572  });
573 
574  return new V2NIMErrorImpl(V2NIMErrorCode.V2NIM_ERROR_CODE_SUCCESS.getCode());
575  }
576 }
SDK中用到的字符串定义。可用于开发者定制显示文案,以及实现SDK对多语言的支持。 目前仅新消息状态栏提醒...
Definition: NimStrings.java:11
static void toggleNotification(boolean on)
通知栏消息提醒开关。
Definition: NIMClient.java:439
static int isMainProcessPure(Context context)
判断当前进程是否是主进程(纯净版本),不会有隐私不合规风险,但是不保证100判断正确 ...
Definition: NIMUtil.java:37
static String getABTestHttpRawBody()
获取最近一次 ABTest HTTP 请求返回的原始 body。
Definition: NIMClient.java:363
static String getSDKVersion()
运行时获取当前 SDK 版本号。
Definition: NIMClient.java:497
static void updateStrings(NimStrings strings)
更新系统文案。
Definition: NIMClient.java:477
static void config(Context context, LoginInfo info, SDKOptions options)
[初始化 SDK 方式二] 在 Application#onCreate() 中配置 SDK(仅仅是配置,不影响性能),具体可配置的参数...
Definition: NIMClient.java:125
云信API异步转同步调用结果
static boolean isMainProcess(Context context)
Definition: NIMUtil.java:96
用户当前状态码定义
Definition: StatusCode.java:6
SDK当前登录模式状态码定义
Definition: ModeCode.java:6
SDK 核心接口类,用于初始化 SDK,获取各个服务能力接口,获取当前状态等功能。
Definition: NIMClient.java:36
static String getSdkStorageDirPath()
获取 SDK 数据缓存目录路径。
Definition: NIMClient.java:488
static< T > RequestResult< T > syncRequest(InvocationFuture< T > future, long time)
在非 UI 线程中调用云信 SDK 异步 API,强制将异步调用转换为同步调用。
Definition: NIMClient.java:328
static< T > RequestResult< T > syncRequest(InvocationFuture< T > future)
在非 UI 线程调用云信 SDK 异步 API,强制将异步调用转换为同步调用。该接口已废弃,请使用 NIMClient#syncR...
Definition: NIMClient.java:353
static String getAppKey()
获取当前应用的 AppKey。
Definition: NIMClient.java:385
static void initSDK()
[初始化 SDK 方式二] 在 UI 进程主线程上按需初始化 SDK(不放在 Application#onCreate() 中初始化)。与 NI...
Definition: NIMClient.java:160
static StatusCode getStatus()
获取当前用户的状态。
Definition: NIMClient.java:408
static V2NIMError updateAppKey(String appKey)
更新 SDK 的 AppKey 当IM处于未登录状态,且所有聊天室实例全部销毁,且appkey不为null或空串时更新成功,否...
Definition: NIMClient.java:539
用户登录认证信息。
Definition: LoginInfo.java:23
static SDKOptions getSDKOptions()
获取SDK初始化选项
Definition: NIMClient.java:416
static void toggleRevokeMessageNotification(boolean on)
撤回消息需要通知栏提醒的开关。
Definition: NIMClient.java:452
static void initDelay(Context context, LoginInfo info, SDKOptions options)
[初始化 SDK 方式三] 在 UI 进程主线程上按需初始化 SDK(不一定放在 Application#onCreate() 中初始化)。 ...
Definition: NIMClient.java:208
可自定义的 SDK 选项设置。
Definition: SDKOptions.java:21
static void updateCaptureDeviceInfoOption(CaptureDeviceInfoConfig captureDeviceInfoConfig)
更新获取设备信息的相关配置。包括配置是否获取产品型号、是否获取制造商信息、是否获取品牌信息,null 表示...
Definition: NIMClient.java:529
static void updateTokenSceneConfig(NosTokenSceneConfig config)
更新 SDK NOS Token 场景配置。对于 SDK NOS Token,云信 SDK 有默认值 ,若用户不单独配置,则直接采用默认...
Definition: NIMClient.java:518
static ModeCode getMode()
获取 SDK 当前的登录模式。
Definition: NIMClient.java:427
SDK nos token场景配置,不配置的话,走默认值,默认值只有以下3种场景:
static< T > T getService(Class< T > clazz)
获取云信各服务接口。
Definition: NIMClient.java:290
static void init(Context context, LoginInfo info, SDKOptions options)
[初始化 SDK 方式一] 在 Application#onCreate() 中调用该方法在应用启动时初始化 SDK。 ...
Definition: NIMClient.java:71
UNLOGIN
未登录/登录失败
Definition: StatusCode.java:16
static String getCurrentAccount()
获取当前用户的 IM 账号(accid)。
Definition: NIMClient.java:372
static void initV2(Context context, SDKOptions options)
Definition: NIMClient.java:249
static void updateStatusBarNotificationConfig(StatusBarNotificationConfig config)
更新通知栏消息提醒配置,包括是否需要振动提醒、是否需要响铃提醒等。
Definition: NIMClient.java:464