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