06.モデルデータファイル読み込みを作る

05.で作成したモデルビューアは、表示するモデルデータをアプリケーション内で定義していました。
モデルデータファイル読み込み処理を作成し、05.で作成したモデルビューアを、ファイルからモデルデータを読み込んで描画するようにします。(アスキー形式STLファイル読み込み処理を作成します。)

解説

Android APIには、標準では、ファイル選択に関する関数、クラスは用意されていないので、自作します。
ファイル選択アクティビティ ( Activity + ListView + 拡張子フィルタ ) のページのファイルを流用します。

アスキー形式STLファイル読み込み処理を作成します。

ファイル選択アクティビティを呼び出す項目を、オプションメニュー項目として追加します。

実装

プロジェクトを開く

05.で作成したモデルビューアプロジェクトを開きます。

STLファイル読み込みクラスの作成

STLファイルの読み込み処理を担うクラスを作成します。

「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。



Nameに、「StlFileLoader」、
を入力し、「OK」ボタンを押します。

StlFileLoaderクラスの中身を以下のようにします。



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

モデルビューアビュークラスにモデルファイル読み込み関数の追加

モデルビューアビュークラスにモデルファイル読み込み関数を追加します。
処理内容は、
・StlFileLoaderクラスのload関数の呼び出し
・StlFileLoaderクラスのload関数の結果のモデルデータを、RendererオブジェクトのsetModel関数で、セット。
・再描画要求の呼び出し



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

ファイル選択アクティビティ関連ファイルの追加

Android APIには、標準では、ファイル選択に関する関数、クラスは用意されていないので、自作します。
ファイル選択アクティビティ ( Activity + ListView + 拡張子フィルタ ) のページのファイルを流用します。
ファイル選択アクティビティ ( Activity + ListView + 拡張子フィルタ ) のページのテストプロジェクト (FileSelectionActivityExtFilterTest.zip)の中の

を下記手続きでプロジェクトに配置します。

  1. FileSelectionActivityExtFilterTest.zip をダウンロードし、適当なフォルダに解凍します。
  2. 「FileSelectionActivityExtFilterTest-master\app\src\main\java\com\hiramine\fileselectionactivityextfiltertest」フォルダ内にある、「FileSelectionActivity.java」ファイルを、コピーします。
  3. Windowsのエクスプローラを用いて、ModelViewerTutorialプロジェクトのフォルダに移動します。
  4. プロジェクトのフォルダの下の「app\src\main\java\ドメイン\modelviewertutorial」フォルダに移動します。
  5. 「FileSelectionActivity.java」ファイルを、ペーストします。
  6. (AndroidStudioの「Project」ペインの「app > java > ドメイン.modelviewertutorial」に「FileSelectionActivity」ファイルが追加されます。)
  7. 「FileSelectionActivity.java」ファイルの、package宣言を「ドメイン.modelviewertutorial」に変更します。

文字列リソースの追加

ファイルオープンに関するメニュー項目用の文字列定義を文字列リソースの末尾に追加します。

「Project」ペインの「app > res > values > strings.xml」を開きます。

strings.xml の内容を、以下のようにします。

メインアクティビティのメニューリソースの追加

ファイルオープンに関するメニュー項目をメニューリソースの末尾に追加します。

「Project」ペインの「app > res > menu > activity_main.xml」を開きます。

activity_main.xml の内容を以下のようにします。

メインアクティビティのオプションメニューにファイルオープンに関する項目の追加

ファイルオープンに関するメニュー項目を選択したときの処理を追加します。

メニューのファイルオープンを選択したときの処理として、インテントを介してファイル選択アクティビティを起動する処理を記述します。

ファイル選択アクティビティを起動する処理のための定数、初期フォルダに関するメンバー変数も追加します。



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

メインアクティビティクラスにファイル選択アクティビティの結果に関する処理の追加

メインアクティビティクラスにファイル選択アクティビティの結果に関する処理の追加します。

処理として、選択したファイル名を引数として、モデルビューアビューのloadModelFile関数を呼び出す処理を記述します。



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

モデルビューアビュークラスのモデル作成処理の削除

3. で作成した、モデルビューアクラスのモデルの作成および登録の処理は不要なのでコメントアウトします。

AndroidManifest.xml へのファイル選択アクティビティの追加

「FileSelectionActivity」を使用するためには、マニフェストファイルに、「FileSelectionActivity」に関する記述を追加する必要があります。

「Project」ペインの「app > manifests > AndroidManifest.xml」を開きます。

以下のパーミッション宣言を追加します。



「AndroidManifest.xml」全体としては、以下のようになります。

ファイルのリストを取得するためのパーミッションの宣言

ファイルのリストを取得するためには、「READ_EXTERNAL_STORAGE」パーミッションが必要です。
マニフェストファイルに、「READ_EXTERNAL_STORAGE」パーミッションの宣言を追加します。

「Project」ペインの「app > manifests > AndroidManifest.xml」を開きます。

以下のパーミッション宣言を追加します。



「AndroidManifest.xml」全体としては、以下のようにします。

実行時のパーミッションリクエスト

ファイルのリストを取得するためには、「READ_EXTERNAL_STORAGE」パーミッションが必要です。
実行時に、「READ_EXTERNAL_STORAGE」パーミッションが付与されているかをチェックし、付与されていない場合にはパーミッションをリクエストします。

・定数宣言部に、「外部ストレージ読み込みパーミッション要求時の識別コード」定数を追加します。
・メインアクティビティクラスの、onResume関数に、requestReadExternalStoragePermission関数の呼び出し処理を追加します。
・メインアクティビティクラスの末尾に、requestReadExternalStoragePermission関数、onRequestPermissionsResult関数を追加します。



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。

実行

STLファイルの準備

Android端末にて、「ModelData01.stl」「ModelData02.stl」をダウンロードしておきます。

Android端末にて、動作確認。

実行し、アスキー形式STLファイルからモデルデータを読み込んで描画できるようになっていることを確認します。

オプションメニューの表示


ModelData01.stlファイルの読み込み


ModelData02.stlファイルの読み込み

ダウンロード

サンプルプロジェクト
github.com上のダウンロードページ

サンプルモデル(ModelData01.stl)

サンプルモデル(ModelData02.stl)

関連ページ

前項目:05.モデルビューアレンダラクラスを作る

次項目:07.描画速度の計測