Sailfish OSでシステムAPIを使用する

はじめに



モバイルデバイスの音声アシスタントは、止まらず、常に進化しています。 昨年秋に導入されたSailfish OSの音声アシスタントも例外ではなく、新しい機能を備えています。



その記事では、アプリケーションの内部操作の基本原則が考慮されました。 この資料では、さらに詳細に検討される一連の2つの記事を開きます。

  1. デバイス管理用の文書化されていないAPIを使用します(現在)。
  2. オペレーティングシステムが提供するD-Busインターフェイスを操作します。


この記事では、画面の明るさとシステムの音量を制御する方法、およびBluetoothのオン/オフとフライトモードをオンにする方法について説明します。



読者はすでにSailfish OS SDKをインストールし、それを使用してアプリケーションを開発したことが理解されています。



情報を取得する方法



Sailfish OSの開発中は、 公式WebサイトおよびIDEで提供されるドキュメントなしではできません。 ドキュメントは、高品質で、例とともに書かれていますが、欠点がないわけではありません-それは短く、プログラマが利用できる基本的な機能のみをカバーしています。



しかし、Sailfish OSは、他のオペレーティングシステムと同様に、ドキュメントに記載されている以上のものを隠しています。 あなたはどこを見ればいいかを知る必要があります。 そして、最も信頼できる情報源のように、ソースコードを調べる必要があります。 幸いなことに、Sailfish OSはGNU / Linuxに基づいたかなりオープンソースのソフトウェア製品です。



まず、SSH経由で電話に接続する必要があります(図1)。 これを行うには、リモート接続を有効にし(1)、パスワードを設定し(2)、指定したIPアドレスのいずれかを使用します(3)。 完了したステップの後、 /usr/share



ディレクトリに移動します。 このディレクトリには、電話機にインストールされているほとんどすべてのアプリケーションのインターフェイスコードとスクリプトが含まれています。



図1-SSHを介した電話への接続の設定。

[図1-SSHを介した電話への接続の設定。]



サードパーティのアプリケーションディレクトリは、(ほとんどの場合) harbour



プレフィックスで始まり、その後にプログラム識別子が続きます。 このプレフィックスは、名前とシステム名の交差を回避します。 標準アプリケーションのカタログには、接頭辞jolla



およびsailfish



が付いています。 残りはシステム機能に関連しています。



図2-アプリケーションディレクトリの例

[図2-アプリケーションディレクトリの例。]



画面の明るさ調整



画面の輝度制御はシステムのユーザー設定を参照するため、次のオブジェクトを含むディレクトリ/usr/share/jolla-settings



が重要です。



リストから、示されているタスクではpages



ディレクトリを参照する必要があることがpages



。 設定の種類に応じてサブディレクトリに分割されます: bluetooth



sounds



など。画面設定はdisplay



ディレクトリにあります。 したがって、 /usr/share/jolla-settings/pages/display



は、さらに作業が行われるフルパスです。



最初のステップは、キーワードで検索することです。

grep -H '明るさ' *
$ cd /usr/share/jolla-settings/pages/display

$ grep -H 'brightness' *

BrightnessSlider.qml: label: qsTrId("settings_display-la-brightness")

BrightnessSlider.qml: value: displaySettings.brightness

BrightnessSlider.qml: onValueChanged: displaySettings.brightness = Math.round(value)

BrightnessSlider.qml: onBrightnessChanged: slider.value = brightness

display.qml: id: brightnessSlider

display.qml: entryPath: "system_settings/look_and_feel/display/brightness_slider"

display.qml: text: qsTrId("settings_display-la-adaptive_brightness")








結果は、画面の明るさを調整するコードがBrightnessSlider.qml



ファイルにあることを示しています。



次に、制御が正確に実行される方法を明確にする必要があります。

grep -C 1 'displaySettings' ./BrightnessSlider.qml
$ grep -C 1 'displaySettings' ./BrightnessSlider.qml

label: qsTrId("settings_display-la-brightness")

maximumValue: displaySettings.maximumBrightness

minimumValue: 1

value: displaySettings.brightness

stepSize: 1



onValueChanged: displaySettings.brightness = Math.round(value)



DisplaySettings {

id: displaySettings

onBrightnessChanged: slider.value = brightness








ファイルを検索した後、デバイスの輝度を制御するには、 DisplaySettings



オブジェクトを作成し、 brightness



フィールドの値を変更する必要があります。最小輝度値は1であり、最大値はmaximumBrightness



フィールドに格納されることをmaximumBrightness



してmaximumBrightness







最後に、必要なインポートを決定します。

grep 'import' ./BrightnessSlider.qml
$ grep 'import' ./BrightnessSlider.qml

import QtQuick 2.0

import Sailfish.Silica 1.0

import com.jolla.settings.system 1.0

import org.nemomobile.systemsettings 1.0








QtQuick



Sailfish.Silica



はインターフェース開発の標準モジュールであり、設定へのアクセスを提供しません。 com.jolla.settings.system



は、設定アプリケーションが機能するための内部オブジェクトが含まれており、他のプログラムには関係ありません。 必要なコンポーネントを説明するorg.nemomobile.systemsettings



が残っています。



したがって、プロジェクトに後で含めるために、独自の画面輝度コントロールを形成することが可能になります。

BrightnessControl.qml
 import QtQuick 2.0 import org.nemomobile.systemsettings 1.0 Item { id: brightnessControl /*     . * @param: value --   1 ()  maximumBrightness () */ function setBrightness(value) { if (value <= 1) setMinimumBrightness(); else if (value >= displaySettings.maximumBrightness) setMaximumBrightness(); else displaySettings.brightness = value; } /*  . * @param: percents --    . */ function increaseBrightness(percents) { setBrightness(displaySettings.brightness + _calcDelta(percents)) } /*  . * @param: percents --    . */ function decreaseBrightness(percents) { setBrightness(displaySettings.brightness - _calcDelta(percents)) } /*   . */ function setMinimumBrightness() { displaySettings.brightness = 1 } /*   . */ function setMaximumBrightness() { displaySettings.brightness = displaySettings.maximumBrightness } /*    . * @param: percents --    . * @return:      . */ function _calcDelta(percents) { return Math.round(displaySettings.maximumBrightness / 100 * percents) } DisplaySettings { id: displaySettings } }
      
      







システム音量調整



よく知られている情報検索方法を使用します。 /usr/share/jolla-settings/pages/sounds



ディレクトリに移動し、キーワードを確認します。

grep -i -C 1 -H 'volume' *
$ cd /usr/share/jolla-settings/pages/sounds

$ grep -i -C 1 -H 'volume' *

SoundsPage.qml-

SoundsPage.qml: VolumeSlider {

SoundsPage.qml: id: volumeSlider

SoundsPage.qml: property string entryPath: "system_settings/look_and_feel/sounds/ringer_volume"

SoundsPage.qml- width: parent.width

--

VolumeSlider.qml- height: implicitHeight + valueLabel.height + Theme.paddingSmall

VolumeSlider.qml: //% "Ringtone volume"

VolumeSlider.qml: label: qsTrId("settings_sounds_la_volume")

VolumeSlider.qml- maximumValue: 100

--

VolumeSlider.qml- if (!externalChange) {

VolumeSlider.qml: profileControl.ringerVolume = value

VolumeSlider.qml- profileControl.profile = (value > 0) ? "general" : "silent"

--

VolumeSlider.qml- slider.externalChange = true

VolumeSlider.qml: slider.value = profileControl.ringerVolume

VolumeSlider.qml- slider.externalChange = false

--

VolumeSlider.qml-

VolumeSlider.qml: onRingerVolumeChanged: {

VolumeSlider.qml- slider.externalChange = true

VolumeSlider.qml: slider.value = profileControl.ringerVolume

VolumeSlider.qml- slider.externalChange = false








コマンドの結果は、最大許容ボリューム値が100、最小値が0であることを示しています。 また、制御はprofileControl



要素を使用して実行され、ボリューム値を指定するだけでなく、プロファイルを切り替えることも必要です。 上記の要素に関する詳細情報を取得します。

grep -C 1 'profileControl' ./VolumeSlider.qml
$ grep -C 1 'profileControl' ./VolumeSlider.qml

if (!externalChange) {

profileControl.ringerVolume = value

profileControl.profile = (value > 0) ? "general" : "silent"

}

--

slider.externalChange = true

slider.value = profileControl.ringerVolume

slider.externalChange = false

--

ProfileControl {

id: profileControl



--

slider.externalChange = true

slider.value = profileControl.ringerVolume

slider.externalChange = false

$ grep 'import' ./VolumeSlider.qml

import QtQuick 2.0

import Sailfish.Silica 1.0

import com.jolla.settings.system 1.0

import org.nemomobile.systemsettings 1.0








前のセクションの検索結果と情報に基づいて、システムボリュームを制御するモジュールを実装することが可能になります。

VolumeControl.qml
 import QtQuick 2.0 import org.nemomobile.systemsettings 1.0 Item { id: volumeControl /*     . * @param: value --   0 ()  100 (). */ function setVolume(value) { if (value <= 0) { setMinimumVolume(); } else if (value >= 100) { setMaximumVolume(); } else { profileControl.ringerVolume = value; _setProfile(); } } /*  . * @param: percents --    . */ function increaseVolume(percents) { setVolume(profileControl.ringerVolume + percents) } /*  . * @param: percents --    . */ function decreaseVolume(percents) { setVolume(profileControl.ringerVolume - percents) } /*   . */ function setMinimumVolume() { profileControl.ringerVolume = 0; _setProfile(); } /*   . */ function setMaximumVolume() { profileControl.ringerVolume = 100; _setProfile(); } /*      . */ function _setProfile() { profileControl.profile = (profileControl.ringerVolume > 0) ? "general" : "silent" } ProfileControl { id: profileControl } }
      
      







ここでは、システムのサウンドプロファイルを制御するために、キーワードgeneral



およびsilent



使用に注意する価値があります(それぞれ、mainおよびsilent)。 これらは、設定されたボリューム値に応じてシステムの動作を決定する2つの予約値です。



フライトモードとBluetoothを切り替える



APIの検索原理は上記のものとまったく同じなので、既製の要素の検討に直接進みます。



飛行モードを制御するには、 NetworkManagerFactory



コンポーネントを提供するMeeGo.Connman



モジュールを接続する必要があります。 このオブジェクトのinstance.offlineMode



フィールドの値をtrue



またはfalse



に設定することにより、指定されたモードをそれぞれオンおよびオフにすることが可能になります。

FlightControl.qml
 import QtQuick 2.0 import MeeGo.Connman 0.2 Item { id: flightControl /*   “ ”. */ function turnOnFlightMode() { connMgr.instance.offlineMode = true } /*   “ ”. */ function turnOffFlightMode() { connMgr.instance.offlineMode = false } /*   “ ”. */ function switchFlightMode() { connMgr.instance.offlineMode = !connMgr.instance.offlineMode } NetworkManagerFactory { id: connMgr } }
      
      







Bluetoothのステータスを制御するために、 MeeGo.Connman



モジュールも接続されていますが、 TechnologyModel



コンポーネントを使用し、 powered



フィールドの値がそれぞれtrue



またはfalse



を受け入れてBluetoothを有効または無効にします。 インターフェースの残りの作業は、 標準のQt機能を使用して行われることに注意してください。

BluetoothControl.qml
 import QtQuick 2.0 import MeeGo.Connman 0.2 Item { id: bluetoothControl /*  bluetooth. */ function turnOnBluetooth() { btTechModel.powered = true } /*  bluetooth. */ function turnOffBluetooth() { btTechModel.powered = false } /*  bluetooth. */ function switchBluetooth() { btTechModel.powered = !btTechModel.powered } TechnologyModel { id: btTechModel name: "bluetooth" } }
      
      







おわりに



この記事では、Sailfish OSで文書化されていない機能を検索する1つの方法を示し、輝度、音量、Bluetooth、および飛行モードを制御するためのコード例を示します。 GitHubで 、システム設定を管理するためのこれらおよびその他のモジュールの実装(およびそれらの使用方法)の詳細を学ぶことができます



ただし、完成したコードを見る前に、自分でモジュールを実装して接続し、公開されているサンプルと比較してみてください。 たとえば、デザインの変更( ambience



による検索)またはシステムフォントサイズ( fontSize



)の変更、Wi-Fiの制御( wifi



)、またはインターネットの共有( tethering



)を試すことができます。



次の記事では、D-BusがプログラマーにSailfish OSを提供するインターフェースと機能について説明します。



開発中に生じる質問やアイデアは、 TelegramチャットVKontakteグループでいつでも議論できます。



この記事とその後の記事を公開することを可能にした招待に対して、Haberraiser ragequitに感謝します。



All Articles