用鸿蒙的发行版,为七夕助一臂之力
时间:2023-03-18 21:09:30
科技观察
更多信息,请访问:https://harmonyos.51cto.com,与华为官方共建的鸿蒙技术社区。情人节过后,为之前的B站打卡项目增加一个隐藏功能。如果升级最新的哔哩哔哩服务卡,在桌面添加头像卡时,点击头像即可看到下图效果。一个利用鸿蒙分布式能力的小功能。视频预览地址:https://harmonyos.51cto.com/show/7762完整项目地址:https://gitee.com/liangzili/bilibili-cards1。添加PlayerSlice等播放页面,该页面用于实现视频播放。2.为头像卡片添加点击事件。当点击卡片上的头像时,页面跳转。代码如下imagesrc="{{src}}"class="image_src">
{{follower}} actions设置为跳转到新建的播放页面。src/main/js/fans/pages/index/index.json"actions":{"sendRouterEvent":{"action":"router","abilityName":"com.liangzili.demos.Player","params":true}}3.判断播放页面的launch方法,从intent中提取参数params,如果播放页面是服务卡启动的,则为true。如果它是分布式上拉,则为false。params=intent.getStringParam("params");//从intent中获取跳转事件定义的params字段的值if(params.equals("true")){Intentintent0=newIntent();Operationop=newIntent.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).build();intent0.setOperation(op);intent0.setParam("params","false");startAbility(intent0);videoSource="resources/base/media/right.mp4";}else{videoSource="resources/base/media/left.mp4";}4.申请分布式拉取-up页面权限如果params调用分布式上拉页面,必须提前获取应用的权限。提醒用户在应用首次启动时获取分布式权限。src/main/java/com/liangzili/demos/MainAbility.javarequestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);5.要获取远程设备ID,请拉起远程设备上的页面。先获取设备的ID。publicclassDistributedUtils{publicstaticStringgetDeviceId(){//获取在线设备列表,getDeviceList获取的设备不包括本机。List
deviceList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);if(deviceList.isEmpty()){returnnull;}intdeviceNum=deviceList.size();ListdeviceIds=newArrayList<>(deviceNum);//提取设备IdListdeviceNames=newArrayList<>(deviceNum);//提取设备名称deviceList.forEach((device)->{deviceIds.add(device.getDeviceId());deviceNames.add(device.getDeviceName());});StringdevcieIdStr=deviceIds.get(0);returndevcieIdStr;}}6、获取播放视频的资源地址。有点晚了,请原谅我抄了一大堆。//设置沉浸式状态栏getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS);initPlayer();//需要重写两个回调:VideoSurfaceCallback、VideoPlayerCallbackprivatevoidinitPlayer(){sfProvider=(SurfaceProvider)findComponentById(ResourceProvider.Id_surface);//image=(Image)findComponentById(ResourceTable.Id_img);sfProvider.getSurfaceOps().get().addCallback(newVideoSurfaceCallback());//sfProvider.pinToZTop(boolean)--如果设置为true,视频控件将显示在顶层,但是设置为false时,虽然不显示在顶层,但是出现黑屏,//需要加一行代码:WindowManager.getInstance().getTopWindow().get().setTransparent(true);sfProvider。pinToZTop(true);//WindowManager.getInstance().getTopWindow().get().setTransparent(true);player=newPlayer(getContext());//sfProvider添加监听事件sfProvider.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){if(player.isNowPlaying()){//如果正在播放,暂停player.pause();//播放按钮可见image.setVisibility(Component.VISIBLE);}else{//如果Pause,点击继续播放player.play();//播放按钮隐藏image.setVisibility(Component.HIDE);}}});}privateclassVideoSurfaceCallbackimplementsSurfaceOps.Callback{@OverridepublicvoidsurfaceCreated(SurfaceOpssurfaceOps){HiLog.info(logLabel,"surfaceCreated()called.");if(sfProvider.getSurfaceOps().isPresent()){Surfacesurface=sfProvider.getSurfaceOps().get().getSurface();playLocalFile(surface);}}@OverridepublicvoidsurfaceChanged(SurfaceOpssurfaceOps,inti,inti1,inti2){HiLog.info(logLabel,"surfaceChanged()called.");}@OverridepublicvoidsurfaceDestroyed(SurfaceOpssurfaceOps){HiLog.info(logLabel,"surfaceDestroyed()called.");}}privatevoidplayLocalFile(Surfacesurface){try{RawFileDescriptorfilDescriptor=getResourceManager().getRawFileEntry(videoSource).openRawFileDescriptor();Sourcesource=newSource(filDescriptor).getFileDescriptor(),filDescriptor.getStartPosition(),filDescriptor.getFileSize());player.setSource(source);player.setVideoSurface(surface);player.setPlayerCallback(newVideoPlayerCallback());player.prepare();sfProvider.setTop(0);player.play();}catch(Exceptione){HiLog.info(logLabel,"playUrlException:"+e.getMessage());}}参考文章:【软通动力】SurfaceProvider实现视频播放Demo-火爆的拜年视频-鸿蒙更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区