[[435097]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com 1. はじめにHarmonyOS は、システム クリップボード サービスの操作インターフェイスを提供します。このインターフェイスは、ユーザー プログラムがシステム クリップボードからクリップボード データを読み取り、書き込み、照会したり、システム クリップボード データの変更に対するコールバックを追加および削除したりすることをサポートします。 デバイス内部: ユーザーはシステム クリップボード サービスを使用して、アプリケーション間で簡単なデータ転送を実現できます。たとえば、アプリケーション A でコピーしたデータはアプリケーション B に貼り付けることができ、その逆も同様です。 機材室: 分散ペーストボードのシナリオでは、貼り付けられたデータを複数のデバイスに書き込むことができます。たとえば、デバイス A 上のアプリケーションは、システム ペーストボード インターフェイスを使用して、デバイス A からコピーされたデータを IDL インターフェイスを介してデバイス B のシステム ペーストボードに保存します。データが許可する場合、デバイス B 上のアプリケーションはコピーされたデータを読み取ってシステム ペーストボードに貼り付けることができます。デバイス間でのペーストボードの分散コラボレーションを実現します。 上記の理解に基づいて、分散ペーストボード アプリケーションが実装されます。アプリケーションはクライアント(コピー)とサーバー(貼り付け)の2つの部分に分かれており、データ転送はidlを通じて実現されます。 クライアントはデータの収集を担当し、サーバーはデータの表示と適用を担当します。クライアントとサーバーは、同じデバイスまたは異なるデバイスにインストールできます。サーバーは複数のデバイスにインストールすることもできます。サーバーは分散データベースを通じてクリップボード データの自動同期を実現します。 2. エフェクト表示
3. 環境を構築するDevEco Studio をインストールします。詳細については、DevEco Studio のダウンロードを参照してください。 DevEco Studio 開発環境をセットアップします。 DevEco Studio 開発環境はネットワーク環境に依存する必要があります。ツールを正常に使用するには、ネットワークに接続する必要があります。次の 2 つの状況に応じて開発環境を構成できます。 インターネットに直接アクセスできる場合は、HarmonyOS SDK をダウンロードするだけで済みます。 ネットワークがインターネットに直接アクセスできず、プロキシ サーバー経由でアクセスする必要がある場合は、「開発環境の構成」を参照してください。 ソースコードをダウンロードしたら、DevEco Studio を使用してプロジェクトを開き、シミュレーターを実行します。 実際のデバイスで実行するには、config.json の buddleName を独自のものに変更する必要があります。まだ設定していない場合は、AppGallery Connect で設定してください。詳細については、「シミュレータを使用したデバッグ」を参照してください。 IV.プロジェクト構造
5. コードの説明5.1 システムクリップボードの基本機能の紹介 システムペーストボードオブジェクトの概要 1. SystemPasteboard // システム ペーストボード オブジェクト。コピー、貼り付け、ペーストボード コンテンツの変更に対するリスナーの設定など、システム ペーストボード操作を定義します。 2.PasteData//ペーストボード上の貼り付けデータを示します。 3.PasteData.DataProperty // このクラスは、タイムスタンプ、MIME タイプ、その他の属性データなど、システム ペーストボード上の PasteData のプロパティを定義します。 4.PasteData.Record // このクラスは、貼り付けられた単一のデータをレコードとして定義します。レコードには、プレーン テキスト、HTML テキスト、URI、およびインテントを使用できます。 PasteData オブジェクトには 1 つ以上のレコードが含まれます。 クライアント (コピー) CopyAbilitySlice.java システム ペーストボードを取得し、ペーストボード データの変更を監視します。 - /**
- * システムペーストボードを取得する
- * ペーストボードデータの変更を監視する
- */
- プライベートvoid initPasteboard() {
- HiLog.debug(LABEL、 "initPasteboard" );
- //システムペーストボードオブジェクトを取得する
- ペーストボード = SystemPasteboard.getSystemPasteboard(これ);
- //ペーストボードデータの変更を監視する
- pastboard.addPasteDataChangedListener(() -> {
- if (pasteboard.hasPasteData()) {
- sync_text = getPasteData();
- HiLog.debug(LABEL、 "%{public}s" 、 "pasteStr:" + sync_text);
- }
- });
- }
ペーストボードの内容を取得する - /**
- * クリップボードの記録を取得する
- *
- * @戻る
- */
- プライベート文字列getPasteData() {
- HiLog.debug(LABEL、 "getPasteData" );
- 文字列結果 = "" ;
-
- //ペーストボードデータオブジェクト
- ペーストデータペーストデータ = ペーストボード.getPasteData();
- 貼り付けデータ == nullの場合{
- 結果を返します。
- }
- PasteData.DataProperty データプロパティ = pasteData.getProperty();
- //
- ブール型 hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);
- ブール型 hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);
-
- //データ形式の種類
- HTML がある場合 || テキストがある場合
- ( int i = 0; i < pasteData.getRecordCount(); i++) {
- //ペーストボードデータレコード
- PasteData.Record レコード = pasteData.getRecordAt(i);
- //異なるタイプには異なる取得方法があります
- 文字列 mimeType = record.getMimeType();
- //HTMLテキスト
- mimeType が PasteData.MIMETYPE_TEXT_HTML と等しい場合
- 結果 = record.getHtmlText();
- //プレーンテキスト
- }そうでない場合 (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
- 結果 = record.getPlainText().toString();
- //
- }それ以外{
- HiLog.info(LABEL、 "%{public}s" 、 "getPasteData mimeType :" + mimeType);
- }
- }
- }
- 結果を返します。
- }
ペーストボードにテキストを設定する - /**
- * ペーストボードにテキストを設定する
- *
- * @param コンポーネント
- */
- プライベート void setTextToPaste(コンポーネント コンポーネント) {
- HiLog.info(LABEL, "setTextToPaste" );
- if (ペーストボード != null ) {
- 文字列テキスト = syncText.getText();
- テキストが空の場合(){
- showTips(this, "内容を入力してください" );
- 戻る;
- }
- // レコードをペーストボードに追加します
- PasteData pasteData= PasteData.creatPlainTextData(テキスト);
- //テキストをペーストボードに設定する
- pasteboard.setPasteData(pasteData);
-
- showTips(this, "コピーが成功しました" );
- HiLog.info(LABEL, "setTextToPaste が成功しました" );
- }
- }
ペーストボードをクリアする - /**
- * ペーストボードをクリアする
- *
- * @param コンポーネント
- */
- プライベート void clearPasteboard(コンポーネント コンポーネント) {
- if (ペーストボード != null ) {
- ペーストボードをクリアします。
- showTips(this, "クリアに成功しました" );
- }
- }
5.2 分散ペーストボードアプリケーションの構築アイデアの紹介
リモート接続デバイスを選択 この例は、新しい DevicesSelectAbility を追加することによって実装されます。 - プライベートvoid showDevicesDialog() {
- インテントのintent = 新しいIntent();
- //デバイスを選択するためのAbilityページを開くDevicesSelectAbility
- 操作操作 =
- 新しい Intent.OperationBuilder()
- .withDeviceId( "" )
- .withBundleName(バンドル名を取得())
- .withAbilityName(デバイス選択アビリティ.クラス)
- 。建てる();
- インテントをsetOperation(操作);
- //デバイス選択要求識別子を持ち、デバイス選択ページを開く (DevicesSelectAbility) TODO
- startAbilityForResult(インテント、Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE);
- }
-
- /**
- * デバイスを開いてアビリティを選択した後、接続されたデバイスを選択し、setResultを実行してトリガーします。
- *
- * @param リクエストコード
- * @param 結果コード
- * @param 結果インテント
- */
- @オーバーライド
- 保護されたvoid onAbilityResult( int requestCode, int resultCode, Intent resultIntent) {
- HiLog.debug(LABEL、 "onAbilityResult" );
- リクエストコード == Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE && resultIntent != null の場合{
- //ユーザーが選択したデバイスを取得する
- 文字列デバイスID = resultIntent.getStringParam(Constants.PARAM_DEVICE_ID);
- //ペーストボードサーバーに接続する
- connectService(デバイスID);
- 戻る;
- }
- }
クリップボードサーバーのServiceAbilityサービスに接続する idl ファイルは、ohos.samples.pasteboard.paste ディレクトリに配置されます。 Gradl ウィンドウで compileDebugIdl を実行すると、システムによってプロキシ オブジェクトが生成されます。 - インターフェース ohos.samples.pasteboard.paste.ISharePasteAgent {
- /*
- * システムペーストボードを設定する
- */
- void setSystemPaste([ in ] String param);
- }
ServiceAbility サーバーに接続します。ネットワーク内に他のデバイスがない場合、ローカル サーバーに接続します。 接続が成功したら、データ同期の次のステップのために idl の SharePasteAgentProxy エージェントを初期化します。 - //idl 共有ペーストボードプロキシ
- プライベート SharePasteAgentProxy リモートエージェントプロキシ;
-
- /**
- * ペーストボードサービスセンターに接続
- */
- プライベートvoid connectService(文字列デバイスID) {
- HiLog.debug(LABEL、 "%{public}s" 、 "connectService" );
- 接続されている場合
- ブール値 isConnectRemote = deviceId != null ;
- //ローカル サービスに接続するかリモート サービスに接続するかを決定する三項式
- インテント インテント = isConnectRemote
- ? getRemoteServiceIntent(REMOTE_BUNDLE、REMOTE_SERVICE、デバイスID)
- : getLocalServiceIntent(REMOTE_BUNDLE、REMOTE_SERVICE);
-
- HiLog.debug(LABEL、 "%{public}s" 、 "intent:" + intent);
- //サービスに接続
- connectAbility(インテント、新しいIAbilityConnection() {
- @オーバーライド
- パブリックvoid onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
- //サービス接続が成功したことを通知する
- イベントハンドラは、EVENT_ABILITY_CONNECT_DONE を送信します。
- // プロキシを初期化する
- リモートエージェントプロキシ = 新しい SharePasteAgentProxy(iRemoteObject);
- HiLog.debug(LABEL、 "%{public}s" 、 "remoteAgentProxy:" + remoteAgentProxy);
- }
-
- @オーバーライド
- パブリックvoid onAbilityDisconnectDone(要素名要素名、 int結果コード) {
- //サービスが切断されたことを通知します。アクティブな切断は実行されませんが、サーバーの終了は実行されます
- イベントハンドラは、EVENT_ABILITY_DISCONNECT_DONE を送信します。
- }
- });
- }
- }
- /**
- * リモートクリップボードサービスセンターを取得する
- *
- * @param バンドル名
- * @param サービス名
- * @戻る
- */
- プライベートインテント getRemoteServiceIntent(文字列バンドル名、文字列サービス名、文字列デバイスID) {
- HiLog.debug(LABEL、 "%{public}s" 、 "getRemoteServiceIntent" );
- 操作 operation = new Intent.OperationBuilder()
- .withDeviceId(デバイスID)
- .withBundleName(バンドル名)
- .withAbilityName(サービス名)
- //重要
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- 。建てる();
- インテントのintent = 新しいIntent();
- インテントをsetOperation(操作);
- 意図を返す;
- }
-
- /**
- * 地元の厚紙サービスセンターを利用する
- *
- * @param バンドル名
- * @param サービス名
- * @戻る
- */
- プライベートインテント getLocalServiceIntent(String bundleName, String serviceName) {
- HiLog.debug(LABEL、 "%{public}s" 、 "getLocalServiceIntent" );
- 操作 operation = new Intent.OperationBuilder().withDeviceId( "" )
- .withBundleName(バンドル名)
- .withAbilityName(サービス名)
- 。建てる();
- インテントのintent = 新しいIntent();
- インテントをsetOperation(操作);
- 意図を返す;
- }
データをサーバーに同期する - /**
- * クリップボードの記録をクリップボードサービスセンターに同期する
- *
- * @param コンポーネント
- */
- プライベート void syncData(コンポーネント コンポーネント) {
- HiLog.debug(LABEL、 "sync_text:" + sync_text);
- sync_text.isEmpty() の場合 {
- if (isConnect && remoteAgentProxy != null ) {
- //サーバーのIPCメソッドを呼び出す
- 試す {
- リモートエージェントプロキシ.setSystemPaste(sync_text);
- //テキストを変更する
- syncText.setText(getRandomText());
- 同期テキスト = "" ;
- showTips(this, "同期が成功しました" );
- } キャッチ (RemoteException リモート例外) {
- リモート例外を printStackTrace();
- }
- }それ以外{
- showTips(this, "デバイスを接続しています" );
- }
- }それ以外{
- showTips(this, "クリックしてクリップボードにコピー" );
- }
- }
貼り付けたテキストをランダムに生成する - /**
- * ランダムテキスト、シミュレートされたデータ
- *
- * @戻る
- */
- パブリック文字列getRandomText() {
- リスト<文字列> リスト = Arrays.asList(
- 「私は馬から降りずに疾走し、馬は空から3フィート3メートルの高さまで上昇しました。 」
- 「私は剣を手に持ち、空に向かって笑う。私の忠誠心と勇気は崑崙山脈に残るだろう。 」
- 「滝は真下に3000フィート落下し、まるで天の川が空から落ちてくるようです。 」
- 「君子は自分の内に求め、悪人は他人に求める。 」
- 「私は一日に三度、自分自身を吟味します。他人のために働くとき、私は不誠実ではないだろうか?友人と接するとき、私は信頼できるだろうか?自分の説くことを実践していないだろうか?」 );
- int random = new SecureRandom().nextInt(list.size ( ));
- list.get(ランダム)を返します。
- }
サーバー (貼り付け) ServiceAbility.java ペーストボードサービスの設定idl ファイルは、ohos.samples.pasteboard.paste ディレクトリに配置されます。 Gradl ウィンドウで、compileDebugIdl を実行すると、システムによってプロキシ オブジェクトが生成されます。 idl は、リモート呼び出し用の setSystemPaste インターフェイスを提供します。 - インターフェース ohos.samples.pasteboard.paste.ISharePasteAgent {
- /*
- * システムペーストボードを設定する
- */
- void setSystemPaste([ in ] String param);
- }
- //idlのサーバー実装、
- SharePasteAgentStub sharePasteAgentStub = 新しい SharePasteAgentStub(DESCRIPTOR) {
- @オーバーライド
- パブリックvoid setSystemPaste(String param) {
- HiLog.info(LABEL, "%{public}s" , "param:" + param);
-
- //データベースに挿入
- アイテムの子 itemChild = 新しい ItemChild();
- 文字列 currentTime = DateUtils.getCurrentDate( "yyMMdd HH:mm:ss" );
- itemChild.setWriteTime(現在の時刻);
- パラメータを書き込みます。
- itemChild.setIndex(String.valueOf(UUID.randomUUID()));
- // デフォルトでは未分類に追加されます
- タグ名を要素の末尾にセットします。
- //クリップボードのレコードを分散データベースに追加する
- kvManagerUtils.addItemChild(itemChild);
-
- }
- };
-
- @オーバーライド
- 保護された IRemoteObject onConnect(インテントインテント) {
- HiLog.info(LABEL、 "%{public}s" 、 "ServiceAbility onConnect" );
- sharePasteAgentStubを返します。
- }
-
- **データベースの初期化**
- ```ジャワ
- // データベースツールを初期化する
- kvManagerUtils = KvManagerUtils.getInstance(これ);
-
- // データベース管理オブジェクトを初期化する
- kvManagerUtils.initDbManager(eventHandler);
-
- //データベースデータの初期化ボタン
- イメージ initDb = (イメージ) findComponentById(ResourceTable.Id_init_db);
- initDb.setClickedListener(コンポーネント -> {
- //デフォルトでは「未定義」ラベルが選択されます
- 現在の選択カテゴリインデックス = 0;
- // データベースデータを初期化する
- kvManagerUtils.initDbData();
- showTip( "初期化が完了しました" );
- });
データリストを初期化する - /**
- * 分散データベースからデータをクエリする
- */
- パブリックボイドクエリデータ(){
- HiLog.debug(LABEL、 「クエリデータ」 );
- 試す {
- //選択したカテゴリのデータリストをロードします
- カテゴリデータタグリストを取得します。
- } キャッチ (KvStoreException 例外) {
- HiLog.info(LABEL, "値は文字列である必要があります" );
- }
- }
-
- /**
- * 選択したタグのサブアイテムリストを初期化します
- *
- * @param itemChildList itemChildList、 itemChildのBean
- */
- プライベートvoid initItemChild(List<ItemChild> itemChildList) {
- HiLog.debug(LABEL、 "initItemChild:" + itemChildList);
- (itemChildList == nullの場合){
- 戻る;
- }
- //コンポーネントをクリアする
- 項目の子レイアウト。すべてのコンポーネントを削除します。
- // itemChildを作成する
- (ItemChild itemChild : itemChildList)の場合{
- //サブアイテムカテゴリが配置されているコンポーネントを取得します
- コンポーネント 子コンポーネント =
- LayoutScatter.getInstance(this).parse(ResourceTable.Layout_paste_record_per, null 、 false );
- //書き込み時間
- テキスト writeTime = (テキスト) childComponent.findComponentById(ResourceTable.Id_writeTime);
- 書き込み時間を設定します。
- // ペーストボードの内容
- テキスト writeContent = (テキスト) childComponent.findComponentById(ResourceTable.Id_writeContent);
- 書き込みコンテンツ。テキストを設定します。
-
- //コピーボタン
- テキスト コピー = (テキスト) childComponent.findComponentById(ResourceTable.Id_itemChildPerCopy);
- //コピーボタンのリスニングイベント
- copy.setClickedListener(コンポーネント -> {
- //コンテンツをクリップボードにコピーする
- pasteboard.setPasteData(PasteData.creatPlainTextData(itemChild.getWriteContent()));
- showTip( "クリップボードにコピーされました" );
- });
-
- //お気に入りボタン
- テキストお気に入り = (テキスト) childComponent.findComponentById(ResourceTable.Id_itemChildPerFavorite);
- //コレクションボタンのリスニングイベント
- お気に入り.setClickedListener(コンポーネント -> {
- //ラベルマイクロが収集されたことを変更する
- itemChild.setTagName(Const.CATEGORY_TAG_FAVORITED);
- //データを保存する
- kvManagerUtils.addItemChild(itemChild);
- showTip( "お気に入りに追加されました" );
- });
-
-
- /******************テスト用************************/
- //チェックボックス
- チェックボックス noteId = (チェックボックス) childComponent.findComponentById(ResourceTable.Id_noteId);
- //サブ項目リストのクリックイベント
- childComponent.setClickedListener(コンポーネント -> {
- noteId.getVisibility() == Component.VISIBLE の場合 {
- noteId が Checked であることを確認します。
- }
- });
- //サブ項目リストの長押しイベント、長押しするとチェックボックスが表示されます
- childComponent.setLongClickedListener(コンポーネント -> {
- //チェックボックスの表示
- noteId.setVisibility(Component.VISIBLE);
- //チェックボックスのスタイルと他のテキストコンポーネントのインデントを設定します
- 要素 element = ElementScatter.getInstance(getContext()).parse(ResourceTable.Graphic_check_box_checked);
- noteId.setBackground(要素);
- noteId.setChecked( true );
- 書き込み時間を設定します。左余白を設定します(80);
- 書き込みコンテンツ。左余白を設定します(80);
- });
- //チェックボックスの状態変更監視イベント。状態は選択されているかどうかを示します。
- noteId.setCheckedStateChangedListener((コンポーネント、状態) -> {
- //状態変更ロジック
- 要素要素;
- if (状態) {
- //選択したスタイルを設定する
- 要素 = ElementScatter.getInstance(getContext())
- .parse(ResourceTable.Graphic_check_box_checked);
- }それ以外{
- //選択されていないスタイルを設定する
- 要素 = ElementScatter.getInstance(getContext())
- .parse(ResourceTable.Graphic_check_box_uncheck);
- }
- noteId.setBackground(要素);
- });
- /******************テスト用************************/
-
- //レイアウトにサブアイテムリストコンポーネントを追加する
- 子コンポーネントを追加します。
- }
- }
タグ分類表示 - //クリックリスナーイベントのリストを初期化する
- カテゴリリスト.setItemClickedListener(
- (リストコンテナ、コンポーネント、インデックス、l1) -> {
- //ポイントは現在のカテゴリです
- (categoryListProvider.getSelectIndex() ==インデックス)の場合{
- 戻る;
- }
- //カテゴリインデックスを切り替える
- カテゴリリストプロバイダー.setSelectIndex(インデックス);
- //選択したタグのインデックスを設定する
- current_select_category_index =インデックス;
- //現在選択されているタグの名前を取得します
- 文字列 tagName = CategoryData.tagList.get(インデックス);
- //データベースからタグのサブアイテムリストを照会する
- initItemChild(kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName));
- //データ更新を通知する
- カテゴリリストプロバイダー。データが変更された場合に通知します。
- //バーを一番上までスクロールします
- itemListScroll.fluentScrollYTo(0);
- });
貼り付けレコードの検索 - //キー監視イベントを検索
- 検索テキストフィールド.setKeyEventListener()
- (コンポーネント、キーイベント) -> {
- keyEvent.isKeyDown() と keyEvent.getKeyCode() が等しい場合、KeyEvent.KEY_ENTER になります。
- //現在選択されているタグの名前を取得します
- 文字列 tagName = CategoryData.tagList.get(current_select_category_index);
- リスト<ItemChild> itemChildList = kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName);
- //データベースからタグのサブアイテムリストを照会する
- 子アイテムを初期化します。
- //データ更新を通知する
- カテゴリリストプロバイダー。データが変更された場合に通知します。
- //バーを一番上までスクロールします
- itemListScroll.fluentScrollYTo(0);
- }
- 戻る 間違い;
- });
分散データベース ツール KvManagerUtils.java データ変更通知分散データベース管理ツール KvManagerUtils.java が提供されており、すべてのデータベース操作がここに集中されます。 データベースのデータが変更されたときにページの表示をタイムリーに更新するために、ページはデータベースを初期化するときに eventHandler オブジェクトを渡し、データベースが変更されたときにページに通知できるようにします。 - /**
- * データベースの変更通知を購読する
- * @param singleKvStore データ操作
- */
- プライベートvoid subscribeDb(SingleKvStore singleKvStore) {
- HiLog.info(ラベル、 「subscribeDb」 );
- //データベース オブザーバー クライアント
- KvStoreObserver kvStoreObserverClient = 新しい KvStoreObserverClient();
- //リモートデータの変更をサブスクライブする
- 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE、kvStoreObserverClient);
- }
-
- /**
- * 分散データベースオブザーバークライアントをカスタマイズする
- * データが変更されたときに対応する関数をトリガーする
- *データベースメッセージを受信する
- */
- プライベートクラスKvStoreObserverClientはKvStoreObserverを実装します{
- @オーバーライド
- パブリックvoid onChange(ChangeNotification通知) {
- HiLog.error(LABEL、 「onChange」 );
- イベントハンドラの sendEvent(Const.DB_CHANGE_MESS);
- }
- }
自動データ同期 自動同期はデフォルトで有効になっています - /**
- *データベース管理の初期化
- * データベース管理者を初期化する
- */
- パブリックvoid initDbManager(EventHandler eventHandler) {
- イベントハンドラは、
- HiLog.info(ラベル、 「initDbManager」 );
- (singleKvStore == null || kvManager == null )の場合{
- HiLog.info(ラベル、 「initDbData」 );
- //データベース管理者を作成する
- kvManager = createManager();
- //データベースを作成
- 単一のKvStore = createDb(kvManager);
- subscribeDb(シングルKvStore);
-
- }
- }
-
-
-
- /**
- *分散データベースマネージャーインスタンスを作成する
- * データベース管理者を作成する
- *
- * @戻る データベースマネージャー
- */
- プライベートKvManagercreateManager() {
- HiLog.info(ラベル、 「createManager」 );
- KvManager マネージャー = null ;
- 試す {
- //
- KvManagerConfig config = 新しい KvManagerConfig(コンテキスト);
- マネージャー = KvManagerFactory.getInstance().createKvManager(config);
- } キャッチ (KvStoreException 例外) {
- HiLog.error(LABEL, "何らかの例外が発生しました" );
- }
- リターンマネージャー;
- }
-
- /**
- * 単一バージョンの分散データベースの作成
- * データベースを作成する
- *
- * @param kvManagerデータベース管理
- * @returnシングルKvストア
- */
- プライベートシングルKvStore createDb(KvManager kvManager) {
- HiLog.info(ラベル、 「createDb」 );
- SingleKvStore kvStore = null ;
- 試す {
- オプション options = new Options();
- // 暗号化されていない単一バージョンのデータベース。KvStore データベースが利用できない場合に作成されます。
- //単一バージョンの分散データベース、ネットワークデバイス間の自動同期はデフォルトで有効になっています。
- // アプリケーションがパフォーマンスに敏感な場合は、自動同期機能 setAutoSync( false ) をオフにし、同期のために同期インターフェイスを積極的に呼び出すことをお勧めします。
- オプション.setCreateIfMissing( true )
- .setEncrypt( false )
- .setKvStoreType(KvStoreType.SINGLE_VERSION);
- //データベースを作成
- kvStore = kvManager.getKvStore(オプション、STORE_ID);
-
- } キャッチ (KvStoreException 例外) {
- HiLog.error(LABEL, "何らかの例外が発生しました" );
- }
- kvStoreを返します。
- }
権限設定.json - 「必要な権限」 : [
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」 、
- 「理由」 : 「クリップボードのデータを同期する」 、
- 「使用シーン」 : {
- 「いつ」 : 「未使用」 、
- "能力" : [
- "ohos.samples.pasteboard.paste.MainAbility" ,
- 「ohos.samples.pasteboard.paste.ServiceAbility」
- ]
- }
- },
- {
- 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」
- },
- {
- "名前" : "ohos.permission.KEEP_BACKGROUND_RUNNING"
- }
- ]
6. 結論1. クリップボード経由でデータを転送する場合、セキュリティ上の問題が発生する可能性があります。具体的なシナリオに応じて注意してご使用ください。 デバイス内で一度に転送される貼り付けデータのサイズは 800 KB を超えることはできません。デバイス間で毎回転送されるデータは 64 KB を超えることはできず、データはテキスト形式である必要があります。 2. idl の使用法。上記の場合、クライアント (コピー) プロジェクトとサーバー (貼り付け) プロジェクトの idl の内容はまったく同じである必要があります。
7. 完全なコード添付ファイルは直接ダウンロードできます https://harmonyos..com/resource/1489 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |