鸿蒙实战开发:【SIM卡管理】

概述

本示例展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、ISO国家码、归属PLMN号信息,以及默认语音卡功能。

样例展示

基础信息

介绍

本示例使用sim相关接口,展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、ISO国家码、归属PLMN号信息,以及默认语音卡功能。

效果预览

使用说明:

1.若SIM卡槽1插入SIM卡则SIM卡1区域显示为蓝色,否则默认为白色。

2.点击SIM卡1区域,弹窗显示SIM卡1的相关信息,再次点击面板消失。

3.默认拨号的SIM卡其按钮背景色为蓝色,目前只展示默认拨号的SIM卡,更改默认拨号卡功能暂不支持。

4.呼叫转移界面功能暂不支持,故点击按钮无实际操作。

具体实现

  • 该示例主要通过hasSimCard方法获取指定卡槽SIM卡是否插卡,getSimState方法获取指定卡槽的SIM卡状态,SimState方法判断SIM卡状态,isSimActive方法获取指定卡槽SIM卡是否激活,getSimSpn方法获取指定卡槽SIM卡的服务提供商名称,getISOCountryCodeForSim方法获取指定卡槽SIM卡的ISO国家码,getSimOperatorNumeric方法获取指定卡槽SIM卡的归属PLMN号,getDefaultVoiceSlotId方法获取默认语音业务的卡槽ID等开发电话服务的相关功能。

源码链接:

InfoView.ets

/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import sim from '@ohos.telephony.sim'
import Logger from '../model/Logger'
import { SimView } from '../common/SimView'
import { CallView } from '../common/CallView'
import { Show } from '../common/Show'

const TAG = '[InfoView]'
const card1 = 0
const card2 = 1

@Component
export struct InfoView {
  @State data: string = ''
  @State slotId: number = 0
  @State flag: boolean = false
  @State sim1Color: string = '#FFFFFF'
  @State sim2Color: string = '#FFFFFF'
  private sim1Text: Resource = undefined
  private sim2Text: Resource = undefined
  private firstName: string = 'card1'
  private secondNAme: string = 'card2'

  async getColor(slotId: number) {
    let color: string = ''
    try {
      let result = await sim.hasSimCard(slotId)
      Logger.info(TAG, `color result is ${result}`)
      color = result ? '#0D9FFB' : '#FFFFFF'
    } catch (err) {
      color = '#FFFFFF'
      Logger.info(TAG, `err is ${JSON.stringify(err)}`)
    }
    Logger.info(TAG, `color is ${JSON.stringify(color)}`)
    return color
  }

  async getTextData(slotId: number) {
    let flagText: Resource
    try {
      let result = await sim.getSimState(slotId)
      Logger.info(TAG, `getSimState is ${result}`)
      switch (result) {
        case sim.SimState.SIM_STATE_UNKNOWN:
          flagText = $r('app.string.unknown')
          break
        case sim.SimState.SIM_STATE_NOT_PRESENT:
          flagText = $r('app.string.not_present')
          break
        case sim.SimState.SIM_STATE_LOCKED:
          flagText = $r('app.string.locked')
          break
        case sim.SimState.SIM_STATE_NOT_READY:
          flagText = $r('app.string.not_ready')
          break
        case sim.SimState.SIM_STATE_READY:
          flagText = $r('app.string.ready')
          break
        case sim.SimState.SIM_STATE_LOADED:
          flagText = $r('app.string.loaded')
          break
      }
      Logger.info(TAG, `flagText is ${JSON.stringify(flagText)}`)
    } catch (err) {
      flagText = $r('app.string.err')
      Logger.info(TAG, `err is ${JSON.stringify(err)} flagText is ${JSON.stringify(flagText)}`)
    }
    return flagText
  }

  async aboutToAppear() {
    this.sim1Text = await this.getTextData(card1)
    this.sim2Text = await this.getTextData(card2)
    this.sim1Color = await this.getColor(card1)
    this.sim2Color = await this.getColor(card2)
    this.flag = true
    Logger.info(TAG, `sim1Text is ${JSON.stringify(this.sim1Text)} sim2Text is ${JSON.stringify(this.sim2Text)}`)
  }

  build() {
    Scroll() {
      Column() {
        if (this.flag) {
          Show({
            slotId: card1,
            simText: this.sim1Text,
            simColor: this.sim1Color,
            simTitle: $r('app.string.sim1_id'),
            simCard: $r('app.string.sim1_card'),
            idName: this.firstName
          })

          Show({
            slotId: card2,
            simText: this.sim2Text,
            simColor: this.sim2Color,
            simTitle: $r('app.string.sim2_id'),
            simCard: $r('app.string.sim2_card'),
            idName: this.secondNAme
          })
        }
        SimView()
        CallView()
      }
    }
    .layoutWeight(1)
  }
}

ShowView.ets

/*
 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import sim from '@ohos.telephony.sim'
import Logger from '../model/Logger'

const TAG = '[ShowView]'

@CustomDialog
export struct ShowView {
  @State simState: Resource = undefined
  @State results: Array<unknown> = []
  @State simTitle: Resource = undefined
  private slotId: number
  controller: CustomDialogController

  async simResult() {
    Logger.info(TAG, `getResult this.slotId ${this.slotId}`)
    this.simTitle = this.slotId === 0 ? $r('app.string.sim1_state') : $r('app.string.sim2_state')
    let result = await sim.isSimActive(this.slotId)
    this.simState = result ? $r('app.string.sim_activation') : $r('app.string.sim_inactivated')
  }

  async getSimData() {
    let data: Array<string | Resource> = new Array(3).fill('')
    Logger.info(TAG, `data = ${JSON.stringify(data)}`)
    try {
      data[0] = await sim.getSimSpn(this.slotId)
      Logger.info(TAG, `data = ${JSON.stringify(data[0])}`)
    } catch (err) {
      data[0] = $r('app.string.err')
      Logger.info(TAG, `data = ${JSON.stringify(data[0])} err = ${JSON.stringify(err)}`)
    }
    try {
      data[1] = await sim.getISOCountryCodeForSim(this.slotId)
      Logger.info(TAG, `data = ${JSON.stringify(data[1])}`)
    } catch (err) {
      data[1] = $r('app.string.err')
      Logger.info(TAG, `data = ${JSON.stringify(data[1])} err = ${JSON.stringify(err)}`)
    }
    try {
      data[2] = await sim.getSimOperatorNumeric(this.slotId)
      Logger.info(TAG, `data = ${JSON.stringify(data[2])}`)
    } catch (err) {
      data[2] = $r('app.string.err')
      Logger.info(TAG, `data = ${JSON.stringify(data[2])} err = ${JSON.stringify(err)}`)
    }
    Logger.info(TAG, `data is ${JSON.stringify(data)}`)
    return data
  }

  async aboutToAppear() {
    await this.simResult()
    let result = await this.getSimData()
    Logger.info(TAG, `result = ${JSON.stringify(result)}`)
    this.results = [
      { title: $r('app.string.spn'), value: result[0] }, { title: $r('app.string.iso'), value: result[1] },
      { title: $r('app.string.plmn'), value: result[2] }
    ]
    Logger.info(TAG, `results = ${JSON.stringify(this.results)}`)
  }

  build() {
    Column() {
      Text(this.simTitle)
        .fontSize(18)
        .margin({ left: 5, right: 5, top: 5, bottom: 10 })

      Text($r('app.string.active'))
        .margin(5)
        .fontSize(18)
        .fontColor(Color.Gray)

      Text(this.simState)
        .margin(5)
        .fontSize(18)

      ForEach(this.results, item => {
        Text(item.title)
          .margin(5)
          .fontSize(18)
          .fontColor(Color.Gray)

        Text(item.value)
          .margin(5)
          .fontSize(18)
      }, item => JSON.stringify(item))
    }
    .margin(10)
    .padding(5)
    .width('100%')
    .borderRadius(10)
    .alignItems(HorizontalAlign.Start)
    .onClick(() => {
      this.controller.close()
      Logger.info(TAG, ` CustomDialog close`)
    })
  }
}

SimView.ets

/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import sim from '@ohos.telephony.sim'
import Logger from '../model/Logger'

const TAG = '[SimView]'
const card1 = 0
const card2 = 1

@Component
export struct SimView {
  @State data: string = ''
  @State sim1Color: string = '#FFFFFF'
  @State sim2Color: string = '#FFFFFF'

  async getDefaultVoice(num: number) {
    let color: string
    try {
      let result = await sim.getDefaultVoiceSlotId()
      Logger.info(TAG, `color result is ${result}`)
      color = result === num ? '#0D9FFB' : '#FFFFFF'
      Logger.info(TAG, `color is ${JSON.stringify(color)}`)
    } catch (err) {
      color = '#FFFFFF'
      Logger.info(TAG, `err is ${JSON.stringify(err)} color fail is ${JSON.stringify(color)}`)
    }
    return color
  }

  async aboutToAppear() {
    [this.sim1Color, this.sim2Color] = await Promise.all([this.getDefaultVoice(card1), this.getDefaultVoice(card2)])
    Logger.info(TAG, `sim1Color is ${this.sim1Color} sim2Color is ${this.sim2Color}`)
  }

  build() {
    Column() {
      Row() {
        Text($r('app.string.voice'))
          .fontSize(20)
          .fontColor(Color.Gray)
        Blank()
        Row() {
          Button() {
            Text($r('app.string.sim1_id'))
              .fontSize(18)
              .fontColor(Color.Black)
              .textAlign(TextAlign.Center)
          }
          .width('50%')
          .height('85%')
          .padding(5)
          .borderRadius(10)
          .backgroundColor(this.sim1Color)

          Button() {
            Text($r('app.string.sim2_id'))
              .fontSize(18)
              .fontColor(Color.Black)
              .textAlign(TextAlign.Center)
          }
          .width('50%')
          .height('85%')
          .padding(5)
          .borderRadius(10)
          .backgroundColor(this.sim2Color)
        }
        .width('40%')
        .height('95%')
        .borderRadius(50)
        .backgroundColor('#F1F1F1')
      }
      .margin(8)
      .padding(10)
      .width('95%')
      .height('8%')
      .borderRadius(10)
      .backgroundColor(Color.White)
    }
  }
}

鸿蒙OpenHarmony知识待更新👈点

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/428950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chat GPT:AI聊天机器人的革命性突破!

一、引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;其中最具代表性的成果之一便是Chat GPT。这款基于自然语言处理&#xff08;NLP&#xff09;技术的聊天机器人&#xff0c;以其高度智能、灵活多变的特点&#xff0c;迅速吸引了全…

C/C++工程师面试题(STL篇)

STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型&#xff0c;三种类型容器特性分别如下&#xff1a; 1. 顺序容器 容器并非排序的&#xff0c;元素的插入位置同元素的值无关&#xff0c;包含 vector、deque、list vector&#xff1a;动态数组…

LeetCode-第162题-寻找峰值

1.题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间…

Kali Linux 2024.1

Kali Linux 2024.1刚刚发布&#xff0c;标志着这个备受欢迎的安全重点Linux发行版在今年的首次重大更新。以其先进的渗透测试和安全审计功能而闻名&#xff0c;它是安全专业人员和爱好者的首选工具。 Kali 2024.1 亮点 本次发布由 Linux 内核 6.6 提供支持&#xff0c;突出了…

四年一段旅途,一个起点,一个机会

不得不感慨一下&#xff0c;现在的年轻人、大学生实在是太厉害了 最近加入了一个社群&#xff0c;是一名大三学生创建的&#xff0c;他短短一年间&#xff0c;就创建了一个数千人的社群&#xff0c;还运营的几十个副业社群&#xff0c;一年的时间变现100W&#xff0c;这些成绩…

动态前缀和数组:树状数组

前缀和的不足 前缀和是一种常见的算法思想&#xff0c;能够实现在常数时间复杂度下得到某个子区间内所有元素和。以一维数组 nums 为例&#xff0c;定义前缀和数组 preSum&#xff0c;preSum[i] 表示 nums 前 i 个元素的和&#xff0c;利用动态规划的思想&#xff0c;易得 pre…

力扣128. 最长连续序列(哈希表)

Problem: 128. 最长连续序列 文章目录 题目描述思路复杂度Code 题目描述 思路 1.先将数组中的元素存入到一个set集合中&#xff08;去除重复的元素&#xff09; 2.欲找出最长连续序列&#xff08;先定义两个int变量longestSequence和currentSequence用于记录最长连续序列和当前…

HTML5:七天学会基础动画网页7

CSS3高级特效 2D转换方法 移动:translate() 旋转:rotate() 缩放:scale() 倾斜:skew() 属性:transform 作用:对元素进行移动,旋转,缩放,倾斜。 2D移动 设定元素从当前位置移动到给定位置(x,y) 方法 说明 translate(x,y) 2D转换 沿X轴和Y轴移…

【Python】OpenCV-使用ResNet50进行图像分类

使用ResNet50进行图像分类 如何使用ResNet50模型对图像进行分类。 import os import cv2 import numpy as np from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions from tensorflow.keras.preprocessing import image# 设置…

【计算机网络】IO多路转接之poll

文章目录 一、poll函数接口二、socket就绪条件三、poll的优点四、poll的缺点五、poll使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.pollServer.hpp5.main.cc 一、poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int t…

EmoLLM(心理健康大模型)——探索心灵的深海,用智能的语言照亮情感的迷雾。

文章目录 介绍&#xff1a;应用地址&#xff1a;模型地址&#xff1a;Github地址&#xff1a;视频介绍&#xff1a;效果图&#xff1a; 介绍&#xff1a; EmoLLM是一个基于 InternLM 等模型微调的心理健康大模型&#xff0c;它涵盖了认知、情感、行为、社会环境、生理健康、心…

Python绘制不同形状词云图

目录 1.基本词云图1.1 导入所需库1.2 准备词汇1.3 配置参数并生成词云图1.4 在Python窗口中显示图片1.5 效果展示1.6 完整代码 2. 不同形状词云图2.1 找到自己所需形状图片2.2 利用PS将图片设置为黑白色2.3 在代码中设置背景2.4 效果展示 1.基本词云图 1.1 导入所需库 import…

2023全球软件开发大会-上海站:探索技术前沿,共筑未来软件生态(附大会核心PPT下载)

随着信息技术的迅猛发展&#xff0c;全球软件开发大会&#xff08;QCon&#xff09;已成为软件行业最具影响力的年度盛会之一。2023年&#xff0c;QCon再次来到上海&#xff0c;汇聚了众多业界精英、技术领袖和开发者&#xff0c;共同探讨软件开发的最新趋势和实践。 一、大会…

IO接口 2月5日学习笔记

1.fgetc 用于从文件中读取一个字符&#xff0c;fgetc 函数每次调用将会返回当前文件指针所指向的字符&#xff0c;并将文件指针指向下一个字符。 int fgetc(FILE *stream); 功能: 从流中读取下一个字符 参数: stream:文件流指针 返回值: …

嵌入式驱动学习第二周——断言机制

前言 这篇博客来聊一聊C/C的断言机制。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 目录 前言1. 断言介绍…

鸿蒙实战应用开发:【拨打电话】功能

概述 本示例通过输入电话&#xff0c;进行电话拨打&#xff0c;及电话相关信息的显示。 样例展示 涉及OpenHarmony技术特性 网络通信 基础信息 拨打电话 介绍 本示例使用call相关接口实现了拨打电话并显示电话相关信息的功能 效果预览 使用说明 1.输入电话号码后&#…

枚举与尺取法(蓝桥杯 c++ 模板 题目 代码 注解)

目录 组合型枚举&#xff08;排列组合模板&#xff08;&#xff09;&#xff09;: 排列型枚举&#xff08;全排列&#xff09;模板&#xff1a; 题目一&#xff08;公平抽签 排列组合&#xff09;&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff08;座次问题 全排…

寒假作业Day 06

寒假作业Day 06 一、选择题 1、关于内存管理&#xff0c;以下有误的是&#xff08; &#xff09; A: malloc在分配内存空间大小的时候是以字节为单位 B: 如果原有空间地址后面还有足够的空闲空间用来分配&#xff0c;则在原有空间后直接增加新的空间&#xff0c;使得增加新空…

No matching version found for @babel/traverse@^7.24.0.

问题&#xff1a; npm安装 依赖失败&#xff0c;找不到所需依赖。 原因&#xff1a; npm镜像源中没有该依赖。&#xff08;大概率是因为依赖最近刚更新&#xff0c;当前镜像源没有同步&#xff09; 解决&#xff1a; 查看自己的npm镜像&#xff1a;npm config get registry…

【刷题记录】详谈设计循环队列

下题目为个人的刷题记录&#xff0c;在本节博客中我将详细谈论设计循环队列的思路&#xff0c;并给出代码&#xff0c;有需要借鉴即可。 题目&#xff1a;LINK 下面是思路分析: 首先一开始收到实现普通队列的思路影响上题目中循环这俩字&#xff0c;那自然想到的是用链表来设计…