チュートリアル: Androidのデータソース¶
このチュートリアルでは、Android用の Kanzi アプリケーションのデータソースを作成する方法を学びます。次のことを学びます。
Kanzi Java API を使用してデータソースを作成します。
Android APIを使用してデータソースをバックアップします。
Android APIが利用できない場合に、Kanzi Studio Preview との互換性を確保してください。
このビデオはチュートリアルの結果を示しています。
このチュートリアルは、Androidアプリケーションの開発、Javaプログラミング言語に精通しており、Kanzi Studio の基本的な操作を理解していることを前提としています。Kanzi Studio に慣れるためのベストエントリーポイントは次のとおりです。
このチュートリアルを始める前に、Android用の Kanzi 開発環境がセットアップされていることを確認してください。Kanzi を使用した Android アプリケーション開発の要件 を参照してください。
このチュートリアルで作成したアプリケーションをAndroid仮想デバイスで実行するには、仮想デバイスを設定します。
API レベルを29以上に設定
内部ストレージを少なくとも8GBに
チュートリアルを入手する¶
チュートリアルを入手するには、Kanzi Studio Quick Start ウィンドウで Examples をクリックします。Android data source チュートリアルの横にある をクリックします。
Kanzi Studio はチュートリアルを <KanziWorkspace>/Tutorials ディレクトリにダウンロードします。以下が含まれています。
<KanziWorkspace>/Tutorials/Android data source/Assetsディレクトリにある、チュートリアルのアセット。<KanziWorkspace>/Tutorials/Android data source/Completedディレクトリにある、完成したチュートリアル。
一方向データソースを作成する¶
このセクションでは、Kanzi アプリケーションから読み取ることができるデータソースを作成します。Android デバイスのバッテリーレベルを表示するウィジェットを作成します。
一方向データソースを作成するには:
Kanzi Studio でプロジェクトを作成します。New Project ウィンドウで、次を設定します。
Name から Android data source へ
Template から Android application with Java plugin へ
このテンプレートを使用して、Kanzi Java API データソースの構築を開始します。
Android application with Java plugin テンプレートは、Kanzi Studio プロジェクトを作成し、Kanzi Android フレームワークベースのアプリケーションに Kanzi Engine Java プラグインを含んでいます。
Androidプラットフォーム用のアプリケーションを作成し、Android APIやサービスを広範囲に使用する場合は、Kanzi Android framework (droidfw) を使用してください。
Kanzi Android framework (droidfw) は、Android向けの Kanzi アプリケーションを開発するためのフレームワークです。Kanzi Java APIを公開しており、アプリケーションやプラグインのコードを完全にJavaまたはKotlinで記述することができます。C++やJNIコードを書く必要はありませんが、ネイティブの Kanzi プラグインを使用することは可能です。Kanzi Android framework (droidfw) は、複数の同時 Kanzi ベースのビューや Kanzi とAndroid UI要素の柔軟な構成を含む、Android UIとの強力な統合を提供します。Kanzi Android framework (droidfw) は、Android UIスレッドで Kanzi メインループタスクを実行するAndroid Choreographerと統合されています。これにより、ディスパッチャーメカニズムを必要とせずに、アプリケーションコードから Kanzi Java API を使用することができます。
Android Studio で:
Android data source/Application/configs/platforms/android_gradleプロジェクトを開きます。
androiddatasourceplugin>java>com.example.androiddatasourcepluginのJavaDataSourceクラスで、次の操作を行います。バッテリーレベルデータオブジェクトの名前を定義する定数を追加します。
static String BATTERY_LEVEL = "BatteryLevel";
initialize()メソッドで、既存のデータソース設定を置き換えます。root.addChild(DataObjectInt.create(domain, "Integer value", 1).get()); root.addChild(DataObjectString.create(domain, "String value", "dummy value").get()); root.addChild(DataObjectReal.create(domain, "Real value", 0.5).get());
以下に置き換えます。
root.addChild(DataObjectReal.create(domain, BATTERY_LEVEL, 0.5f).get());
androiddatasource > androiddatasourceplugin > Tasks > kanzi の Gradle ツールウィンドウで、exportJarDebug または exportJarRelease を右クリックし、Run を選択します。
exportJarDebug が表示されない場合は、Android Studio で Gradle プロジェクトを同期する必要があります。
Android Studio は、Kanzi Studio で使用する Kanzi Engine データソースプラグイン JAR をビルドします。
Kanzi Studio で、Android Studioで定義したデータソースの値を表示するコンテンツを作成します。
Node Tree で、Viewport 2D ノードを削除します。
このチュートリアルでは3Dコンテンツを作成しないため、Viewport 2D ノードを削除できます。
Rootpage で、Flow Layout 2D ノードを作成し、Controls と名付けます。
Properties で、Horizontal Alignment と Vertical Alignment プロパティを Center に追加して設定します。
Controls ノードの Node Tree で、Empty Node 2D ノードを作成し、Battery Widget と名付けます。Properties で、追加して設定します:
Layout Width から 150 へ
Layout Height から 200 へ
Asset Packages > Factory Content から、Progress Indicator を Node Tree の Battery Widget ノードにドラッグします。
Node Tree で、Progress Indicator プレハブプレースホルダを選択します。Properties で、追加して設定します。
Layout Width から 150 へ
Layout Height から 150 へ
Ring Thickness から 0.3 へ
Node Tree の Battery Widget ノードで、Text Block 2D ノードを作成します。Properties で、追加して設定します:
Horizontal Alignment から Center へ
Vertical Alignment から Bottom へ
Text から Battery へ
Kanzi Studio で、データソースを作成し、使用します。
Library > Kanzi Engine Plugins で Android_data_source プラグインを右クリックし、Update Kanzi Engine Plugin を選択します。
この方法で、Android Studio プラグインプロジェクトで行った変更を含むプラグインをロードして更新します。
プラグインの変更を反映するには、Preview を再起動してください。
Window メインメニューで、Data Sources を選択します。
Data Sources ウィンドウを使用して、プロジェクト内のデータソースを作成、設定、削除し、データソースからデータオブジェクトをプロジェクト内のノードやリソースに接続します。
Data Sources ウィンドウで、Create Data Source をクリックし、次の設定でデータソースを作成します。
Name から Android data source へ
Data Source Type から JavaDataSource へ
Data Sources ウィンドウでは、Android Studio で定義した BatteryLevel データオブジェクトを確認できます。
Node Tree で、RootPage ノードを選択します。Properties で、Data Context > Data Context プロパティを追加し、Android data source に設定します。
Data Context プロパティを設定することで、アプリケーションがどのデータソースからデータを受け取るかを指定します。ノードに Data Context プロパティを設定すると、そのノードのすべての子ノードは Data Context プロパティの値を継承します。子ノードの1つに異なるデータコンテキストを使用したい場合は、そのノードに Data Context プロパティを追加し、使用したいデータコンテキストに設定します。
Node Tree で、Progress Indicator ノードを選択します。Properties で、+ Add Binding をクリックし、Binding Editor で設定します。
Property から Progress へ
Expression へ
{DataContext.BatteryLevel} * 100Save をクリックします。
Kanzi Studio で、File > Export > Export KZB を選択します。
データソースを更新して、AndroidシステムAPIからバッテリーレベルを取得します。
Android APIを使用するデータソースは、Android APIが利用できないため、Windows上で Kanzi Studio Preview を終了させます。このチュートリアルのアプローチでは、Android上でAndroid APIを使用しつつ、Kanzi Studio Preview でプラグインを使用する際にデータソースがプレースホルダーデータを返すことを可能にする方法を示します。
Android Studioで、
DataProviderという名前のインターフェースを作成します。package com.example.androiddatasourceplugin; interface DataProvider { float getBatteryLevel(); }
インターフェースのプレースホルダ実装を非Androidプラットフォームで使用するために、
DummyDataProviderという名前のクラスを作成します。package com.example.androiddatasourceplugin; class DummyDataProvider implements DataProvider { @Override public float getBatteryLevel() { return 0.5f; } }
アプリケーションがAndroidデバイス上で実行されているときに使用するインターフェースのAndroid実装を作成するには、
AndroidDataProviderという名前のクラスを作成します。package com.example.androiddatasourceplugin; import android.content.Context; import android.os.BatteryManager; class AndroidDataProvider implements DataProvider { private final BatteryManager mBatteryManager; public AndroidDataProvider(Object context) { Context androidContext = (Context) context; mBatteryManager = (BatteryManager) androidContext.getSystemService(Context.BATTERY_SERVICE); } @Override public float getBatteryLevel() { int batLevel = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); return ((float) batLevel) / 100.0f; } }
新しいプロバイダーを使用するように
JavaDataSourceを更新します。作成したいコンテンツの機能を提供する Kanzi クラスをインポートします。
import com.rightware.kanzi.Platform;
データプロバイダーのためのデータメンバーを追加します。
private DataProvider mDataProvider;
initialize()メソッド内で、super.initialize();の直後に次のコードを追加して、データプロバイダを選択します:// Construct the proper DataProvider for the current platform. if (Platform.isAndroid()) { mDataProvider = new AndroidDataProvider(getDomain().getPlatformContext()); } else { mDataProvider = new DummyDataProvider(); }
バッテリーレベルデータオブジェクトの定義を更新して、インターフェースから値を取得します。
root.addChild(DataObjectReal.create(domain, BATTERY_LEVEL, mDataProvider.getBatteryLevel()).get());
Android Studioで、app をビルドして実行します。
アプリケーションをAndroidデバイスで実行すると、バッテリーウィジェットがそのデバイスの現在のバッテリーレベルを表示します。
双方向データソースを作成する¶
このセクションでは、AndroidデバイスのWi-Fi接続状態を制御するために使用できるウィジェットを作成します。
双方向データソースを作成するには:
Android Studioで、データソースを更新してWi-Fi関連情報を含めます。
DataProviderインターフェースに、以下を追加します。boolean isWifiEnabled(); boolean isNetworkConnected(); void setWifiEnabled(boolean enabled);
DummyDataProviderクラスに、次を追加します。private boolean mWifiEnabled = false; @Override public boolean isWifiEnabled() { return mWifiEnabled; } @Override public boolean isNetworkConnected() { return mWifiEnabled; } @Override public void setWifiEnabled(boolean enabled) { mWifiEnabled = enabled; }
AndroidDataProviderクラス内で:作成したいコンテンツの機能を提供するAndroidクラスをインポートします。
import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.net.NetworkCapabilities;
これらのメンバーを追加します:
private final ConnectivityManager mConnectivityManager; private final WifiManager mWifiManager;
これらのコンストラクタを変更してください:
mConnectivityManager = (ConnectivityManager) androidContext.getSystemService(Context.CONNECTIVITY_SERVICE); mWifiManager = (WifiManager) androidContext.getSystemService(Context.WIFI_SERVICE);
これらのメソッドを追加します。
@Override public void setWifiEnabled(boolean enabled) { mWifiManager.setWifiEnabled(enabled); } @Override public boolean isWifiEnabled() { return mWifiManager.isWifiEnabled(); } @Override public boolean isNetworkConnected() { NetworkCapabilities capabilities = mConnectivityManager.getNetworkCapabilities(mConnectivityManager.getActiveNetwork()); if (capabilities == null) return false; return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); }
JavaDataSourceクラスで、次の操作を行います。作成したいコンテンツの機能を提供する Kanzi クラスをインポートします。
import com.rightware.kanzi.DataObjectBool;
これらのメンバーを追加します:
static String NETWORK_CONNECTED = "NetworkConnected"; static String WIFI_ENABLED = "WifiEnabled";
initialize()関数でデータソースを更新します。root.addChild( DataObjectBool.create(domain, NETWORK_CONNECTED, mDataProvider.isNetworkConnected()).get()); ObjectRef<DataObjectBool> enabledRef = DataObjectBool.create(domain, WIFI_ENABLED, mDataProvider.isWifiEnabled()); root.addChild(enabledRef.get()); // Register a Notification handler to update Wi-Fi state when Data Source changes. DataObjectBool wifiEnabled = enabledRef.get(); wifiEnabled.addModifiedNotificationHandler(new ModifiedSubscriptionFunction() { @Override public void handle() { mDataProvider.setWifiEnabled(wifiEnabled.getValue()); } });
androiddatasourceplugin >
manifests>AndroidManifest.xmlおよび app >manifests>AndroidManifest.xmlファイルに、これらの権限を追加します。<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
androiddatasource > androiddatasourceplugin > Tasks > kanzi の Gradle ツールウィンドウで、exportJarDebug または exportJarRelease を右クリックし、Run を選択します。
Android Studio は、Kanzi Studio で使用する Kanzi Engine データソースプラグイン JAR をビルドします。
Kanzi Studio で、プラグインを更新します。
Library > Kanzi Engine Plugins で、AndroidDataSource プラグインを右クリックし、Update Kanzi Engine Plugin を選択します。
この方法で、Android Studio プラグインプロジェクトで行った変更を含むプラグインを更新してロードします。
プラグインの変更を反映するには、Preview を再起動してください。
Data Sources ウィンドウの Kanzi Studio で、Refresh ボタンをクリックして、プラグインから更新されたデータソースの内容を読み込みます。
Kanzi Studio で、Wi-Fiウィジェットのユーザーインターフェースを作成します。
Node Tree の Alt を押しながら右クリック で Controls ノードを作成し、Empty Node 2D ノードを作成して、Wi-Fi Widget と名付けます。Properties で、追加して設定します:
Layout Width から 150 へ
Layout Height から 200 へ
Layout.Item > Horizontal Margin プロパティ Left プロパティフィールドを 40 に
Node Tree の Alt を押しながら右クリック で Wi-Fi Widget ノードを作成し、Image ノードを作成して、Icon Connected と名付けます。Properties で、以下を追加して設定します。
Image を + Import Image... にして、
<KanziWorkspace>/Tutorials/Android data source/Assets/Wi-Fi-connected.pngを選択します。Layout Width から 150 へ
Layout Height から 150 へ
Properties で、バインディングを追加し、次を設定します。
Property から Visible へ
Expression へ
BOOL({DataContext.NetworkConnected})
Save をクリックします。
このバインディングを使用すると、NetworkConnected データオブジェクトの値が
trueのときに、Icon Connected 画像を表示します。
Node Tree で、Icon Connected ノードを複製し、Icon Disconnected に名前を変更します。
Node Tree で、Icon Disconnected ノードを選択します。Properties で:
バインディングをクリックし、Binding Editor でバインディング式の先頭に
!を追加します。Save をクリックします。
このバインディングを使用すると、NetworkConnected データオブジェクトの値が
falseのときに、Icon Disconnected 画像を表示します。
Image プロパティを + Import Image... に設定し、
<KanziWorkspace>/Tutorials/Android data source/Assets/Wi-Fi-disconnected.pngを選択します。
Asset Packages > Factory Content から、Toggle Button を Node Tree にドラッグし、Wi-Fi Widget にドロップします。
このトグルボタンを使用して、Wi-Fi接続を制御します。
Node Tree で、Toggle Button ノードを選択します。Properties で:
バインディングを作成して設定します:
Binding Mode から Two way へ
Property から Toggle State へ
Expression へ
{DataContext.WifiEnabled}
Save をクリックします。
このバインディングを使用すると、Toggle Button ノードのトグル状態と WifiEnabled データオブジェクトの間に双方向の接続を作成します。
Vertical Alignment プロパティを追加し、Bottom に設定します。
Kanzi Studio で、File > Export > Export KZB を選択します。
Android Studioで、app をビルドして実行します。
アプリケーションをAndroidデバイスで実行すると、Wi-FiウィジェットはそのデバイスのWi-Fi接続状況を示すアイコンを表示します。
外部の変更に基づいてデータソースをアップデートする (Update data sources based on external changes)¶
前のセクションでは、アプリケーションの起動時にAndroidデバイスから定数データを読み取る機能を追加しました。このセクションでは、データソースをAndroidのコールバックに応答するように設定し、Wi-Fiやバッテリーレベルが変化したときにデータソースを更新します。
外部の変更に基づいてデータソースを更新するには:
DataChangeListenerという名前のインターフェースを作成します。このインターフェースは、データの変更が発生したときにそれを受け入れます。
package com.example.androiddatasourceplugin; interface DataChangeListener { void updateBatteryLevel(float batteryLevel); void updateNetworkConnection(boolean isConnected); void updateWifiEnabled(boolean isEnabled); }
AndroidDataProviderクラスを修正して、Androidから更新されたデータを受け取るようにします。作成したいコンテンツの機能を提供するAndroidクラスをインポートします。
import android.content.BroadcastReceiver; import android.net.Network; import android.content.Intent; import android.content.IntentFilter;
DataChangeListenerへの参照を保持するメンバーを追加します。private final DataChangeListener mDataChangeListener;
AndroidDataProviderのコンストラクタを修正して、DataChangeListenerを受け取り、保存するようにします。public AndroidDataProvider(Object context, DataChangeListener listener) { mDataChangeListener = listener;
Wi-Fi状態とバッテリーレベルのリスナーコールバックを追加します。
// Battery level listener private final BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryLevel = level / (float) scale; mDataChangeListener.updateBatteryLevel(batteryLevel); } }; // Wi-Fi state listener that indicates whether Wi-Fi is enabled. private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int wifiStateExtra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); switch (wifiStateExtra) { case WifiManager.WIFI_STATE_ENABLED: mDataChangeListener.updateWifiEnabled(true); break; case WifiManager.WIFI_STATE_DISABLED: mDataChangeListener.updateWifiEnabled(false); break; } } }; // Network state listener that indicates whether Internet connection is available. private final ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); NetworkCapabilities capabilities = mConnectivityManager.getNetworkCapabilities(network); if (capabilities != null) { mDataChangeListener.updateNetworkConnection(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)); } } @Override public void onLost(Network network) { super.onLost(network); mDataChangeListener.updateNetworkConnection(false); } };
Androidにコールバックを登録するには、このコードを
AndroidDataProviderのコンストラクタに追加してください。// To get battery changes, register the battery receiver. androidContext.registerReceiver(mBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); // To get the Wi-Fi connectivity state changes, register the Wi-Fi state receiver. IntentFilter intentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); androidContext.registerReceiver(mWifiStateReceiver, intentFilter); // Listen to the connectivity state changes. mConnectivityManager.registerDefaultNetworkCallback(mNetworkCallback);
データの更新を処理するように
JavaDataSourceクラスを変更します。クラスを変更して、
DataChangeListenerインターフェースを実装します。public class JavaDataSource extends DataSource implements DataChangeListener {
DataChangeListenerインターフェースの実装を追加します。private boolean mUpdateInProgress = false; @Override public void updateBatteryLevel(float batteryLevel) { DataObjectReal batteryObject = (DataObjectReal) mRoot.get().lookupDataContext(BATTERY_LEVEL); if (batteryObject != null) { mUpdateInProgress = true; batteryObject.setValue(batteryLevel); mUpdateInProgress = false; } } @Override public void updateNetworkConnection(boolean isConnected) { DataObjectBool networkConnected = (DataObjectBool) mRoot.get().lookupDataContext(NETWORK_CONNECTED); if (networkConnected != null) { mUpdateInProgress = true; networkConnected.setValue(isConnected); mUpdateInProgress = false; } } @Override public void updateWifiEnabled(boolean isEnabled) { DataObjectBool wifiEnabled = (DataObjectBool) mRoot.get().lookupDataContext(WIFI_ENABLED); if (wifiEnabled != null) { mUpdateInProgress = true; wifiEnabled.setValue(isEnabled); mUpdateInProgress = false; } }
initialize()メソッドで、thisをAndroidDataProviderコンストラクタの引数として追加します。mDataProvider = new AndroidDataProvider(getDomain().getPlatformContext(), this);
initialize()メソッドでは、再帰的な更新を防ぐために、既存の通知ハンドラーを修正してmUpdateInProgress変数を追加します。wifiEnabled.addModifiedNotificationHandler(new ModifiedSubscriptionFunction() { @Override public void handle() { if (!mUpdateInProgress) { mDataProvider.setWifiEnabled(wifiEnabled.getValue()); } } });
Android Studioで、app をビルドして実行します。
アプリケーションをAndroidデバイスで実行すると、ネットワーク接続状態が変化したときにWi-Fiウィジェットが更新されます。これをテストするには、デバイスのユーザーインターフェースを通じてネットワーク接続を有効または無効にするか、Wi-Fiウィジェットのトグルボタンを使用してください。
注釈
Android 10 (API 29) 以降、通常の Android アプリケーションは Wi-Fi の状態を変更できません。そのため、Android 10 以降のデバイスでは Wi-Fi ウィジェットのトグルボタンは動作しません。
次の作業¶
このチュートリアルでは、次の方法を学びました:
Kanzi Java API を使用してデータソースを作成します。
Android APIを使用してデータソースをバックアップします。
Android APIが利用できない場合に、Kanzi Studio Preview との互換性を確保してください。
Kanzi Android framework (droidfw) とJava APIの使用方法の詳細については、次を参照してください。
関連項目¶
Kanzi アプリケーションを Android 向けに開発する方法の詳細については、Kanzi アプリケーションをAndroid向けに開発する を参照してください。
Java Kanzi Engine API の使用方法について詳しくは、Java と Kotlin を使用して を参照してください。