HarmonyOS サンプルの JavaDistributeAuthDemo 分散 ID 認証機能

HarmonyOS サンプルの JavaDistributeAuthDemo 分散 ID 認証機能

[[439852]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

1. はじめに

HarmonyOS に注目している人のほとんどは、HarmonyOS の機能についてある程度理解していると思います。公式サイトからは、「統一された OS、柔軟な展開」、「ハードウェア相互支援、リソース共有」、「ワンタイム開発、マルチ端末展開」といったいくつかの重要な抽象化がわかります。

今後数回にわたって、HarmonyOS の機能に関する理解をさらに深め、柔軟に適用することを目的として、HarmonyOS の機能を皆さんと一緒に学習し、実践するケースをいくつか紹介したいと思います。

今回は、分散ID認証の機能を通じて、一般的な通信方法について見ていきます。

共有コンテンツ:

  • デバイスを移行または連携する場合、利用可能なデバイスのリストを表示する必要があります。デバイスを個別に取得したり、リスト レイアウト ファイルを自分で定義したりしなくても、デバイス ウィンドウを表示する方法があります。
  • 分散 ID 認証および承認機能を実装する方法。

このケースは、公式コードラボの例である分散認証 (Java) から取得されています。この投稿は学習とコミュニケーションのために整理され、分析されています。

2. エフェクト表示


3. 環境を構築する

DevEco Studio をインストールします。詳細については、DevEco Studio のダウンロードを参照してください。

DevEco Studio 開発環境をセットアップします。 DevEco Studio 開発環境はネットワーク環境に依存する必要があります。ツールを正常に使用するには、ネットワークに接続する必要があります。次の 2 つの状況に応じて開発環境を構成できます。

インターネットに直接アクセスできる場合は、HarmonyOS SDK をダウンロードするだけで済みます。

ネットワークがインターネットに直接アクセスできず、プロキシ サーバー経由でアクセスする必要がある場合は、「開発環境の構成」を参照してください。

ソースコードをダウンロードしたら、DevEco Studio を使用してプロジェクトを開き、シミュレーターを実行します。

実際のデバイスで実行する場合は、「実際のデバイスでアプリケーションを実行する」を参照してください。

4. プロジェクト構造


5. コードの説明

5.1 ストリーミングデバイスのリストを表示する方法

この方法では、デバイスを別途取得する必要はなく、デバイス ウィンドウを表示するための対応するレイアウト ファイルを定義する必要もありません。

①ContinuationRegisterManagerでリダイレクト機能を登録し、機能に割り当てられた登録トークンを取得する

  1. /**
  2. * 登録および流通機能
  3. * 継続を登録する
  4. *
  5. * @param コンテキスト
  6. * @param デバイスコールバック
  7. * @param 利用可能なストリーミングデバイスを表示するかどうかを示します
  8. */
  9. パブリックvoid registerContinuation(AbilitySlice コンテキスト、DeviceCallback deviceCallback、boolean show) {
  10. LogUtils.info( "registerContinuation" );
  11. 継続レジスタマネージャnullの場合
  12. this.deviceCallback = デバイスコールバック;
  13. this.show = 表示;
  14. 継続レジスタマネージャー = context.getContinuationRegisterManager();
  15.  
  16. //サポートされているデバイスタイプ
  17. ExtraParams パラメータ = 新しい ExtraParams();
  18. String[] devTypes = 新しいString[]{ExtraParams.DEVICETYPE_SMART_PAD,
  19. 追加パラメータ.DEVICETYPE_SMART_WATCH、
  20. ExtraParams.DEVICETYPE_SMART_PHONE};
  21. パラメータを設定します。
  22.  
  23. //ContinuationRegisterManager でリダイレクト機能を登録し、機能に割り当てられた登録トークンを取得します。
  24. // IContinuationDeviceCallback を使用して、ユーザーが機能ジャンプ用のデバイスを選択した後のデバイス接続ステータスの変化を監視し、独自の処理ロジックを実装できます。
  25. 継続RegisterManager.register(context.getBundleName(), params, callback, requestCallback);
  26. }それ以外{
  27. if (表示) {
  28. // デバイスリストを表示する
  29. 継続デバイスを表示します。
  30. }
  31. }
  32. }

② 転送が完了した後、デバイス接続ステータス変更コールバックをリッスンするためのステータスコールバックが提供される。

  1. //フローが完了した後のステータス コールバックは、デバイスの接続ステータスの変化をリッスンするためのコールバックを提供します。
  2. プライベートIContinuationDeviceCallbackコールバック = 新しいIContinuationDeviceCallback() {
  3. @オーバーライド
  4. パブリックvoid onDeviceConnectDone(文字列デバイスID、文字列値) {
  5. LogUtils.info( "onDeviceConnectDone" );
  6.  
  7. //デバイスが接続された後、選択したデバイスのタスクをキューに送信します。これは、転送するデバイスをクリックするのと同じです。
  8. イベント ハンドラ eventHandler = 新しい EventHandler(EventRunner.getMainEventRunner());
  9. //タスクをイベント キューに送信します。
  10. イベントハンドラ.postTask(新しい実行可能() {
  11. @オーバーライド
  12. パブリックボイド実行(){
  13. デバイスコールバックnullの場合
  14. デバイスコールバック。onItemClick(デバイスID);
  15. }
  16. //指定された機能が正常に転送されたデバイスの接続ステータスを更新します。
  17. 継続レジスタマネージャ
  18. .updateConnectStatus(アビリティトークン、
  19. //接続ステータスを更新する必要があるデバイスの ID を示します。
  20. デバイスID、
  21. DeviceConnectState.IDLE.getState()、 null  
  22. );
  23. }
  24. });
  25. }
  26.  
  27. @オーバーライド
  28. パブリックvoid onDeviceDisconnectDone(String deviceId) {
  29. LogUtils.info( "デバイスの切断が完了したら" );
  30. }
  31. };

③転送要求のコールバックを完了し、転送可能なデバイスを表示する

  1. //ストリーミング要求のコールバックを完了し、ホップ タスク管理サービスの接続ステータスの変更をリッスンするためのコールバックを提供します。
  2. プライベートリクエストコールバック requestCallback = 新しいリクエストコールバック() {
  3. @オーバーライド
  4. パブリックvoid onResult( int結果) {
  5. 能力トークン = 結果;
  6. if (表示) {
  7. //転送可能なデバイスを表示
  8. 継続デバイスを表示します。
  9. }
  10. }
  11. };
  12.  
  13. /**
  14. * 譲渡可能なデバイスを表示
  15. * 続きを表示
  16. */
  17. プライベートvoid showContinuationDevice() {
  18. LogUtils.info( "継続の表示" );
  19.  
  20. ExtraParams extraParams = 新しい ExtraParams();
  21. extraParams.setDevType(新しいString[]{ExtraParams.DEVICETYPE_SMART_TV,
  22. 追加パラメータ.DEVICETYPE_SMART_PAD、
  23. 追加パラメータ.DEVICETYPE_SMART_WATCH、
  24. ExtraParams.DEVICETYPE_SMART_PHONE});
  25. extraParams.setDescription( "デバイスフローテスト" );
  26.  
  27. //転送可能なデバイスを表示
  28. 継続RegisterManager.showDeviceList(abilityToken, extraParams, null );
  29.  
  30. }

5.2 分散ID認証および認可機能の実装

理解を容易にするために、要求を送信するデバイスを認可要求デバイスと呼び、認可操作を実行するデバイスを認可デバイスと呼びます。

RegisterManager は、MainAbilitySlice によって実装されるカスタム CommonEvent インターフェースを定義します。したがって、RegisterManager は MainAbilitySlice と通信することができます。

RegisterManager は、ConstUtil.ORDER_CODE タイプのパブリック イベントへのサブスクリプションを完了し、このタイプのパブリック イベントを受信できるようになります。

認証と承認の完全なプロセス:

① 認可を要求するデバイスでは、RegisterManager がデバイスのフロー機能を登録する機能を提供し、デバイス接続完了のステータスコールバックで「デバイスをクリック」タスクを実行キューに送信します。

  1. //フローが完了した後のステータス コールバックは、デバイスの接続ステータスの変化をリッスンするためのコールバックを提供します。
  2. プライベートIContinuationDeviceCallbackコールバック = 新しいIContinuationDeviceCallback() {
  3. @オーバーライド
  4. パブリックvoid onDeviceConnectDone(文字列デバイスID、文字列値) {
  5. LogUtils.info( "onDeviceConnectDone" );
  6.  
  7. //デバイスが接続された後、選択したデバイスのタスクをキューに送信します。これは、転送するデバイスをクリックするのと同じです。
  8. イベント ハンドラ eventHandler = 新しい EventHandler(EventRunner.getMainEventRunner());
  9. //タスクをイベント キューに送信します。
  10. イベントハンドラ.postTask(新しい実行可能() {
  11. @オーバーライド
  12. パブリックボイド実行(){
  13. デバイスコールバックnullの場合
  14. デバイスコールバック。onItemClick(デバイスID);
  15. }
  16. //指定された機能が正常に転送されたデバイスの接続ステータスを更新します。
  17. 継続レジスタマネージャ
  18. .updateConnectStatus(アビリティトークン、
  19. //接続ステータスを更新する必要があるデバイスの ID を示します。
  20. デバイスID、
  21. DeviceConnectState.IDLE.getState()、 null  
  22. );
  23. }
  24. });
  25. }

MainAbilitySlice では、フロー機能の登録が完了した後、「デバイスをクリック」のコールバックで、リモート認可デバイスの AuthrRemoteSlice ページが開かれ、ConstUtil.DEVICE_ID と ConstUtil.ORDER_CODE (ConstUtil.START_ORDER) パラメータが渡されますが、このうち ConstUtil.START_ORDER は使用されません。

  1. /**
  2. * 登録コラボレーション機能
  3. *
  4. * @param 表示
  5. */
  6. プライベートvoidレジスタ継続(ブール値表示) {
  7. LogUtils.info( "registerContinuation" );
  8.  
  9. registerManager.registerContinuation(これ、
  10. 新しい RegisterManager.DeviceCallback() {
  11. @オーバーライド
  12. パブリックvoid onItemClick(文字列デバイスID) {
  13.  
  14. LogUtils.info( "onItemClick,デバイスID:" + デバイスID);
  15.  
  16. //リモート機能を起動する
  17. リモート機能を開始します(デバイスID)。
  18. }
  19. }、 見せる);
  20. }
  21.  
  22. /**
  23. * リモートFAを開始
  24. *
  25. * @param デバイスID
  26. */
  27. プライベートvoid startRemoteAbility(文字列デバイスID) {
  28. LogUtils.info( "リモートアビリティを開始" );
  29.  
  30. DialogUtil.showToast(getContext(), "リクエストが送信され、相手側の確認を待っています。" );
  31. //
  32. 文字列 localDeviceId = KvManagerFactory.getInstance().createKvManager()
  33. 新しい KvManagerConfig(this)).getLocalDeviceInfo().getId();
  34.  
  35. インテントのintent = 新しいIntent();
  36. 操作操作 =
  37. 新しい Intent.OperationBuilder()
  38. .withDeviceId(デバイスID)
  39. .withBundleName(バンドル名を取得())
  40. .withAbilityName(MainAbility.class.getName())
  41. // 承認されたデバイスの認証ページにルーティングします
  42. .withAction( MainAbility.ACTION )は、
  43. .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
  44. 。建てる();
  45. 操作をインテントに設定します。
  46. パラメータをintent.setParam(ConstUtil.DEVICE_ID, ローカルデバイスID);
  47. //リモートFAコマンドコードを開始
  48. パラメータを constUtil.ORDER_CODE に設定します。
  49. 開始アビリティ(インテント);
  50. }

② 承認されたデバイスのAuthrRemoteSliceページが開いた後、配布権限を要求した後に「許可」または「許可しない」をクリックすると、承認を要求しているデバイスのMainAbilityが再度開きます。

  1. プライベートvoid initViewData() {
  2. LogUtils.info( "initViewData" );
  3.  
  4. findComponentById(ResourceTable.Id_yes_btn).setClickedListener(コンポーネント -> {
  5. メッセージを送信します(AUTH_TYPE1);
  6. });
  7. findComponentById(ResourceTable.Id_no_btn).setClickedListener(コンポーネント -> {
  8. メッセージを送信します(AUTH_TYPE2);
  9. });
  10. }
  11.  
  12. プライベートvoid sendMessage( int型) {
  13. LogUtils.info( "sendMessage" );
  14.  
  15. //MainAbilityからHPermissionインスタンスを取得する
  16. HPermission hPermission = ((MainAbility) getAbility()).getPermission();
  17.  
  18. //ユーザーが分散権限を許可している場合は、設定ボタンが使用可能になります
  19. hPermission.requestPermissions(this, () -> {
  20. //ボタンが有効
  21. コンポーネントIDを検索します(ResourceTable.Id_yes_btn)。有効にするにはfalseに設定します
  22. コンポーネント ID を検索します (ResourceTable.Id_no_btn)。有効にするにはfalseに設定します
  23.  
  24. //リクエスト側のページを開く
  25. リモートアビリティを開始します(タイプ);
  26. });
  27. }
  28.  
  29. /**
  30. * 認可リクエスト側でMainAbilityを開く
  31. *
  32. * @param type 承認に同意するかどうか
  33. */
  34. プライベートvoid startRemoteAbility( int type) {
  35. LogUtils.info( "リモートアビリティを開始" );
  36.  
  37. DialogUtil.showToast(getContext(), type == AUTH_TYPE1 ? "ゲームのプレイを許可する" : "ゲームへのアクセスが拒否されました" );
  38. インテントのintent = 新しいIntent();
  39. 操作操作 =
  40. 新しい Intent.OperationBuilder()
  41. .withDeviceId(リモートデバイスId == null ? "" : リモートデバイスId)
  42. .withBundleName(バンドル名を取得())
  43. .withAbilityName(MainAbility.class.getName())
  44. .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
  45. 。建てる();
  46. インテントをsetOperation(操作);
  47.  
  48. //認証コード
  49. 意図を設定します。ORDER_CODE、タイプ。
  50. 開始アビリティ(インテント);
  51.  
  52. //現在のホストの能力を無効にする
  53. getUITaskDispatcher().delayDispatch(() ->terminateAbility(), DELAY);
  54. }

③ 認可をリクエストするデバイスでは、MainAbilityがシングルトンモード("launchType": "singleton")に設定され、インスタンス化されているため、リクエストはonNewIntent関数に入ります。

config.json

  1. {
  2. ...
  3. 「方向」 「未指定」
  4. 「表示」 : true
  5. 「名前」 : 「com.buty.javadistributedemo.MainAbility」
  6. "アイコン" : "$media:icon" ,
  7. "説明" : "$string:mainability_description" ,
  8. "ラベル" : "$string:entry_MainAbility" ,
  9. 「タイプ」 : 「ページ」
  10. 「起動タイプ」 : 「シングルトン」  
  11. }

onNewIntent 関数では、タイプ ConstUtil.ORDER_CODE のイベントが CommonEventManager を通じて公開されます。イベントは RegisterManager によって受信され、処理されます。どのように処理されますか?これは、RegisterManager.CommonEvent を介して RegisterManager.CommonEvent インターフェースを実装する MainAbilitySlice に渡され、最終的にピアデバイスの認証結果 (許可/不許可) が表示されます。

  1. /**
  2. * 能力はシングルトンモードに設定されています
  3. * 作成時にインスタンスがすでに存在する場合は、この関数をトリガーします
  4. *
  5. * @param 意図
  6. */
  7. @オーバーライド
  8. 保護されたvoid onNewIntent(インテントインテント) {
  9. LogUtils.info( "onNewIntent" );
  10. スーパーの onNewIntent(インテント);
  11. // 許可されますか?
  12. intコード = 意図.getIntParam(ConstUtil.ORDER_CODE, 0);
  13. //
  14. 文字列デバイスID = intent.getStringParam(ConstUtil.DEVICE_ID);
  15. 共通イベントを送信します(コード、デバイスID)。
  16. }

MainAbilitySliceはメッセージを受信する

  1. /**
  2. * RegisterManagerのCommonEventインターフェースを実装する
  3. *
  4. * @param コードコード
  5. * @param デバイスID デバイスID
  6. */
  7. @オーバーライド
  8. パブリックvoid onReceiveEvent( intコード、StringデバイスID) {
  9. LogUtils.info( "onReceiveEvent,コード:" +コード);
  10. スイッチ(コード){
  11. //ゲームプレイすることに同意する
  12. ConstUtil.AUTH_TYPE1の場合:
  13. //start.setVisibility(Component.HIDE);
  14. tips.setVisibility(Component.VISIBLE);
  15. tips.setText( "承認されました。ゲームを開始できます" );
  16.  
  17. 壊す;
  18. //ゲーム拒否する
  19. ConstUtil.AUTH_TYPE2の場合:
  20. tips.setVisibility(Component.VISIBLE);
  21. //DialogUtil.exitDialog(getAbility());
  22. tips.setText( "拒否されました。再生できません" );
  23. 壊す;
  24. デフォルト
  25. 壊す;
  26. }
  27. }

6. まとめ

分散システムで一般的に使用される通信方法:

1. インテントがパラメータを直接渡す(intent.setParam(ORDER_CODE, type))

2. パブリックイベントのサブスクリプション/公開方法(CommonEventDataにカプセル化されたインテント)

3. カスタム インターフェース メソッド (RegisterManager.CommonEvent)

記事に関連する添付ファイルをダウンロードするには、以下のリンクをクリックしてください。

https://harmonyos..com/resource/1574

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  2022年のクラウドコンピューティング市場動向予測

>>:  コード 0、ビルド 1!パートナークラウド×エンタープライズWeChat合同カンファレンスが北京で成功裏に開催

推薦する

新規サイトの SEO に役立つ 5 つの強力なツール

最近では、個人のウェブマスターがますます増えています。すべての初心者は、ウェブサイト構築の初期段階で...

マイクロサービスとクラウドネイティブアプリケーション開発の最新動向について学ぶ

マイクロサービス アーキテクチャとクラウドネイティブ アプリケーション開発は、現在のソフトウェア開発...

ウェブサイトの掲載や外部リンクの最適化をまだ行っていますか?

Baidu 検索エンジンはユーザー エクスペリエンスをターゲットにしており、多数の Web サイトが...

グリーン クラウド: クラウド コンピューティングが公共部門のエネルギー効率目標達成にどのように役立つか

クラウド コンピューティングは、特にエネルギー コストが高騰する中で、公共部門の組織にさまざまなメリ...

集中すると、その背後にある潜在エネルギーがどのように爆発するのでしょうか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス以前はオンラインで文章を...

Weiboマーケティング手法をよく使っている皆さんは、本当に知っていますか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeChatが使われるよ...

トレーニングと研究をアップグレードし、CNPC Richfit と Microsoft HoloLens が複合現実の旅を開始

デジタル経済の発展は急速に進み始めました。 2022年までに世界のデジタルGDPは46兆米ドルに達し...

gigsgigscloud - 米国高防御VPS/CN2 GIAネットワーク/500g防御/Alipay

gigsgigscloud は新製品「US 高防御 VPS」をリリースしました。現在先行販売中で、6...

5Gとエッジコンピューティングが企業の新たな常態への対応にどのように役立つか

コロナウイルス危機への対応として、世界中の組織は、世界が正常に戻るか、少なくとも次の正常に戻るまで待...

ワーナークラウド:米国/香港/シンガポール、CN2クラウドサーバーが40元から、帯域幅が1倍(トラフィック無制限)、10G DDoS防御

Warner Cloudは現在、期間限定のフラッシュセールとCN2クラウドサーバーの特別プロモーショ...

体験が何よりも重要視される時代において、優れたユーザー エクスペリエンスとは何でしょうか?

現代は経験がものを言う時代であると言っても過言ではありません。大量消費財を製造する人々は、今日では消...

仮想マシンのメモリ領域に関する簡単な説明

1. Java仮想マシンのメモリ領域の概要プログラムを作成するときに、OOM (メモリ不足) やメモ...

A5 Webmaster NetworkがBaidu入札最適化ホスティングサービスを本格開始

Admin5 Webmaster Networkは11月16日、キーワードを正確に配置してクリック率...

2020 年のパブリック クラウド ホスティング サービスのトップ 10 プレーヤー

[51CTO.com クイック翻訳] Gartner は、パブリック クラウドの Infrastru...

WeChat マーケティングと検索エンジン マーケティングのどちらが優れているのでしょうか?

まず、2年前の検索エンジンマーケティングの人気を振り返ってみましょう。2年前、検索エンジンマーケティ...