アプリ開発と実行(Android)

アプリ開発環境設定

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

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

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

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

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

アプリプロジェクト開発

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

プロジェクト生成

1

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

android_studio_3.0_open_project

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

File > New > New Project

2

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

選択したテンプレートに基づいて、構造、画面レイアウト、ファイルなどの構成が異なります。ここでnexacro platformアプリを追加のための基本的なアプリ形で十分なので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 platformでサポートするAndroidの最低仕様は、5.0バージョンです。したがってSDK設定時にAPIレベル21以上をサポートするSDKを使用する必要があります。

4

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

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

5

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

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

nexacro platformライブラリ設定

アプリの開発時に使用できるように提供されているnexacro platfromのJavaアーカイブ(JAR、Java Archive)ファイルと32/64ビット共有ライブラリ(SO、Shared Library)ファイルをAndroidプロジェクトに設定します。別の設定は必要ありません。決められたパスにコピーします。

ファイル

パス

Javaアーカイブ(nexacro17.android.jar)

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

32ビット共有ライブラリ(libnexacro17.so)

[プロジェクトパス]\app\src\main\jniLibs\armeabi-v7a\

64ビット共有ライブラリ(libnexacro17.so)

[プロジェクトパス]\app\src\main\jniLibs\arm64-v8a\

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

android_studio_project_explorer

nexacro17.android.jarファイルは、[プロジェクト>app>libs]フォルダにコピーします。libnexacro17.soファイルは[プロジェクト>app>src>main]フォルダの下に、32ビット用の[jniLibs>armeabi-v7a]フォルダと64ビット用の[jniLibs>arm64-v8a]フォルダを新規に作成してコピーします。生成されたフォルダ構造は下図の通りです。

archive_library_설정

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

so파일복사

プロジェクトのライブラリパスにコピーした、Javaアーカイブファイルは、プロジェクトで参照できるようにライブラリに追加します。nexacro17.android.jarファイルを選択してマウスの右ボタンをクリックした後、コンテキストメニューから[Add As Library]を選択します。

nexacro_library_add_as_library

ライブラリが正常に追加されたことを確認するには、[プロジェクト>app]項目を選択して、コンテキストメニューの[Open Module Settings]項目を選択します。

nexacro_library_open_module_settings

[Dependencies]項目を選択すると、ライブラリが追加されたことを確認することができます。

nexacro_library_open_module_settings_project_structure_empty

Googleのポリシーにより、Google Play で公開するアプリは 64 ビット アーキテクチャをサポートする必要があります。

https://developer.android.com/distribute/best-practices/develop/64-bit?hl=ja


32ビット アーキテクチャのCPUを使用しているモバイルデバイスでは、64ビットの共有ライブラリが動作しません。32ビットと64ビットの共有ライブラリの両方が存在する場合には、64ビットのライブラリが優先的に使用されます。

リソース設定

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

Androidシステムは、端末の画面や密度に応じて、適切なリソースを判断して使用します。ただし、端末の画面に合うリソースが存在しない場合には、基本提供リソースを画面に合わせて拡大/縮小して使用します。

リソースフォルダは、プロジェクトの作成時に自動生成されており、一般的に下記のような構造を持っています。開発者はリソースの種類に応じて、適切なフォルダに画像やXMLファイルを配置します。

resource_directory

リソースフォルダは<リソース名>-<設定修飾子>の形で構成されます。設定修飾子(Configuration Qualifier)は種類によってサイズ(small、normal、large..)、密度(ldpi、mdpi、hdpi、xhdpi..)、方向(land、port)、画面アスペクト比(long、notlong)などがあります。たとえば、drawable-xxhdpiは超高密度(Extra High Density)画像とXMLリソースファイルを配置するフォルダです。drawableのように設定修飾子がついていないフォルダは、システムで画面を描画するときに基準となる基本的なリソースを配置するフォルダです。

リソースに関する詳細は、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タブレットの縦方向スプラッシュ画像です。(すべて小文字)

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

アイコンファイルは、プロジェクト生成後に変更することができます。[プロジェクト>app]項目を選択した後、コンテキストメニューの[New>Image Asset]項目を選択した後に表示された[Asset Studio]でアイコンファイル関連の設定を変更します。

cnofigure_image_asset_empty

アプリが実行されたときに表示されるローディング画面を簡単に設定することができます。上表の「splashimage_」で始まるファイルがnexacro platformアプリで使用されるロード画像です。ユーザーはローディング画面として使用する画像を「/res/drawable」フォルダにコピーした後、下記のようにファイル名を変更します。

splashimage

文字列設定

アプリ実行時に使用する文字列を設定します。プロジェクトの生成時に作成されるresフォルダの下のvaluesフォルダにあるstrings.xmlファイルを、下記のように変更します。

下記はnexacro platformアプリで使用されるデフォルト文字列です。文字列は、ユーザーの状況に合わせて変更することができますが、文字列のnameはアプリで参照して使用するため、変更しません。nexacro platformアプリのデフォルト文字列を設定しない場合、アプリが正常に動作しないことがあります。

$r_title(strings.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<!-- app_nameは、実際のデバイスにインストールされるアプリの名前を定義します。これを修正すると、画面に表示されるアプリの名前を変更することができます。 -->
    <string name="app_name">HelloAndroid</string>
	<string name="action_settings">Settings</string>
    
    <!-- Clipboard -->
    <string name="copy">Copy</string>
    <string name="paste">Paste</string>
    <string name="cut">Cut</string>
    <string name="close">Close</string>
    <string name="selectall">Select All</string>
    <string name="selectword">Select Word</string>
 
    <string name="needupdate">It needs an update. \nAfter completion, Please restart.</string>
    <string name="loadingFail">First loading fails. \nPlease restart.</string>
    <string name="updateFail">Update fails. \nPlease restart.</string>
    <string name="notexist">Start file does NOT exist. \nPlease restart.</string>
    <string name="BeingUpdated">Being updated.</string>
    <string name="wantreplace">There is a file of the same name. Do you want to replace? </string>
    <string name="ok">OK</string>
    <string name="cancel">Cancel</string>
    <string name="move">Move</string>
    <string name="upper">Upper</string>
    <string name="filter">Filter</string>
    <string name="home">Home</string>
    <string name="nofilename">No File Name.</string>     
	<string name="checkforupdates">Check for update.</string>   
	<string name="installforupdates">Install update.</string>  
	<string name="downloadingforupdates">Downloading update.</string>    
	<string name="force_close">Update is Completed.</string> 
	<string name="LoadingPleaseWait">Loading&#8230; \nPlease Wait&#8230;</string> 
	
    <!-- Accessibility widget role -->
    <string name="alert">alert</string>
    <string name="pushbutton">pushbutton</string>
    <string name="combobox">combobox</string>
    <string name="checkbutton">checkbutton</string>
    <string name="radiobutton">radiobutton</string>
    <string name="text">text</string>
    <string name="list">list</string>
    <string name="listitem">listitem</string>
    <string name="statictext"></string>
    <string name="graphic">image</string>
    <string name="spacebar">space bar</string>
    <string name="textdeleted">deleted</string>
    
    <!-- Accessibility widget statue -->
    <string name="checked">checked</string>
    <string name="unchecked">unchecked</string>
    
    <!-- Accessibility reaction -->
    <string name="click">click</string>
    
    <!-- Splash message  -->
    <string name="start_initialize">Start Initialization</string> 
    <string name="check_license">Check License</string>
    <string name="load_frameworkmodule">Load Framework Module</string>
    <string name="load_extendmodule">Load Extended Module</string>
    <string name="execute_frameworkscript">Execute Framework Script</string>
    <string name="load_application">Load Application</string>
    <string name="load_failapplication">Fail to Initialize Application. Click And Close</string>
    
</resources>

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

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

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

レイアウト設定

端末から表示されるアプリのレイアウトを指定します。Androidアプリでnexacro platformアプリを包むための用途であるため、デフォルト状態に設定します。レイアウトを設定しない場合、アプリ実行時のnexacro platformアプリが正常に画面に出力されません。

resフォルダの下にあるlayoutフォルダにnexacro_app.xmlファイルを新たに生成して、下記のように変更します。レイアウトファイルを追加するには、[File>New>XML>Layout XML File]を選択します。

$r_title(nexacro_app.xml)

<?xml version="1.0" encoding="utf-8"?>
<!-- nexacro_app.xml -->
<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>

レイアウトを設定しない場合、画面が正常に表示されていないか、エラーが発生することがあります。

Config設定

nexacro platformで提供する機能をアプリで使用できるようにnexacro_config.xmlファイルを設定します。アプリのアップデート、Notification、エラー情報処理などの機能を有効にすることができます。nexacro_config.xmlファイルは、ユーザーが直接生成する必要があり、[プロジェクト>app>src>main>res>xml]フォルダの下に配置します。このファイルは、Android Studioでアプリのビルド時プロジェクトに含まれている必要があります。

nexacro_config.xmlファイルが存在しない場合、デフォルト設定が適用されるので、アプリの実行に何の問題がありません。

nexacro_config.xmlファイルはXML形式であり、下記の例のように作成します。

<?xml version="1.0" encoding="UTF-8"?>
<nexacro-config>
    <application dialog-position="center" file-logging="true" quiet="false"/>
    <updator cancelable="true" force="true" errormsg="true" quiet="false"/>
    <xpush-server request-missing-message="true"/>
    <notification enable="true" handler="com.nexacro.notification.DefaultHandler"/>
</nexacro-config>

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

17.0.0.1800以降のバージョンではFirebase Cloud Messaging(FCM)サービスを使用することにより、project-number、ui-handlerプロパティはもはや使用せず、該当プロパティの説明を削除します。

機能

属性

設定値

説明

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」に設定しても、アップデートファイルが存在する場合、進行段階は表示されます。

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 platform環境に合わせて変更します。

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:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.example.helloandroid.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar">
            <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>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="google_play_services_version" />

    </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"

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

...
<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

17.0.0.1800以降のバージョンでは、Firebase Cloud Messaging(FCM)サービスを使用します。

Googleポリシーに基づいて2019年4月11日以降には、以前のNotification機能(GCM、Google Cloud Messaging)を使用することができません。nexacro platfromのバージョンを17.0.0.1800以降のバージョンにアップデートしてFirebase Cloud Messaging(FCM)サービスを使用することで設定を変更する必要があります。

https://developers.google.com/cloud-messaging/

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/nexacro17.android.jar')
}
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'

<!-- 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" />

下記の内容は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'
}

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

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

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

アプリを起動するために必要なファイルは、モジュール、ソース、リソース、および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 platformアプリケーションのモジュール、ソース、リソースファイルを[プロジェクト>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を生成し、署名された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