Netease Yunxin SDK にアクセスするときに Unity で発生したいくつかの問題と経験を記録します。

前に書いてあります: 私はプログラムの初心者です。上手すぎるために多くの問題が発生する可能性があります。これは単なる個人的な記録です。より良い解決策を持っている偉い人がいれば、私を助けたいと思っています。

1.Unityがクラッシュする

例外をキャッチしなかったためかもしれませんが、Yunxin SDK が初期化された後、Unity がエラーを報告するなどの問題によりプログラムが正常に終了しない限り、Unity は直接フリーズします。

2. SDKを使用する際の注意点は何ですか?

SDKが提供するインターフェースはすべて非同期インターフェースです 実行結果はコールバック関数で受け取ります コールバック関数でUIオブジェクトを直接操作することはできません 結果はupdate関数で保存・更新するか、その他の方法で更新できます。(この機能を実装するために、デモでは Loom クラスが提供されています。)

3. ネットワークメッセージの開封に関する問題

Yunxin SDK のネットワーク メッセージの基本クラスは NIMIMMessage であり、NIMAudioMessage、NIMTextMessage、NIMImageMes​​sage、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 サーバーにリクエストを正常に送信できます。

会社はインスタント メッセージング製品を変更する必要があるため、未完成です。そのため、この記事は一時的に終了しました。今後も時間があれば、引き続き更新および改善される予定です。

おすすめ

転載: blog.csdn.net/a525324105/article/details/106518085