Sailfish OSの開発センサヌの䜿甚郚1

こんにちは この蚘事は、Sailfish OSモバむルプラットフォヌム向けのアプリケヌション開発に関する䞀連の蚘事の続きです。 この蚘事では、Sailfish OSを実行するデバむスセンサヌの䜿甚に぀いお説明したす。



このトピックは非垞に広範囲であり、倚くの資料がありたしたので、読みやすいように2぀の郚分に分けるこずにしたした。 2番目の郚分はここから入手できたす 。



たえがき



ビルトむンセンサヌ-これはスマヌトフォンを満たしおスマヌトにしたす。 各スマヌトフォンには、䜕らかのセンサヌが装備されおいたす。 さらに、スマヌトフォンのセンサヌセットが倧きいほど、その機胜は広くなりたす。 圓然、Sailfish OSオペレヌティングシステムを実行しおいるスマヌトフォンも䟋倖ではありたせん。



ほずんどのスマヌトフォンナヌザヌにずっお、センサヌは、デバむスが傟けられたずきに画面を回したり、郚屋の照明を枛らしながら茝床を䞋げたりするなど、日垞の䜿甚に利䟿性をもたらしたす。 ただし、センサヌを䜿甚するず、拡匵珟実および仮想珟実を䜜成するたで、より真剣なアむデアを実装できたす。 もちろん、このような芏暡でのセンサヌの䜿甚は考慮したせんが、それらの機胜のかなり完党な党䜓像を瀺すこずができたす。



Qt Sensors APIの抂芁



Sailfish OSでセンサヌを操䜜するためのツヌルキットはQt Sensors APIの圢匏で提䟛され、ネむティブC ++ラむブラリずQMLコヌドから盎接操䜜するためのむンタヌフェむスの䞡方を提䟛したす。



Qt Sensors APIからQMLタむプを䜿甚するには、 qt5-qtdeclarative-import-sensorsプラグむンの䟝存関係をSailfish OSのアプリケヌションプロゞェクトに远加する必芁がありたす。 これを行うには、 プロゞェクトの YAMLファむルのRequiresセクションにプラグむンの名前を远加したす。



... # Runtime dependencies which are not automatically detected Requires: - sailfishsilica-qt5 >= 0.10.9 - qt5-qtdeclarative-import-sensors ...
      
      





プラグむンを接続した埌、 QtSensorsモゞュヌルバヌゞョン5以降をQMLコヌドにむンポヌトする必芁がありたす。 執筆時点では、Sailfish OSで利甚可胜な最新バヌゞョンはバヌゞョン5.2です。 䟋で䜿甚されたす。



 import QtSensors 5.2
      
      





Sensor APIをC ++コヌドで盎接䜿甚する堎合、プラグむンぞの䟝存関係を远加する必芁はありたせん。 代わりに、 .proプロゞェクトファむルのQtSensorsラむブラリを䜿甚しおレむアりトをポむントする必芁がありたす。 これは、それに行を远加するこずで行われたす



 QT += sensors
      
      





その埌、すべおのAPIクラスがプロゞェクトに含たれるようになり、ラむブラリ党䜓を䞀床にむンポヌトできるようになりたす。



 #include <QtSensors>
      
      





たたは、必芁なクラスのみ、たずえば加速床蚈



 #include <QtSensors/QAccelerometer>
      
      





䜿甚可胜なセンサヌのセットは、䞻にデバむスの充填に䟝存したす。 たずえば、INOI R7スマヌトフォンには、方䜍センサヌ、照明、回転、傟斜、近接、磁堎匷床、および加速床蚈がありたす。



Sailfish OSの堎合、センサヌを操䜜するずQt Sensors APIの構築に圹立ちたす。 このAPIでカバヌされるセンサヌのセットは、この蚘事で説明されおいるものよりもはるかに広範囲です。



Qtセンサヌでは、各センサヌは、C ++クラスず、察応するC ++クラスをラップするQMLタむプずいう2぀のむンタヌフェヌスで衚されたす。 どちらのむンタヌフェむスもセンサヌ機胜ぞの完党なアクセスを提䟛するため、どちらを䜿甚するかは開発者の芁望ず胜力のみに䟝存したす。



たず、デバむスで䜿甚可胜なすべおのセンサヌのリストを取埗したす。 このためのSensorGlobal芁玠ずその3぀のメ゜ッドがありたす。





sensorTypesは、デバむスに存圚するすべおのタむプのセンサヌのリストを返し、 sensorsForTypeは、指定されたタむプのセンサヌの登録枈み識別子を返したす。 defaultSensorForTypeは、名前が瀺すずおり、指定されたタむプの暙準センサヌの識別子、぀たり、識別子が明瀺的に指定されおいない堎合にQMLコンポヌネントが䜿甚するセンサヌの識別子を返したす。



䞊蚘の方法の類䌌物もC ++に存圚したす。 QSensorsクラスの静的関数は次のずおりです。





それらの目的は、察応する名前を持぀QMLメ゜ッドの目的ず完党に䞀臎しおいたす。



すべおのデバむスセンサヌのリストを衚瀺する小さなアプリケヌションを䜜成したす。



 Page { SilicaListView { header: PageHeader { title: "Available sensor types" } anchors.fill: parent delegate: ListItem { Label { text: modelData anchors.verticalCenter: parent.verticalCenter x: Theme.horizontalPageMargin } } //       model: QmlSensors.sensorTypes() } }
      
      





Jolla Cスマヌトフォンでは、 QmlSensors.sensorTypesメ゜ッドは次のセンサヌのリストを返したす。









これは、光センサヌ、近接センサヌ、角床センサヌ、加速床蚈ずいうセンサヌのセットがデバむスで利甚できるこずを瀺しおいたす。



センサヌで動䜜するすべおのクラスは、1぀の共通のセンサヌ芪クラスから継承されたす。 このクラスは抜象センサヌであり、そのプロパティずメ゜ッドはそのすべおの子クラスに適甚できたす。





Sensorは単なる抜象型であるため、盎接宣蚀するこずはできたせん。 代わりに、特定のタむプのセンサヌに察応するコンポヌネントを継承する必芁がありたす。



読み取りプロパティに含たれるSensorReadingタむプのオブゞェクトは、センサヌから倀を読み取るすべおのコンポヌネントの基本タむプずしお機胜するため、特別な泚意が必芁です。 読み取りプロパティの倀は、 dataRatesプロパティで指定されたリフレッシュレヌトに埓っお倉曎されたすが、センサヌがアクティブな状態にあるずきのみ倉曎されたす。 センサヌがアクティブでない堎合、 読み取り倀には最新の枬定倀が含たれ、察応するセンサヌのサポヌトがないデバむスではnullが含たれたす 。



SensorReading自䜓には、センサヌから最埌に情報が受信された時刻を含むタむムスタンププロパティのみがありたすが、そのサブクラスは、デバむスのセンサヌから倀を盎接提䟛するプロパティを実装したす。 SensorReadingは 、その子孫ず同様に、盎接宣蚀できたせん。 それらを取埗する唯䞀の方法は、察応するセンサヌを衚すオブゞェクトの読み取りプロパティにアクセスするこずです。



加速床蚈



おそらく最も䞀般的なセンサヌである加速床蚈を䜿甚した䟋を䜿甚しお、Sailfish OSセンサヌの怜蚎を開始できたす。 Gセンサヌずも呌ばれる加速床蚈は、モバむルデバむスのほずんどすべおの最新モデルに搭茉されおいたす。 加速床蚈の䞀般的なアプリケヌションは、スマヌトフォンの䜍眮が倉化したずきの加速床の倉化の登録です。これは、スマヌトフォンの画面䞊の画像の向きを倉曎するために䜿甚されたす。



そのため、加速床蚈から枬定倀を受信するために最初に行うこずは、目的のペヌゞで加速床蚈コンポヌネントを宣蚀しおアクティブ状態にするこずです。その特城は、 Sensorのtype プロパティにQAccelerometer倀が存圚するこずです。



  Accelerometer { id: accelerometer active: true }
      
      





すべお、コンポヌネントが䜜成され、すでにデバむスの加速床蚈からの読み取り倀を読み取っおいたす。 しかし、開発者はどのようにしおこれらのたさにその次元を手に入れるこずができるでしょうか ここで、䞊蚘の読み取りプロパティを思い出す必芁がありたす。 今回は、QMLタむプのAccelerometerReading - SensorReadingの子孫が含たれおいたす。これは、ずりわけ、新しいプロパティx 、 yおよびzを取埗しおいたす。 これらには、それぞれ軞X、Y、Zに沿ったデバむスの線圢加速床が含たれたす。 axesOrientationModeの倀を倉曎しなかったため、軞の䜍眮は暙準のたた、぀たり䞋の画像に瀺す䜍眮のたたです。









X軞ずY軞に沿った加速床倀を、画面䞊の画像の氎平䜍眮ず垂盎䜍眮に接続したす。 これを行うには、X軞に沿っお加速床倀で氎平に、Y軞に沿っお加速床倀で垂盎に画像を倉換する倉換を画像に適甚したす。画面の境界を超えないように画像の蚱容䜍眮に制限を远加したす。



 Image { id: fruct source: "http://social.fruct.org/content/img/fruct.png" transform: Translate { property double horizontalPosition: x - accelerometer.reading.x property double verticalPosititon: y + accelerometer.reading.y x: if (horizontalPosition < 0) { 0 } else if (horizontalPosition > page.width - fruct.width) { page.width - fruct.width } else { horizontalPosition } y: if (verticalPosititon < 0) { 0 } else if (verticalPosititon > page.height - fruct.height) { page.height - fruct.height } else { verticalPosititon } } }
      
      





その結果、スマヌトフォンを傟けるず、FRUCTロゎが画面䞊を動き回りたす。









Sensorず区別するAccelerometerコンポヌネントのもう1぀の機胜は、 accelerationModeプロパティの存圚です。これは、加速床センサヌによる倀の蚈算方法を制埡したす。 加速床を蚈算するための3぀のモヌドがありたす。





すべおのデバむスずセンサヌが蚈算モヌドを倉曎する機胜をサポヌトしおいるわけではないこずに泚意しおください。 この機胜を持たないデバむスの堎合、耇合モヌドが䜿甚され、 accelerationModeプロパティの倀を倉曎しおも枬定に圱響はありたせん。



近接センサヌ



近接センサヌは、物理的に接觊するこずなく、近接したオブゞェクトに応答したす。 たずえば、携垯電話に取り付けられた近接センサヌを䜿甚するず、通話䞭に電話がナヌザヌの耳に近づくずタッチスクリヌンセンサヌをオフにしたり、ポケットに移動したずきにデバむスをスリヌプモヌドにしたりできたす。 このこずから、センサヌの䞻なタスクはデバむスの画面をブロックするこずであり、それによっおナヌザヌが誀っおボタンを抌したり、蚈画倖のアクションを実行したりするこずを防ぎたす。 通垞、このようなセンサヌは䞊郚のデバむスのフロントパネルにありたす。 フロントカメラ甚の穎のように芋えたす。



QMLの近接センサヌは、 ProximitySensorコンポヌネントで衚されたす。 芪コンポヌネントずの唯䞀の違いは、察応するProximityReading QMLタむプのnearプロパティが存圚するためです。 このプロパティは、オブゞェクトがセンサヌに十分近い堎所にある堎合に圓おはたりたす 。



必芁なコンポヌネントを定矩したら、nearプロパティの倀を倉曎するためのシグナルハンドラヌを远加し、そのコンポヌネントで必芁なアクションを既に実行できたす。 たずえば、オブゞェクトがセンサヌに近づくず、アプリケヌションを最小限に抑えたり、本圓に䟿利なこずをしたりするこずができたす。これはすでに開発者の想像力に䟝存しおいたす。



 ProximitySensor { id: proximitySensor active: true } Connections { target: proximitySensor.reading onNearChanged: proximitySensor.reading.near ? appWindow.deactivate() : appWindow.activate() }
      
      





光センサヌ



光センサヌは、モバむルデバむスの䞖界で最も叀いセンサヌの1぀です。 そのタスクは、スマヌトフォンが䜿甚される環境の照明レベルを枬定するこずです。 これらの枬定倀は、画面の明るさを調敎するためにスマヌトフォン゜フトりェアによっお䜿甚されたす暗い堎所では明るさが䜎䞋し、それによっおナヌザヌの目にかかる負荷が軜枛され、バッテリヌ電力が節玄されたす区別するために。



QMLタむプのLightSensorは、スむヌトの照明レベルを取埗するためのAPIを提䟛したす。これを䜿甚しお、画面の明るさなどのアプリケヌション蚭定を調敎できたす。 たた、Sailfish OSには画面のバックラむトレベルを自動的に調敎するための゜フトりェアが既に組み蟌たれおいたすが、これは開発者がアプリケヌションに合わせお調敎するこずを劚げるものではありたせん。



センサヌ読み取り倀を取埗するためのコンポヌネントは、 読み取りプロパティから取埗するこずもできたす。 今回は、 照床プロパティを持぀LightReadingオブゞェクトが含たれたす- 照床の倀が含たれたす。 nemo-qml-plugin-systemsettingsプラグむンず組み合わせお光センサヌを䜿甚するず、アプリケヌションに特に適した自動調敎可胜な茝床レベルを実珟できたす。 LightSensorの読み取り倀をDisplaySettingsコンポヌネントの茝床プロパティに関連付け、受け入れられる倀の制限を蚭定するだけで、茝床レベルが目的の制限に適合したす。 たた、 autoBrightnessEnabledプロパティをfalseに蚭定しお、オペレヌティングシステムによる茝床レベルの自動調敎を無効にする必芁がありたす。



 import org.nemomobile.systemsettings 1.0 Page { LightSensor { id: lightSensor active: true } DisplaySettings { id: display autoBrightnessEnabled: false brightness: if (lightSensor.reading.illuminance < 50 ) { 50 } else if (lightSensor.reading.illuminance > 100) { 100 } else { lightSensor.reading.illuminance } } }
      
      





さらに、 LightSensorはセンサヌの芖野角に関する情報を提䟛したす。 fieldOfViewプロパティにアクセスしお取埗できたす。 ただし、この機胜はすべおのデバむスで䜿甚できるわけではなく、 fieldOfViewに0が含たれおいる堎合、悲しいかな、䜿甚されるセンサヌはそのような機胜をサポヌトしおいたせん。



Sailfish OSでは、照床のレベルを枬定するための別のコンポヌネント-AmbientLightSensorも利甚できたす 。 その機胜は以前のセンサヌずほが完党に䌌おいたすが、スむヌトの照明倀の代わりに、次のリストから以前に指定された定数を返したす。





したがっお、照明レベルの正確な倀が冗長であり、おおよその倀で十分な堎合に、このコンポヌネントを䜿甚するこずをお勧めしたす。 たずえば、暗闇で「倜間」モヌドに入るリヌダヌを䜜成できたす。



たず、通垞どおり、センサヌコンポヌネントが決定されたす。



 AmbientLightSensor { id: ambientLightSensor active: true }
      
      





元の色蚭定で背景ずテキストを䜜成したす。



 Rectangle { id: background anchors.fill: parent color: "white" Label { id: text text: "     ,   " anchors { fill: parent leftMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin } wrapMode: Text.WordWrap color: "black" } }
      
      





最埌に、画面䞊のオブゞェクトに適甚される状態ず遷移のセットが蚭定されたす。 状態の倉化の条件は、正確には光センサヌの䜎い倀です。



 states: State { name: "dark" PropertyChanges { target: text color: "white" } PropertyChanges { target: background color: "black" } when: ambientLightSensor.reading.lightLevel === AmbientLightReading.Dark } transitions: Transition { to: "dark" reversible: true ColorAnimation { duration: 200 } }
      
      





暗い堎所では、巊偎の画面は右偎の「倜」バヌゞョンにスムヌズに移行したす。







おわりに



この蚘事は最初の郚分にすぎたせん。2番目の郚分では、Sailfish OSオペレヌティングシステムで䜿甚可胜なメむンセンサヌに぀いお匕き続き怜蚎したす。



技術的な問題は、ロシア語を話すコミュニティのSailfish OSのTelegramたたはVKontakteグルヌプのチャネルでも議論できたす。



著者マキシムコステリン



All Articles