Usando sensores de dispositivo em Arkts para Harmonyos-um guia passo a passo

Leia o artigo original: Usando sensores de dispositivo em Arkts for Harmonyos-Um guia passo a passo deseja fazer com que seu aplicativo Harmonyos se mova, incline, as etapas de contagem ou até mesmo leia a freqüência cardíaca? Neste guia prático, você aprenderá como acessar e visualizar vários sensores de dispositivo em um aplicativo ARKTS usando o @kit.sensorServiceKit. Vamos percorrer permissões, assinaturas, ligação da interface do usuário, cancelamento de descrições de economia de energia e um painel simples que transmite dados do sensor ao vivo. Uma pequena página do painel de sensores que: · Solicita as permissões corretas · Subscra um monte de sensores comuns (acelerômetro, giroscópio, luz, pressão, umidade, temperatura, gravidade, orientação, freqüência cardíaca, pedômetro) · Riacia leituras ao vivo na tela · Limpe os ouvintes para salvar a importação de bateria que você precisa (sensores de servicekk. Peça permissões (por exemplo, acelerômetro, read_health_data). Inscreva -se nos sensores com sensor.on (…) (ou sensor.once (…)). Renderize os dados com variáveis ​​Arkts @State. Cancelar a inscrição em sobretodisappear () com sensor.off (…). Navio – mas lembre -se: nem todo dispositivo tem todo sensor. Harmonyos expõe sensores através do módulo @kit.sensorServiceKit. Cada sensor físico é identificado por um sensor. Constante -sensorida e fornece dados através de uma resposta digitada (por exemplo, acelerometer resposta, OrientationResponse). Casos de uso típicos: · Fitness e saúde: etapas, freqüência cardíaca, movimento, sono · Meio Ambiente: Luz ambiente, umidade, pressão, temperatura · UX & Jogos: gestos, inclinação, orientação · Automação: flip, agitar ou acionar as ações de movimento para o balancete e a bateria. · Ambiente Harmonyos Dev configurado · Arkts básicos + UI declarativa compreensão · Um dispositivo (ou emulador – não se esqueça de que você não pode usar todos os valores do sensor com emulador) que realmente possui os sensores que você deseja ler Criar utilscess/permissionstil.ets para centralizar as verificações de permissão e solicitações: habilidadesclesclesctrl, bundlager, que não senta permissão, fruta de permissão, fruto de permissões, fruto de permissões, fruto de permissões, fruta -fértilas, bundlager, commissões, commissões, commissões, commissões, commissões, commission, commission, commission, comuns, commissões, commissões, commission, comuns, commissões, commissões, commission, comuns, commissões, commissões, commissões, commission, commission, commission, commission. ‘@kit.abilitykit’; importar {BusinessError} de ‘@kit.basicServiceskit’; importar {hilog} de ‘@kit.performanceanalysiskit’; domínio const = 0x0000; classe permissionsutil {assync checkpermissions (permissões: matriz): promessa {vamos aplicar -se: boolean = false; para (deixe a permissão de permissões) {deixe GrantStatus: habilidadeAccessCtrl.GrantStatus = Aguarda this.CheckAccessToken (permissão); if (GrantStatus === CapacidadeAccessCtrl.GrantStatus.permission_Granted) {hilog.info (domain, ‘testTag’, ‘%{public} s’, ‘Checkpermission é concedido’); ApplResult = true; } else {hilog.info (domínio, ‘testTag’, ‘%{public} s’, ‘checkpermission não é concedido’); APPLRESULT = FALSE; }} if (! ApplResult) {this.requestPermissions (permissões); }} assync checkAccessToken (Permissão: Permissões): Promise {let Atmanager: habilidadeAccessCtrl.atManager = habilidadeAccessCtrl.CreatAtManager (); Deixe GrantStatus: habilidadeAccessCtrl.GrantStatus = habilidadeAccessCtrl.GrantStatus.permission_denied; deixe tokenid: número = 0; tente {let bundleInfo: bundleManager.bundleInfo = wait bundlemanager.getbundleInfoforSelf (bundlemanager.bundleflag.get_bundle_info_with_application); Let Appinfo: BundleManager.ApplicationInfo = BundleInfo.appinfo; tokenid = appinfo.accesstokenId; } catch (error) {let err: BusinessError = erro como BusinessError; hilog.error (0x0000, ”, `falha ao obter informações do pacote para o código. } tente {GrantStatus = Await AtManager.CheckAccessToken (tokenid, permissão); } catch (error) {let err: BusinessError = erro como BusinessError; hilog.error (0x0000, ”, `falha ao verificar o código de token de acesso. } retornar GrantStatus; } requestPerMissions (permissões: Array): void {let atmanager: habilidadeAccessCtrl.atManager = habilidadeAccessCtrl.CreatAtManager (); AtManager.ReQuestPermissionsFROUSER (getContext () como Common.uiabilityContext, permissões) .Then ((Data: PermissionRequeStResult) => {hilog.info (0x0000, ”, ‘solicitação de sucessão’)}) .Catch ((Err: Businesserror) =>> {Hild Secut ‘). Permissões do usuário.[]. const resultado = aguardar atmanager.requestPermissionsFromUser (contexto, permissões); return !! resultado.authResults.length && result.authResults.every (authResults => authResults === 0); }} exportação padrão new PermissionsUtil (); Digite o modo de saída do modo de tela cheia, adicione apenas o que você precisa; … “requestPermissions”: [
{
“name”: “ohos.permission.ACCELEROMETER”,
“reason”: “$string:EntryAbility_desc”,
“usedScene”: {
“abilities”: [ “EntryAbility” ]”When”: “sempre”}}, {“name”: “Ohos.permission.activity_motion”, “Razão”: “$ String: Entryability_desc”, “UsadoScene”: {“habilidades”: [ “EntryAbility” ]”When”: “sempre”}}, {“name”: “Ohos.permission.gyroscope”, “Razão”: “$ String: Entryability_desc”, “UsadoScene”: {“habilidades”: [ “EntryAbility” ]”When”: “sempre”}}, {“name”: “ohos.permission.read_health_data”, “Razão”: “$ String: Entryability_desc”, “UsadoScene”: {“habilidades”: [ “EntryAbility” ]”When”: “sempre”}}]Digite o modo de tela cheia de saída do modo de tela cheia: read_health_data é necessário para coisas como freqüência cardíaca e pedômetro. Crie seu componente de índice e conecte tudo juntos. · Use @State para ligar os valores do sensor diretamente à interface do usuário. · Use sensor.on (…) com um intervalo (especificado em nanossegundos). · Sempre ligue para o Sensor.off (…) para cancelar a inscrição quando a página desaparecer. importar {sensor} de ‘@kit.sensorServiceKit’; importar {BusinessError} de ‘@kit.basicServiceskit’; Permissões de importação de ‘../utils/permissionsutil’; @Entry @component struct índice {@state acelerômetro: string = ”; @State giroscópio: string = ”; @State luz: string = ”; @State pressão: string = ”; @State Humiding: String = ”; @State Temperature: string = ”; Orientação @State: String = ”; @State gravidade: string = ”; @State HeartData: número = 111; @Pedômetro @State: número = 111; Sobre ToAppEar (): void {const interval = 100_000_000; // 100 ms em nanossegundos permissionsutil.requestPermissions ([
‘ohos.permission.ACCELEROMETER’,
‘ohos.permission.ACTIVITY_MOTION’,
‘ohos.permission.GYROSCOPE’,
‘ohos.permission.READ_HEALTH_DATA’
]); tente {sensor.on (sensor.sensorid.acceleromômetro, (dados) => {this.acceleromômetro = `x: $ {data.x.tofixed (2)}, y: $ {Data.y.tofixed (2)}, z: $ {data.z.tofixed (2)}}}` “ `; } catch (error) {let e: BusinessError = Erro como BusinessError; console.error (`Erro do acelerômetro: $ {e.message}`); } tente {sensor.on (sensor.sensorid.pedometer, (Data: Sensor.pedomEterRestons) => {this.pedometer = data.Steps; console.info (‘conseguiu invocar uma vez. } catch (error) {let e: BusinessError = Erro como BusinessError; console.error (`falhou ao invocar uma vez. Código: $ {e.code}, mensagem: $ {e.message}`); } try {sensor.on (sensor.sensorid.gyroscope, (data) => {this.gyroscope = `x: $ {data.x.tofixed (2)}, y: $ {Data.y.tofixed (2)}, z: $ {Data.z.tofixed (2)}}}`…; } catch (error) {console.error (“giroscópio falhou.”); } try {sensor.on (sensor.sensorid.Gravity, (Data: Sensor.GravityResponse) => {this.gravity = `x: $ {data.x.tofixed (2)}, y: $ {data.y.tofixed (2)}, z: $ {{s.z. x = ‘ + data.x +’, y = ‘ + data.y +’, z = ‘ + data.z); setTimeout (() => {sensor.off (sensor.sensorid.gravity);}, 500); } catch (error) {let e: BusinessError = Erro como BusinessError; console.error (`falhou ao invocar. Código: $ {e.code}, mensagem: $ {e.message}`); } tente {sensor.on (sensor.sensorid.heart_rate, (dados: sensor.heartaterSponse) => {this.heartData = data.heartrate;}, {interval: interval}); setTimeout (() => {sensor.off (sensor.sensorid.heart_rate);}, 500); } catch (error) {let e: BusinessError = Erro como BusinessError; console.error (`falhou ao invocar. Código: $ {e.code}, mensagem: $ {e.message}`); } tente {sensor.on (sensor.sensorid.ambient_light, (data) => {this.light = `luz: $ {data.intensity.tofixed (2)} lx`;}, {interval: interval}); } catch (error) {console.error (“Sensor de luz falhou.”); } tente {sensor.on (sensor.sensorid.barômetro, (dados) => {this.pressure = `pressão: $ {data.pressure.tofixed (2)} hpa`;}, {interval: interval}); } catch (error) {console.error (“Barômetro falhou.”); } tente {sensor.on (sensor.sensorid.humidity, (data) => {this.humidity = `umidade: $ {data.humity.tofixed (2)}%`;}, {interval: interval}); } catch (error) {console.error (“O sensor de umidade falhou.”); } tente {sensor.on (sensor.sensorid.ambient_temperature, (data) => {this.temperature = `temp: $ {data.temperature.tofixed (2)} ° c`;}, {interval: interval}); } catch (error) {console.error (“sensor de temperatura falhou.”); } try {sensor.on (sensor.sensorid.orientation, (data) => {this.orientation = `pitch: $ {data.alpha.tofixed (2)}, roll: $ {Data.tofixed (2)}}} {{data.gamma.tofixed } catch (error) {console.error (“O sensor de orientação falhou.”); }} SobreTodisappear (): void {sensor.off (sensor.sensorid.acceleromômetro); sensor.off (sensor.sensorid.gravity); sensor.off (sensor.sensorid.gyroscope); sensor.off (sensor.sensorid.ambient_light); sensor.off (sensor.sensorid.barômetro); sensor.off (sensor.sensorid.humidity); sensor.off (sensor.sensorid.ambient_temperature); sensor.off (sensor.sensorid.orientation); sensor.off (sensor.sensorid.heart_rate); } build () {scroll () {colun ({space: 15}) {text (‘painel do sensor’). fontsize (24) .fontweight (fontweight.BOLD) texto (‘acelerador’ + this.acceleromômetro) têxt (‘gyroscope’ + ‘this.gyroscópio) (‘ luminos ” ‘ + text (‘ gyroscópio ‘ +’ this.gyroscópio) (‘luminos’ ‘ + th This.Text (‘ gyroscope ‘ +’ this.gyroscópio) (‘luminos’ ‘ +. TEXTO DE TEXTO DO TEXTO) (‘Temperatura’ + this.Temperature) (‘Orientação’ + this.orientation) texto (‘gravidade’ + this.gravity text) (‘HeartData’ + this.heartData) Texto (Pedômetro ‘ + thatelfometer) th realmente expost -screen mode sensores. Meus resultados · cancelar a inscrição de forma agressiva: ligue para o sensor.off () assim que você não precisar de um fluxo. · Atualizações em lote/UI: se você estiver assinando muitos sensores, considere as atualizações da interface do usuário. · Ruído do filtro: use suavização/filtros (por exemplo, média móvel simples) para gráficos mais agradáveis ​​e menos valores saltados. · Guarda para falta de sensores: nem todo hardware é igual. Enrole todas as assinaturas no Try/Catch (como mostrado) e/ou use verificações de capacidade, se disponível. Esquecendo as permissões Você terá falhas ou falhas silenciosas. Sempre solicite (e justifique) o que você precisa. Amostragem de alta frequência = drenar a bateria, não use pequenos intervalos, a menos que você realmente precise deles. Cancelar a inscrição em sobretodisappear (). Supondo que um sensor exista para os dispositivos não tenha barômetros, monitores de freqüência cardíaca ou sensores de temperatura ambiente. Código defensivamente. UI Jank de intervalos mais grossos de atualizações rápidas ou atualizações de Debounce para manter a interface do usuário suave. Com apenas algumas dezenas de linhas de Arkts, a Harmonyos oferece acesso poderoso a dados de sensores em tempo real. A chave são as permissões, codificação defensiva e gerenciamento de energia. Comece pequeno, verifique a disponibilidade do sensor e construa experiências ricas e orientadas por sensores no topo. Escrito por Fatih Turan Gundogdu

Fonte

Você pode ter perdido