[[418672]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com バレンタインデー以降、これまでのBステーションカード企画に隠し機能が追加されます。最新の B ステーション サービス カードにアップグレードした場合、デスクトップにアバター カードを追加するときに、アバターをクリックするだけで、下の図のような効果が表示されます。 Hongmeng の分散機能を適用する小さな機能。 動画プレビューアドレス: https://harmonyos..com/show/7762 完全なプロジェクトアドレス: https://gitee.com/liangzili/bilibili-cards 1. プレイページを追加するたとえば、PlayerSlice の場合、このページはビデオを再生するために使用されます。
2. アバターカードにクリックイベントを追加するカード上のアバターをクリックするとページがジャンプします。コードは次のとおりです src/main/js/fans/pages/index/index.hml - <div クラス = "card_root_layout" そうでなければ>
- <div クラス = "div_left_container" >
- <stack class= "stack-parent" onclick= "sendRouterEvent" >
- <画像 src= "{{src}}"クラス= "image_src" ></画像>
- <画像 src= "{{vip}}"クラス= "image_vip" ></画像>
- </スタック>
- </div>
- <text class= "item_title" >{{フォロワー}}</text>
- </div>
新しく作成された再生ページにジャンプするアクションを設定します。 src/main/js/fans/pages/index/index.json - 「アクション」 : {
- 「ルーターイベントを送信」 : {
- 「アクション」 : 「ルーター」 、
- "abilityName" : "com.liangzili.demos.Player" 、
- "パラメータ" : true
- }
- }
3.再生ページでプルアップ方法を決定するインテントからパラメータ params を抽出します。サービス カードによって再生ページが開かれた場合、結果は true になります。分散プルアップの場合は false になります。 - パラメータ = intent.getStringParam( "パラメータ" ); // インテントからジャンプイベントで定義された params フィールドの値を取得します
- (パラメータが「真」の場合){
- インテントintent0 = 新しいIntent();
- 操作 op = new Intent.OperationBuilder()
- .withDeviceId(DistributedUtils.getDeviceId()) //パラメータ1。デバイスをまたぐかどうか、空、デバイスをまたがない
- .withBundleName( "com.liangzili.demos" ) //パラメータ 2. config.json の bundleName
- .withAbilityName( "com.liangzili.demos.Player" ) //パラメータ3. ジャンプ先のアビリティ名
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- 。建てる();
- オペレーションを設定します。
- intent0.setParam( "params" , "false" );
- 開始アビリティ(intent0);
- ビデオソース = "resources/base/media/right.mp4" ;
- }それ以外{
- ビデオソース = "resources/base/media/left.mp4" ;
- }
4. 分散プルアップページの権限を申請するparams が分散プルアップページを呼び出す場合は、事前にアプリケーションの権限を取得する必要があります。 アプリを初めて起動するときに、分散権限を取得するようにユーザーに通知します。 src/main/java/com/liangzili/demos/MainAbility.java - requestPermissionsFromUser(新しい文字列[]{ "ohos.permission.DISTRIBUTED_DATASYNC" },0);
5. リモートデバイスIDを取得するリモート デバイスでページを開くには、まずデバイス ID を取得する必要があります。 - パブリッククラスDistributedUtils {
- 公共 静的文字列 getDeviceId(){
- //オンラインデバイスのリストを取得します。 getDeviceList によって取得されたデバイスにはこのデバイスは含まれません。
- リスト<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- デバイスリストが空の場合
- 戻る ヌル;
- }
- intデバイス番号 = デバイスリスト。サイズ();
- リスト<文字列> deviceIds = 新しいArrayList<>(deviceNum); //デバイスIDを抽出
- リスト<文字列> deviceNames = 新しいArrayList<>(deviceNum); //デバイス名を抽出
- デバイスリスト.forEach((デバイス)->{
- デバイス ID を追加します(デバイス ID を取得します)。
- デバイス名を追加します(デバイス.getDeviceName());
- });
-
- 文字列 devcieIdStr = deviceIds.get(0);
- devcieIdStrを返します。
- }
- }
6. ビデオを再生するためのリソースアドレスを取得するビデオ再生は、iSoftStone HarmonyOS Academy の新年挨拶ビデオ コードを参照します。公式デモとCadeLabsはまだ実行されておらず、少し遅すぎるため、大きなセクションをコピーしていることをお許しください。 - //没入型ステータスバーを設定する
- getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS);
- プレイヤーを初期化します。
-
- // 2 つのコールバックを書き直す必要があります: VideoSurfaceCallback、VideoPlayerCallback
- プライベートvoid initPlayer() {
- sfProvider=(SurfaceProvider) リソーステーブル Id_surfaceProvider でコンポーネント ID を検索します。
- // image=(画像) findComponentById(ResourceTable.Id_img);
- sfProvider.getSurfaceOps().get().addCallback(新しい VideoSurfaceCallback());
- // sfProvider.pinToZTop(boolean)
- // 次のコード行を追加する必要があります: WindowManager.getInstance().getTopWindow().get().setTransparent( true );
- sfProvider.pinToZTop( true );
- //WindowManager.getInstance().getTopWindow().get().setTransparent( true );
- プレイヤー=新しいプレイヤー(getContext());
- //sfProvider リスナーイベントを追加
- sfProvider.setClickedListener(新しいComponent.ClickedListener() {
- @オーバーライド
- パブリックvoid onClick(コンポーネント コンポーネント) {
- プレイヤーが現在再生中の場合
- // 再生中の場合は一時停止します
- プレーヤーを一時停止します。
- // 再生ボタンが表示されます
- コンポーネントの可視性を VISIBLE に設定します。
- }それ以外{
- //一時停止している場合はクリックして再生を続行します
- プレイヤーを再生します。
- //再生ボタンを非表示にする
- イメージの可視性を Component.HIDE に設定します。
- }
- }
- });
- }
- プライベートクラス VideoSurfaceCallback は SurfaceOps.Callback を実装します {
- @オーバーライド
- パブリックvoid サーフェスが作成されました (サーフェスオペレーション サーフェスオペレーション) {
- HiLog.info(logLabel, "surfaceCreated() が呼び出されました。" );
- sfProvider.getSurfaceOps().isPresent() の場合 {
- サーフェス サーフェス = sfProvider.getSurfaceOps().get().getSurface();
- ローカルファイルを再生します(サーフェス)。
- }
- }
- @オーバーライド
- パブリックvoid 表面が変更されました (SurfaceOps 表面Ops、 int i、 int i1、 int i2) {
- HiLog.info(logLabel, "surfaceChanged() が呼び出されました。" );
- }
- @オーバーライド
- パブリックvoid 表面を破棄します(SurfaceOps 表面Ops) {
- HiLog.info(logLabel, "surfaceDestroyed() が呼び出されました。" );
- }
- }
- プライベートvoid playLocalFile(サーフェスサーフェス) {
- 試す {
- RawFileDescriptor filDescriptor = getResourceManager().getRawFileEntry(videoSource).openRawFileDescriptor();
- ソースソース = new Source(filDescriptor.getFileDescriptor(),filDescriptor.getStartPosition(),filDescriptor.getFileSize());
- player.setSource(ソース);
- プレーヤーのビデオサーフェスを設定します。
- player.setPlayerCallback(新しいVideoPlayerCallback());
- player.prepare ();
- sfProvider.setTop(0);
- プレイヤーを再生します。
- } キャッチ (例外 e) {
- HiLog.info(logLabel, "playUrl 例外:" + e.getMessage());
- }
- }
参考記事: [Softcom] SurfaceProvider がビデオ再生デモを実装 - 温かい新年の挨拶ビデオ - Hongmeng HarmonyOS 技術コミュニティ - Hongmeng 公式パートナー - 51CTO.COM Hongmeng アプリケーション開発入門 (VI): ページ間の移動 - Hongmeng HarmonyOS テクノロジー コミュニティ - Hongmeng 公式パートナー - 51CTO.CO 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |