バックグラウンド
「近くの人」、「対面のグループ構築」、「緊密なポイントツーポイントのローカルチャット」...これらの一般的な機能は、主要なソーシャルソフトウェアに表示されます。しかし、通常の状況では、「近くの人」は基本的に数百メートルまたは数キロ離れた人しか見つけることができません。この距離を狭めて数メートル以内の人に挨拶するにはどうすればよいですか?「対面のグループ構築」はどのようにしてあなたの周りの人々を正確に発見することができますか?クラウドサービスを経由せずに、友達と直接通信したりチャットしたりするにはどうすればよいですか?近くのサービスがあなたのためにそれをすることができます!以下に、より便利なソーシャルチャットアプリケーションの作成に役立つNearbyService統合チュートリアルの詳細な説明を示します。
アプリケーションシナリオの紹介
これは、Nearby Serviceを統合したサンプルアプリケーションです。このアプリケーションは、Nearby Serviceを使用して近くの人を見つけることができ、この機能に基づいて、対面グループ構築、グループチャット、プライベートチャット、チャット履歴の移行などの機能を実現できます。
- 近所の人
数メートル近くの人を正確に見つけることができ、会議室、展示ホール、バー、コーヒーショップなどの同じ部屋で友達を見つけることをユーザーにサポートします。
-
面と向かって
近くのサービスを使用してグループを作成します。グループ作成アクションは端側でのみ完了できます。場所は正確で、同じ場所にいる人だけがグループに参加できます。
- 自由に話す
近くのサービスを使用すると、近距離にいる友達がいなくてもグループチャットを実現できます。新しい友達は、範囲に近づくと自動的にグループに参加でき、対応する範囲を離れると自動的に終了できます。
- プライベートチャット
近くのサービスを使用して、近距離でのポイントツーポイントチャットを実現します。通信は2台間でのみ行われ、データはクラウド上で暗号化されないため、情報漏えいの心配がなく、高速鉄道や地下鉄など信号の弱い場所でも通信が可能です。
- チャット履歴を移行する
それだけでなく、NearbyServiceは強力なファイル転送機能も提供します。ユーザーがチャットレコードを移行する必要のある複数のデバイスを持っている場合、Nearby Serviceの通信インターフェイスを使用して、高速でトラフィックのないデータ移行を実現できます。
ツールの準備
-
2台以上のAndroidフォン
- 開発ツールAndroidStudio(3.X以降)
サンプルアプリケーションを作成する
-
サンプルソースコードをAndroidStudioにインポートします。
-
近隣サービスの開発を参照し、Huaweiアプリケーション市場でアプリケーションを作成する準備をしてください。注:「agconnect-services.json」ファイルをダウンロードし、指示を参照して署名付き証明書を生成し、app /ディレクトリに配置する必要があります。
- adbコマンドを使用して、生成されたapkファイルをテスト電話にインストールします。
キーコード
サンプルアプリケーションで使用されるインターフェイスについては、公式ドキュメント「NearbyServiceGuides」で詳しく説明されています。
このサンプルアプリケーションはMVPモードで構築されています。ソースコードを表示する場合は、コードパス(com \ huawei \ hms \ nearby \ im)に従って対応するクラスを見つけてください。
1.近くの人
以下のコードに示すように、NearbyPeoplePresenterクラスは、初期化時にビューオブジェクトを渡す必要があります。NeighborhoodPeoplePresenter.findNearbyPeople()を呼び出して近くの人を見つけるときは、ビューインターフェイスを呼び出して後続のアクションを実行します。
次の手順のINearbyPeopleViewとxxxViewは、一連のインターフェイスです。これらの特定の実装は、対応するActivityオブジェクトです。コードパスは、com \ huawei \ hms \ nearby \ im \ ui \ adapterです。
public NearbyPeoplePresenter(Context mContext, INearbyPeopleView view) {
super(mContext, view);
nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {
@Override
public void onMessageFound(MessageBean messageBean) {
// notify view when found someone
view.onMemberChanged(false,messageBean);
}
@Override
public void onMessageLost(MessageBean messageBean) {
view.onMemberChanged(true,messageBean);
}
@Override
public void onMsgSendResult(boolean isSucceed, MessageBean item) {
view.onLoginResult(isSucceed,item);
if (!isSucceed) {
handler.postDelayed(() -> findNearbyPeople(),DURATION_RE_LOGIN);
}
}
});
handler = new Handler(Looper.getMainLooper());
}
public void findNearbyPeople() {
nearbyAgent.broadcastMessage(null,MessageBean.ACTION_TAG_ONLINE);
nearbyAgent.startScan();
}
2.対面のグループ構築
「近くの人」と同様に、CreateGroupPresenter.javaクラスは、初期化時にビューオブジェクトを渡し、joinGroup(groupId)インターフェイスが呼び出されるとグループに参加し、ビューインターフェイスを呼び出すことで結果が返されます。
public CreateGroupPresenter(Context mContext, ICreateGroupView view) {
super(mContext, view);
nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {
@Override
public void onMessageFound(MessageBean messageBean) {
view.onPeopleFound(messageBean);
}
@Override
public void onMessageLost(MessageBean messageBean) {}
@Override
public void onMsgSendResult(boolean isSucceed, MessageBean item) {
view.onJoinGroupResult(isSucceed,item);
}
});
}
public void joinGroup(String groupId) {
nearbyAgent.broadcastMessage(groupId,"join group");
nearbyAgent.startScan(groupId);
}
3.自由に話す
クラスGroupChatPresenter.javaは、初期化中にビューオブジェクトを渡す必要があります。ビジネスコードはbroadcastMessage(groupId、sendContent)を呼び出して、指定されたグループにメッセージを送信します。groupIdが空の場合、グループは制限されません。findMessage(groupId)を呼び出して指定されたグループのメッセージを検索し、ビューインターフェイスを呼び出して検出後にメッセージを返します。
public GroupChatPresenter(Context mContext, IGroupChatView view) {
super(mContext, view);
nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {
@Override
public void onMessageFound(MessageBean messageBean) {
view.onMessageFound(messageBean);
}
@Override
public void onMessageLost(MessageBean messageBean) {
}
@Override
public void onMsgSendResult(boolean isSucceed, MessageBean item) {
view.onMsgSendResult(isSucceed,item);
}
});
}
public void broadcastMessage(String groupId, String sendContent) {
nearbyAgent.broadcastMessage(groupId,sendContent);
}
public void findMessage(String groupId) {
nearbyAgent.startScan(groupId);
}
4.プライベートチャット
プライベートチャットの実装は、上記のインターフェイスとは異なります。NearbyConnectionPresenter.javaクラスは、次の4つのインターフェイスを提供します。
-
findNearbyPeople():近くの人を探す
-
requestConnect():相手との接続を確立します
-
sendMessage(String msgStr):文字列タイプのメッセージを送信します
- sendFile(Uri uri):发送文件
/**
* scanAndBroadcasting to find nearby people
*/
public void findNearbyPeople(){
mDiscoveryEngine.startScan(serviceId, new ScanEndpointCallback() {
@Override
public void onFound(String endpointId, ScanEndpointInfo discoveryEndpointInfo) {
Log.d(TAG, "onFound -- Nearby Connection Demo app: onFound endpoint: " + endpointId);
view.onFound(endpointId,discoveryEndpointInfo);
}
@Override
public void onLost(String endpointId) {
Log.d(TAG, "onLost -- Nearby Connection Demo app: Lost endpoint: " + endpointId);
view.onLost(endpointId);
}
}, scanOption);
}
/**
* request to connect with remote device
* @param endpointId the endpointId of remote device
*/
public void requestConnect(String endpointId) {
Log.d(TAG, "requestConnect -- endpoint: " + endpointId);
mDiscoveryEngine.requestConnect(myNameStr, endpointId, connectCallback);
}
/**
* Send message ,Data.Type.BYTES
*/
public MessageBean sendMessage(String msgStr) {
MessageBean item = new MessageBean();
item.setUserName(CommonUtil.userName);
item.setMsg(msgStr);
item.setType(MessageBean.TYPE_SEND_TEXT);
item.setSendTime(DateUtils.getCurrentTime(DateUtils.FORMAT));
Data data = Data.fromBytes(gson.toJson(item).getBytes(Charset.defaultCharset()));
mTransferEngine.sendData(mEndpointId, data);
return item;
}
/**
* send file ,Data.Type.FILE
* @param uri
*/
public Data sendFile(Uri uri) {
Data filePayload;
try {
ParcelFileDescriptor pfd = mContext.getContentResolver().openFileDescriptor(uri, "r");
filePayload = Data.fromFile(pfd);
} catch (FileNotFoundException e) {
Log.e(Constants.TAG, "File not found, cause: ", e);
return null;
}
String fileName = FileUtil.getFileRealNameFromUri(mContext, uri);
String filenameMessage = filePayload.getId() + ":" + fileName;
Data filenameBytesPayload = Data.fromBytes(filenameMessage.getBytes(StandardCharsets.UTF_8));
mTransferEngine.sendData(mEndpointId, filenameBytesPayload);
mTransferEngine.sendData(mEndpointId, filePayload);
return filePayload;
}
詳細
-
Huawei Developer Allianceの公式ウェブサイト:
https://developer.huawei.com/consumer/en/hms/huawei-nearbyservice?ha_source=hms1 -
開発ガイダンス文書を入手する:
https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides-V5/introduction-0000001050040566-V5?ha_source=hms1 -
開発者のディスカッションに参加するには、Redditコミュニティにアクセスしてください。https://www.reddit.com/r/HuaweiDevelopers/
-
デモとサンプルコードをダウンロードするには、Githubにアクセスしてください。https://github.com/HMS-Core
- 統合の問題を解決するには、StackOverflowにアクセスしてください。
https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest
元のリンク:
https://developer.huawei.com/consumer/cn/forum/topic/0201415949786580446?fid=18&pid=0301415949786580897
作成者:pepper