アプリ開発と実行(Android)

アプリ開発環境設定

nexacroのAndroidアプリは、Androidアプリの開発ツールであるAndroid Studioを利用して開発したり、nexacroの製品群の一つであるアプリビルダー(App Builder)を利用して開発することができます。この章では、Android Studioを利用してアプリを開発する方法について説明します。基本的な開発手順は、一般的なAndroidアプリを作成する方法と同じです。

既にアプリの開発環境が設定されている場合は、アプリの開発環境の設定をスキップすることができます。

Android Studioセットアップファイルは、基本的にSDKツールが含まれています。下記のサイトにて、環境に応じてインストールファイルをダウンロードすることができます。

https://developer.android.com/studio/index.html

この章では、Android Studioバージョン4.1.1のインストールを基準に作成しました。

アプリプロジェクト開発

アプリ開発環境が設定された場合、Android Studioを実行してAndroid OSで動作するアプリを作成することができます。アプリプロジェクトを進行する前に、nexacro studioで生成したアーカイブファイルは、指定したパスに配置する必要があります。

プロジェクト生成

1

既存の開いているプロジェクトがない場合は、クイックスタート(Quick Start)ウィンドウで新しいプロジェクトを生成します。下図で、[Create New Project]を選択します。

android_studio_3.0_open_project

他のプロジェクトの作業中に、新しいプロジェクトを生成する場合は、下記のメニューで生成することができます。

File > New > New Project

2

Androidで提供されるプロジェクトテンプレートを選択します。

選択したテンプレートに基づいて、構造、画面レイアウト、ファイルなどの構成が異なります。ここでnexacroアプリを追加のための基本的なアプリ形で十分なのでEmpty Activityを選択して、[Next]ボタンをクリックします。

android_studio_add_an_activity_empty

3

アプリの名前、パッケージ名、プロジェクトのパスを設定します。

android_studio_create_project


項目

説明

1

Name

生成するアプリの名前を入力します。

2

Package Name

パッケージ名を入力します。

3

Save location

プロジェクトを保存する場所を指定します。

4

Language

開発言語を選択します。デフォルトはkotlinでありますが、この章ではJavaに設定します。

5

Minimum API

最小仕様SDKを設定します。SDKの項目を変更すると、下部で該当バージョンAPIレベルのデバイスの互換性に関する情報を確認できます。

nexacroでサポートするAndroidの最低仕様は、5.0バージョンです。したがってSDK設定時にAPIレベル21以上をサポートするSDKを使用する必要があります。

4

[Finish]ボタンをクリックすると、プロジェクトが生成されます。

プロジェクトウィンドウが表示され、必要なファイルは自動的にダウンロードしてインストールします。

5

Android Studioに含まれているJDKを設定します。

メニューの[File>Project Structure]から「JDK location」を選択して、「Embedded JDK」を選択します。

nexacroライブラリ設定

アプリの開発時に使用できるように提供されているnexacro Androidアーカイブ(AAR)ファイルをAndroidプロジェクトに設定します。別の設定は必要ありません。決められたパスにコピーします。

ファイル

パス

Androidアーカイブ(nexacro.aar)

[プロジェクトパス]\app\libs\

ライブラリファイルを実際のプロジェクトフォルダの指定された場所にコピーするには、プロジェクトウィンドウの上部でビューオプションを[Project]に変更します。Android Studioをインストールした後、デフォルトビューモードを[Android]から[Project]に設定すると、フォルダ構造を確認することができます。

android_studio_project_explorer

1

nexacro.aarファイルは[プロジェクトパス > app > libs]フォルダにコピーします。

archive_library_설정

コピーは、ファイルエクスプローラで、Android Studioに直接コピー/貼り付けが可能です。それぞれのパスにファイルを貼り付けたときに、下図のようにファイル名とパスを変更することができるCopyウィンドウが表示されますが、内容を変更せずに「OK」ボタンをクリックします。

so파일복사

2

メニュー[File > Project Structure]から「Dependencies」を選択し、Modules項目から「app」を選択した後、「+」ボタンをクリックして「Jar Dependency」項目を選択します。

3

aarファイルパスを入力し、[OK]ボタンをクリックします。

4

app > build.gradleファイルにaarファイルが追加されていることを確認します。

リソース設定

アプリで使用するロード画像、アイコン、メッセージ、レイアウトなどを設定するための手順です。リソースファイルを端末の画面サイズ、密度に応じて作成した後、適切なフォルダに配置すると、Androidシステムは、ユーザに最適化されたビューを提供します。

基本リソースはnexacro Androidアーカイブ(AAR)ファイルに含まれています。基本リソースを利用する場合には別途設定は不要です。

リソースに関する詳細は、Androidマニュアルを参照してください。

https://developer.android.com/guide/topics/resources/providing-resources

画像設定

アプリで使用する画像は、resフォルダの下に密度に応じて適切なフォルダに指定します。たとえば、ロード画像はdrawableフォルダに、アプリアイコンはmipmapフォルダに指定します。適用する画像ファイルは、アプリがサポートする解像度に応じて別々にフォルダを設定する必要があります。

項目

説明

ic_launcher.png

デスクトップにインストールされるアプリのアイコン画像です。

AndroidManifest.xmlファイルにてファイル名を変更することができます。

splashimage_phone_landscape.png

Android携帯の横向きスプラッシュ画像です。(すべて小文字)

splashimage_phone_portrait.png

Android携帯の縦向きスプラッシュ画像です。(すべて小文字)

splashimage_pad_landscape.png

Androidタブレットの横方向スプラッシュ画像です。(すべて小文字)

splashimage_pad_portrait.png

Androidタブレットの縦方向スプラッシュ画像です。(すべて小文字)

ランチャーアイコン、ロード画像などを別途指定しない場合は、デフォルト設定が適用されるので、アプリの動作に問題はありません。

文字列設定

基本文字列の設定はnexacro Androidアーカイブ(AAR)ファイルに含まれたstrings.xmlファイルの設定によって適用されます。基本文字列の設定を変更する場合はresフォルダ配下のvalues、values-ko、 values-ja、values-zhフォルダにstrings.xmlファイルを作成してから、変更したい項目のみ設定してください。

下記のコードはnexacro Androidアーカイブファイルに含まれたstrings.xmlファイルの内容です。配布バージョンによって内容が異なることがあります。

$r_title(values-ja\strings.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="AddManifest_Permission">Manifestファイルに権限を追加したり、アクセスを許可します。</string>
    <string name="Additional_Permission">追加の権限の認証が必要です。</string>
    <string name="AllowUse_Permission">この機能を使用するには、アクセスを許可します</string>
    <string name="Allow_Permission">エンジンの更新の正常な機能のために適切な権限が必要だから権限を付与します。</string>
    <string name="Allow_StoragePermission">アプリケーション設定のアプリの権限で*ストレージ*アクセスを許可します。</string>
    <string name="BeingUpdated">アップデート中です。</string>
    <string name="Denied_Permission">エンジンの更新権限を拒否に終了します。</string>
    <string name="Init_nexacro_engine">nexacroエンジンを初期化します</string>
    <string name="LoadingPleaseWait">ローディング 。。。\nお待ちください。</string>
    <string name="check_license">ライセンスチェック</string>
    <string name="checkforupdates">アップデート確認中です。</string>
    <string name="copy">コピー</string>
    <string name="cut">カット</string>
    <string name="downloadingforupdates">アップデートダウン中です。</string>
    <string name="execute_frameworkscript">フレームワークスクリプトの実行</string>
    <string name="executing_framework">アプリケーションをロードします(フレームワークを実行します)</string>
    <string name="exit">出口</string>
    <string name="fd_cancel">キャンセル</string>
    <string name="fd_ok">確認</string>
    <string name="filter">フィルター</string>
    <string name="force_close">アップデートが完了しました。</string>
    <string name="home">ホーム</string>
    <string name="installforupdates">アップデート設置中です。</string>
    <string name="load_application">応用プログラムロード</string>
    <string name="load_bootstrap">アプリケーションをロードします(ブートストラップ)</string>
    <string name="load_extendmodule">拡張モジュールロード</string>
    <string name="load_failapplication">ADLファイルロード失敗. クリックすると閉じます</string>
    <string name="load_frameworkmodule">フレームワークモジュールのロード</string>
    <string name="loadingFail">初期ロードに失敗しました。\n再起動してください。</string>
    <string name="loading_application">アプリケーションをロードします(アプリケーションをロードします)</string>
    <string name="move">移動</string>
    <string name="needupdate">アップデートがあります。\n完了した後に, 再起動してください。</string>
    <string name="nofilename">ファイル名がありません。</string>
    <string name="notexist">起動ファイルがありません。\n再起動してください。</string>
    <string name="paste">貼り付け</string>
    <string name="preparing_framework">アプリケーションをロードします(フレームワークを準備します)</string>
    <string name="selectall">全て選択</string>
    <string name="selectword">単語選択</string>
    <string name="ssl_invalid">SSL証明書が有効ではありません。続きますか。</string>
    <string name="start_initialize">初期化</string>
    <string name="updateFail">アップデートが失敗しました。\n再起動してください。</string>
    <string name="upper">上位</string>
    <string name="wantreplace">同一のファイル名があります。上書きしますか?</string>
</resources>

文字列は、ユーザーの状況に合わせて変更することができます。ただし、上記に定義された文字列のnameは、アプリで固定的に使用するため、変更しません。

英語文字列ではない日本語や韓国語などの文字列を追加するには、resフォルダの下にvalues-ja、values-koのようにフォルダを追加して、strings.xmlファイルを追加します。詳細については、Androidマニュアルを参照してください。

https://developer.android.com/training/basics/supporting-devices/languages.html

レイアウト設定

基本レイアウトの設定は、nexacro Androidアーカイブ(AAR)ファイルに含まれたnexacro_app.xml ファイルの設定によって適用されます。の設定を変更する場合は、layoutフォルダにnexacro_app.xml ファイルを作成してから設定してください。レイアウトファイルの新規追加は[File > New > XML > Layout XML File]より行います。

下記のコードはnexacro Androidアーカイブファイルに含まれたnexacro_app.xmlファイルの内容です。配布バージョンによって、内容は異なることがあります。

$r_title(layout\nexacro_app.xml)

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nexacro_activity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

    <com.nexacro.view.NexacroLayout
        android:id="@+id/nexacro_layout"
        android:background="@android:color/transparent"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.nexacro.view.NexacroLayout>

</FrameLayout>

フォント設定

Packing Update Type項目で「Update(Local+Server)」もしくは「Local」を指定している場合、Resourceタブで設定したUserFontを使用することができます。ただし、Update Type項目で「Server」を指定している場合はResourceタブで設定したUserFontを使用できずAndroid StudioのProjectでassetsフォルダ配下にfontsフォルダを作成してフォントファイルも併せてビルドする必要があります。

assetsフォルダでフォントファイルを配布する方式は21.0.0.1200以降のバージョンでサポートする機能です。

Android Studioでフォントを設定する手順は以下の通りです。

1

nexacro studioでUserFontファイルを作成します。

UserFontファイル作成の詳細についてはUserFontファイル作成 をご参照ください。

2

xfontファイルに「local("Font Name")」形式でスクリプトを作成します。

@font-face {
  font-family : 'NOTO';
  font-style : normal;
  src : local("NotoSansCJKkr-Regular");
}

@font-face {
  font-family : 'NOTO';
  font-style : normal;
  src : local("NotoSansCJKkr-Bold");
}

3

Android StudioのProjectで、assetsフォルダ配下にfontsフォルダを作成し、適用したいフォントファイルを格納します。

4

Android Studioでアプリをビルドします。

Update Type項目で「Update(Local+Server)」もしくは「Local」を指定している場合、assets\fonts フォルダ配下にフォントファイルを格納し、Resourceにも同じフォントファイルを設定すると、assets\fontsフォルダのファイルが先に適用されますが、最終的にはResourceで設定しているファイルで処理されるため、同じ作業が重複して処理されないようにご注意ください。

Config設定

基本Configの設定は、nexacro Androidアーカイブ(AAR)ファイルに含まれたnexacro_config.xmlファイルの設定によって適用されます。Configの設定を変更する場合は、xmlフォルダに nexacro_config.xmlファイルを作成してから設定してください。

下記のコードはnexacro Androidアーカイブファイルに含まれたnexacro_config.xmlファイルの内容です。配布バージョンによって、内容は異なることがあります。

$r_title(xml\nexacro_config.xml)

<?xml version="1.0" encoding="UTF-8"?>
<nexacro-config>
    <application style="default" dialog-position="bottom" file-logging="true" quiet="false" loglevel="debug" tracemode="none" traceduration="-1"/>
    <notification enable="true" handler="com.nexacro.notification.DefaultHandler"/>
    <xpush-server request-missing-message="false" sender-id="1234567890"/>
    <updator cancelable="true" force="true" restart="false" errormsg="true" quiet="false" failpass="true"/>
    <log filepath="%SD_CARD%nreLog.log" filesize="408960" backupfilecount="5"/>
</nexacro-config>

nexacro_config.xmlに設定できる機能は、下記のとおりです。

機能

属性

設定値

説明

application

dialog-position

"top" | "center" | "bottom"

アプリアップデートの進行情報を表示するポップアップの位置を設定します。

file-logging

"true" | "false"

ロードエラー情報のファイルを保存するかどうかを設定します。

「true」に設定時、外部ストレージ(context.getExternalCacheDir())に保存して、設定されたパスが存在しない場合は、内部ストレージ(context.getCachePath())に保存します。

ファイルは、[ストレージのパス]/logs/yyyy_MM_dd.txt形式で保存されます。

quiet

"true" | "false"

アプリ実行ポップアップを表示するかどうかを設定します。

「true」に設定時、「Loading Application」の実行メッセージが出力されません。

updator

force

"true" | "false"

start_android.jsonにアップデートファイルの情報が存在する場合、ポップアップを表示するかどうかを設定します。

「true」に設定時、ポップアップ通知なしで、強制的にアップデートを行います。

cancelable

"true" | "false"

アップデートファイルが存在する場合、ポップアップにアップデートキャンセルボタンを表示するかどうかを設定します。

[キャンセル]ボタンをクリックすると、アップデートを行わずに、アプリを実行します。

errormsg

"true" | "false"

アプリのロードに失敗したときにエラー情報をポップアップで表示するかどうかを設定します。

quiet

"true" | "false"

アップデートポップアップを表示するかどうかを設定します。

「true」に設定しても、アップデートファイルが存在する場合、進行段階は表示されます。

failpass

"true" | "false"

アップデートエラーを無視するかどうかを設定します。

xpush-server

request-missing-message

"true" | "false"

xpushサーバーに未受信メッセージを自動的に要求するかどうかを設定します。

notification

enable

"true" | "false"

通知機能を使用するかどうかを設定します。

handler

“[関数名]”

通知の受信時にメッセージやデータ処理のための関数を設定します。

デフォルト値は「com.nexacro.notification.DefaultHandler」です。

file-loggingプロパティの[ストレージのパス]の場所の詳細については、下記のリンクを参照してください。


https://developer.android.com/reference/android/content/Context.html#getExternalCacheDir()

https://developer.android.com/reference/android/content/Context.html#getCacheDir()

ビルド環境設定

Androidプロジェクトの生成時にデフォルトで作られたMainActivity.javaファイルとAndroidManifest.xmlファイルをnexacro環境に合わせて変更します。

MainActivity.java

プロジェクトの生成時にアクティビティ名を指定しますが、別に変更しない場合は、MainActivity.javaという名前で生成されます。[プロジェクト>app>src>main>java]フォルダで指定されたパッケージ名の下にMainActivity.javaファイルを選択して、下記のように変更します。

$r_title(MainActivity.java)


package com.example.helloandroid;

import com.nexacro.NexacroResourceManager;
import com.nexacro.NexacroUpdatorActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends NexacroUpdatorActivity {

    public MainActivity() {
        super();

        setBootstrapURL("http://[URL]/start_android.json");
        setProjectURL("http://[URL]/");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        NexacroResourceManager.createInstance(this);
        NexacroResourceManager.getInstance().setDirect(false);

        Intent intent = getIntent();
        if(intent != null) {
            String bootstrapURL = intent.getStringExtra("bootstrapURL");
            String projectUrl = intent.getStringExtra("projectUrl");
            if(bootstrapURL != null) {
                setBootstrapURL(bootstrapURL);
                setProjectURL(projectUrl);
            }
        }

        super.onCreate(savedInstanceState);
    }

    @Override
    public void setContentView(View view) {
        super.setContentView(view);
    }

}

上記のコードで太字で表示されている部分は、ユーザーが環境に合わせて変更する必要があります。

15〜16行は、ブートストラップアドレスとプロジェクトソースのアドレスを設定する部分です。setBootstrapURLメソッドの引数は、nexacro studioで作成されたstart_android.jsonファイルが配置されたサーバーのURLを指定して、setProjectURLメソッドの引数は、該当プロジェクトのソースがジェネレートされたパスを指定します。ジェネレートソースのパスの先に「/」を付けます。

15 setBootstrapURL("http://192.168.0.1:8080/nexacro/_android_/start_android.json");
16 setProjectURL("http://192.168.0.1:8080/nexacro/_android_/");

22〜23行は、アプリのUpdate Typeに応じて変更します。Update Typeはnexacro studioでPacking(Archive&Update)時に設定しますが、Update Typeが「Server」である場合には、23行のsetDirectメソッドの引数を下記のように「true」に設定します。Update Typeが「Update(Local+Server)」もしくは「Local」タイプである場合には、「false」に設定します。

22 NexacroResourceManager.createInstance(this);
23 NexacroResourceManager.getInstance().setDirect(true);

ブートストラップURL、プロジェクトURL、リソースマネージャを誤って設定すると、アプリが正常に動作しない場合がありますのでご注意ください。

onCreate内でsetScreenidメソッドを使用すると、screenidを目的の値に設定することができます。

public void onCreate(Bundle savedInstanceState) {
    NexacroResourceManager.createInstance(this);
    NexacroResourceManager.getInstance().setScreenid("Tablet_screen");
}

AndroidManifest.xml

AndroidManifest.xmlファイルは、[プロジェクト>app>src>main]に位置し、アプリの基本的な情報と、特定機能の実行時に必要な情報を含んでいます。基本的に必要な情報は、下記のコードを参考にして作成します。下記の内容にて、太字のpackage、MainActivityについては、プロジェクトの設定に基づいて指定する必要があります。

$r_title(AndroidManifest.xml)


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloandroid">

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- network access Permission -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

	<!-- storage access permission -->
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />

    <application android:label="@string/app_name"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hasCode="true"
        android:hardwareAccelerated="true"
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true">

        <activity
            android:name="com.example.helloandroid.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.nexacro.NexacroActivity"
            android:alwaysRetainTaskState="true"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoTitleBar"
            android:windowSoftInputMode="adjustResize" >
        </activity>
    </application>

</manifest>

targetsdkバージョンを28以上に指定した場合にHTTP通信を維持するためには、usesCleartextTraffic値を「true」に指定する必要があります。

該当設定が存在しない場合は、デフォルト値が「false」に適用されてHTTP通信が許可されません。

https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic


<application

android:allowBackup="true"

android:usesCleartextTraffic="true"

AndroidManifest.xml > 追加権限の設定

配布するアプリの機能に応じて、必要な権限とその他の情報を追加で指定します。例えば、カメラ機能を使用する場合は、下記のような項目を追加する必要があります。

...
<uses-permission android:name="android.permission.CAMERA" />
<activity android:name="com.nexacro.deviceAPI.CameraListener"
	android:screenOrientation="landscape">
	<intent-filter>
   		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus"
	android:required="false"/>
...

下記は、よく使用される機能の権限設定のコードです。必要な項目のみAndroidManifest.xmlファイルに追加します。このほか、Androidで定義したすべての権限のリストを表示するにはManifest.permissionを参照してください。

機能に必要な権限を設定しない場合、アプリを起動する時に該当権限がないというメッセージと同時に機能が動作しません。

<!-- AudioPlayer, AudioRecorder -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- Call -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- Contact -->
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- Camera -->
<uses-permission android:name="android.permission.CAMERA" /> 
<activity android:name="com.nexacro.deviceAPI.CameraListener" android:screenOrientation="landscape">
	<intent-filter>
    	<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<!-- Geolocation -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- Map -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-library android:name="com.google.android.maps" /> 
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="user value" />

Googleマップを使用するには、API KEY値を受けて入力する必要があります。詳細については、下記のリンクを参照してください。

https://developers.google.com/maps/documentation/android/start#obtain_a_google_maps_api_key

<!-- SMS -->
<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.WRITE_SMS" />

<receiver android:name="com.nexacro.deviceAPI.SmsRecv">
	<intent-filter>
		<action android:name="android.provider.Telephony.SMS_RECEIVED" />
	</intent-filter>
	<intent-filter>
		<action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
		<data android:mimeType="application/vnd.wap.mms-message" />
	</intent-filter>
</receiver>
<!-- Vibrator -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- Bluetooth -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<service
	android:name="com.nexacro.deviceAPI.BluetoothLEAdapterService"
	android:enabled="true"
	android:exported="true">
</service>
<!-- ExternalAPI -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- Etc -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

AndroidManifest.xml > FCMの設定

About FCM messages

https://firebase.google.com/docs/cloud-messaging/concept-options

<!-- Adding NexacroNotificationService -->
<service android:name="com.nexacro.notification.NexacroNotificationService">
	<intent-filter>
		<action android:name="com.google.firebase.MESSAGING_EVENT" />
	</intent-filter>
</service>

<!-- Adding NexacroActivity intent-filter -->
<activity android:name="com.nexacro.NexacroActivity"
	android:launchMode="singleTask"
	android:noHistory="false"
	android:hardwareAccelerated="true"
	android:windowSoftInputMode="adjustResize"
	android:configChanges="orientation|keyboard|keyboardHidden|screenSize|navigation|uiMode">
	<intent-filter>
		<action android:name="OPEN_NEXACRO_ACTIVITY_EXAMPLE" />
		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
</activity>

FCMサービスを利用する場合には、build.gradle設定に下記の項目を追加する必要があります。Android Studioで自動的に設定されてなければ、確認後に追加してFirebaseコンソールで作成した「google-services.json」ファイルをモジュールのパスにコピーします。

AndroidプロジェクトにFirebaseを追加

https://firebase.google.com/docs/android/setup

buildscript {
	// Adding repositories 
	repositories {
		google()  
		jcenter()
	}
	dependencies {
		classpath 'com.android.tools.build:gradle:3.2.1'
		// NOTE: Do not place your application dependencies here; they belong
		// in the individual module build.gradle files
		// Adding google service
		classpath 'com.google.gms:google-services:4.0.1'
	}
}

allprojects {
	// Adding repositories 
	repositories {
		google()
		jcenter()
	}
}

task clean(type: Delete) {
	delete rootProject.buildDir
}

dependencies {
	implementation fileTree(include: ['*.jar'], dir: 'libs')
	implementation 'com.android.support:appcompat-v7:27.1.1'
	implementation 'com.android.support:support-v4:27.1.1'
	implementation 'com.google.android.gms:play-services-maps:16.0.0'
	implementation 'com.google.android.gms:play-services-location:16.0.0'
	implementation 'com.google.firebase:firebase-core:16.0.6'
	implementation 'com.google.firebase:firebase-messaging:17.3.4'
	compile 'com.android.support:multidex:1.0.3'
	implementation 'com.android.support:design:27.1.1'
	implementation files('libs/nexacro.aar')
}
apply plugin: 'com.google.gms.google-services'

targetsdkバージョンを28以上に指定した場合には、play-servicesバージョンも一緒に変更する必要があります。

implementation 'com.google.android.gms:play-services-maps:16.1.0'

implementation 'com.google.android.gms:play-services-location:16.1.0'

AndroidManifest.xml > ImagePicker、Camera、FileUpload、FileDailogの設定

下記の内容は17.1.3.300以降のバージョンで適用された機能です。

targetsdkバージョンを24以上に指定し、ImagePicker、FileDialog、FileUpload、Cameraコンポーネントを使用する場合(Cameraコンポーネントはtargetsdkバージョン29以上)には、res/xmlフォルダの配下にfile_paths.xmlファイルを作成し、AndroidManifest.xmlファイルとbuild.gradleファイルに下記の項目を追加する必要があります。

WebBrowserコンポーネント内で呼び出しているHTMLコンテンツにて、Inputタグのcapture属性を使用する場合にファイルにアクセスするためには、res/xmlフォルダーの配下にfile_paths.xmlファイルを作成し、AndroidManifest.xmlファイルとbuild.gradleファイルに下記の項目を追加する必要があります。

$r_title(file_paths.xml)
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-cache-path name="cache" path="."/>
    <external-files-path name="files" path="./"/>
</paths>
$r_title(AndroidManifest.xml / FileProvider)
<provider
	android:name="android.support.v4.content.FileProvider"
	android:authorities="${applicationId}.fileprovider"
	android:exported="false"
	android:grantUriPermissions="true">
	<meta-data
		android:name="android.support.FILE_PROVIDER_PATHS"
		android:resource="@xml/file_paths"/>
</provider>

<!-- AndroidX -->
<provider
	android:name="androidx.core.content.FileProvider"
	android:authorities="${applicationId}.fileprovider"
	android:exported="false"
	android:grantUriPermissions="true">
	<meta-data
		android:name="android.support.FILE_PROVIDER_PATHS"
		android:resource="@xml/file_paths"/>
</provider>
$r_title(build.gradle / exifinterface)

dependencies {
    implementation 'com.android.support:exifinterface:28.0.0'
	//AndroidX
	implementation 'androidx.exifinterface:exifinterface:1.3.2'
}

ネットワーク未接続状態でのアプリ起動方式の設定

nexacro studioでアプリをパッキングする際にUpdate TypeをLocalやUpdate(Local+Server)に設定すると、ネットワーク接続がなくてもアプリを起動することができます。一般的にネットワーク接続が必要ない場合にはLocalタイプを使用しますが、ネットワークに接続している状態でアプリを起動した後にローカルファイルでアプリが動作する必要がある場合にはUpdate(Local+Server)タイプを使用することができます。このようにネットワーク接続が必要ないか、もしくは問題発生時にアプリ単独で起動可能にするためにはアプリのビルド時に、起動に必要なファイルをロードして配布する必要があります。

Update Typeの設定値がUpdate(Local+Server)である場合、ネットワークに接続していないとアプリを実行できません。アプリのロードーディング時にBootstrap URLを確認して接続に失敗すると、アプリを実行しません。

アプリを起動するために必要なファイルは、モジュール、ソース、リソース、およびstart_android.jsonとして、nexacro studioでPacking(Archive&Update)を実行して取得できます。このファイルをAndroidプロジェクトでアセット(Asset)のarchiveフォルダに積載した後、アプリをビルドすると、ネットワーク接続がなくてもアプリを起動することができます。

nexacro studioでPacking(Archive&Update)を実行する際にUpdate TypeをLocalに設定しても、AndroidプロジェクトのMainActivity.javaでブートストラップURLは必ず設定する必要があります。

例えば、下記のように仮想のアドレスや実際の使用していない任意のアドレスに設定しても構いません。

setBootstrapURL("http://192.168.0.1/_android_/start_android.json");

setProjectURL("http://192.168.0.1/_android_/");

1

Android Studioプロジェクトでassetsフォルダを生成します。

アセットは、Androidアプリで使用できる論理的なストレージです。Androidプロジェクトでassetsフォルダを作成して、アプリで使用するファイルをコピーした後、APKを生成すると、アプリの実行時に該当ファイルを使用することができます。アセットは、読み取り専用のストレージとして使用されるため、アプリの実行中に変更されないファイルを、その場所に置いて使用します。

プロジェクトのappを選択して、マウス右ボタンをクリックします。次のようにコンテキストメニューから[New>Folder>Assets Folder]を選択して、[プロジェクト>app>src>main]の下位にAssetsフォルダを生成します。

create_assets_1

2

assetsフォルダの下位にarchiveフォルダを生成します。

[プロジェクト>app>src>main>assets]フォルダを選択した後、[New>Directory]メニューを使用して、archiveディレクトリをassetsフォルダの下位に生成します。

3

モジュール、ソース、リソースファイルをassets/ archiveフォルダにコピーします。

nexacroアプリケーションのモジュール、ソース、リソースファイルを[プロジェクト>app>src>main>assets>archive]フォルダにコピーします。Windowsエクスプローラでファイルを選択した後、Android Studioにコピー/貼り付けします。

copy_archive_files

4

フォルダとファイルがプロジェクトに正常に追加されたことを確認します。

Android Studioのプロジェクトウィンドウでassets/archiveフォルダとファイルが正常に追加されたことを確認します。

asset_경로

ビルド

アプリテスト

  1. Android端末をPCにUSBで接続してすぐテストすることができます。端末を直接接続する場合には、端末に開発オプションである[USBデバッグ]を設定して、端末に合うドライバをインストールしてください。

USBデバッグオプションの選択方法は、下記の情報を参照してください。

https://developer.android.com/studio/debug/dev-options

  1. Android StudioでRunメニューを実行します。RunメニューはAPKを生成及びデバイスにインストールして実行まで行うことができる機能です。実行命令を下せば、どの端末で実行するかを選択することができます。

Run > Run 'App'

Nexus OneやOptimus Oneのように内蔵メモリーにユーザーが書き込むことができるスペースがない端末の場合、外部メモリカードを追加しないと、アプリが正常にインストールされません。

Android仮想デバイスを用いたテストはサポートしません。

select_deployment_target

アプリ実行ログは、Android Studio下部のLogcatを介して確認することができます。

logcat

インストールファイル生成

完成されたアプリを配布するためには、アプリを認識することができるkeystoreを生成し、署名されたAABファイル、APKファイルを生成する必要があります。keystoreファイルは最初の1回のみ生成しており、以後アプリが更新されたときは、最初に生成されたkeystoreファイルを使用します。

keystoreとSigned APKを生成する方法は、GoogleのWebページを参照してください。

http://developer.android.com/guide/publishing/app-signing.html

上部メニューの[Build>Generate Singed Bundle/APK]を選択します。

generate_signed_apk_menu

基本設定はAABファイルの生成です。必要に応じてAPK項目を選択し、APKファイルを生成することができます。