前に書いてあります: 私はプログラムの初心者です。上手すぎるために多くの問題が発生する可能性があります。これは単なる個人的な記録です。より良い解決策を持っている偉い人がいれば、私を助けたいと思っています。
1.Unityがクラッシュする
例外をキャッチしなかったためかもしれませんが、Yunxin SDK が初期化された後、Unity がエラーを報告するなどの問題によりプログラムが正常に終了しない限り、Unity は直接フリーズします。
2. SDKを使用する際の注意点は何ですか?
SDKが提供するインターフェースはすべて非同期インターフェースです 実行結果はコールバック関数で受け取ります コールバック関数でUIオブジェクトを直接操作することはできません 結果はupdate関数で保存・更新するか、その他の方法で更新できます。(この機能を実装するために、デモでは Loom クラスが提供されています。)
3. ネットワークメッセージの開封に関する問題
Yunxin SDK のネットワーク メッセージの基本クラスは NIMIMMessage であり、NIMAudioMessage、NIMTextMessage、NIMImageMessage、NIMTipMessage などの他のタイプのネットワーク メッセージは基本的に NIMIMMessage から派生します。ただし、メッセージによって受け入れられるコールバック パラメーターで返されるのは、NIMIMMessage タイプのオブジェクトです。
// 消息接受的回调
public void OnMessageReceived( object sender, NIMReceiveMessageEventArgs args )
// 这是消息回调中,回调回来的参数 NIMReceiveMessageEventArgs 类的定义。
public class NIMReceiveMessageEventArgs : EventArgs
{
public NIMReceiveMessageEventArgs(NIMReceivedMessage msg)
{
Message = msg;
}
public NIMReceivedMessage Message {
get; set; }
}
// 这是 NIMReceivedMessage 类的定义
public class NIMReceivedMessage : NimJsonObject<NIMReceivedMessage>
{
internal const string MessageContentPath = "content";
...
[JsonProperty(MessageContentPath)]
public NIMIMMessage MessageContent {
get; set; }
...
// 安卓工程 manifests 权限
<!-- Enable internet for app!!!. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Getting the state of internet for app!!!. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- write or read user data file for app!!!. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
4. Androidの権限取得問題
実際のデバイスのテストのために Android プロジェクトに初めてパッケージ化されたとき、SDK の初期化時に、create_path を作成できないことを示すエラーが報告されました。そこでテストマシンを変更したところ、正常に初期化できることが分かりました。次に、権限の取得の問題を確認します。
5. Android マニフェストの落とし穴
正常来说 Unity 导出安卓工程后,工程中的 manifests.xml 中 作为应用程序启动入口的 Activity 应该是 Unity 生成的 UnityPlayerActivity,然而接入了云信SDK后的 导出的安卓工程中的 manifests 应该是修改了原本 Unity 生成的
// 以下是接入云信SDK后的安卓工程的 manifests.xml 中活动的声明
<activity
// 主要是 name 这里的区别
**android:name="com.netease.nimlib.MainActivity"**
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:hardwareAccelerated="false"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="fullSensor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik"
android:value="false" />
</activity>
<activity
android:name="com.netease.nimlib.MainActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="fullSensor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik"
android:value="false" />
</activity>
6. オーディオパスを録音し、ローカルオーディオパスを送信します
I/Unity: 音频信息:StopCapture rescode:200
file_path:/sdcard/com.netease.nim_unity_android_demo/NIM/audio/181366001.aac
file_ext:aac
上記は録音完了後に入力される音声情報の一部です。file_path はオーディオのパスです。
//如果是发送本地文件,请给LocalFilePath赋值
msg.LocalFilePath="c:\\audio.aac";
上の図に示すように、オーディオ ネットワーク メッセージを送信するには、ファイルの絶対パスが必要です。具体的な理由としては、Unity が「/」のファイル パスを認識できないことが考えられます。
7. メッセージ内の添付ファイルのローカル パス
このインターフェイスは Unity 統合ドキュメントには記載されていないため、この SDK に初めて接続し、最初に Unity に接続する場合、添付ファイルがどこにダウンロードされるか分からない可能性があります。
/// <summary>
/// 从消息的中获取附件(图片、语音、视频等)的本地路径
/// </summary>
/// <param name="msg">消息对象</param>
/// <returns>消息如果有附件,不管是否已下载,返回附件的本地路径;消息如果没有附件,返回空字符串""</returns>
public static string GetAttachmentPathFromMsg(NIMIMMessage msg)
{
var jsonMsg = msg.Serialize();
var ptr = TalkNativeMethods.nim_talk_get_attachment_path_from_msg(jsonMsg);
NimUtility.Utf8StringMarshaler marshaler = new NimUtility.Utf8StringMarshaler();
var path = marshaler.MarshalNativeToManaged(ptr) as string;
GlobalAPI.FreeBuffer(ptr);
return path;
}
8. YunxinサーバーAPIの問題
チャット ルームの作成には、Yunxin サーバーの API を呼び出す必要があります。Yunxin サーバーは Http Post リクエストのみを受け入れます。Yunxin が提供するサーバー側の API 呼び出しデモのサンプルをダウンロードしました。C# デモでは次のような記述ができないことがわかりました。 Add パラメータの呼び出し方法、Java 版のみ。そこで、プロジェクトで参照されているサードパーティ ツールである BestHttp を使用しました。これで、Yunxin サーバーにリクエストを正常に送信できます。
会社はインスタント メッセージング製品を変更する必要があるため、未完成です。そのため、この記事は一時的に終了しました。今後も時間があれば、引き続き更新および改善される予定です。