【Androidでドローン(マルチコプター)を飛ばそう】 周囲のドローンを表示する
前回の【Androidでドローン(マルチコプター)を飛ばそう】 ドローン探索機能を実装するではAndroid端末の周辺に存在するドローンを検知するDroneDiscoverを実装しました。
今回はこのクラスを使いAndroid端末周辺に存在するドローンを一覧表示します。
仕様は下記のとおりです。
- 画面開始時にドローン探索機能を有効化する
- Android端末周辺のドローンをリスト表示する
- Android端末周辺のドローンを検知したときはリストを更新する
- 画面終了時にドローン探索機能を無効化する
1-初期化部の実装
まずはAndroid端末周辺に存在するドローンを一覧を表示するための準備をしましょう。
- ARSDKライブラリを初期化する
- ドローン一覧を表示するListViewの準備
- DroneDiscoverをインスタンス化
特に注意すべき点はARSDKライブラリの初期化です、ライブラリのクラスを開始する前に必ず実施しましょう。
今回のサンプルではstaticブロックで初期化を行っています。
/** * ドローン探索機能クラス */ public DroneDiscover mDroneDiscoverer; /** * 探査済みドローンリスト */ private final List<ARDiscoveryDeviceService> mDronesList = new ArrayList<>(); /** * ARSDKのライブラリを初期化する */ static { ARSDK.loadSDKLibs(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ListView listView = new ListView(this); setContentView(listView); listView.setAdapter(mAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // リストが選択されたときの処理 ARDiscoveryDeviceService service = (ARDiscoveryDeviceService) mAdapter.getItem(position); // プロダクトIDからドローンの種類を取得する。 ARDISCOVERY_PRODUCT_ENUM product = ARDiscoveryService.getProductFromProductID(service.getProductID()); // ドローンの種類によって操作方法が異なるのでswitchで分けます。 switch (product) { case ARDISCOVERY_PRODUCT_MINIDRONE: case ARDISCOVERY_PRODUCT_MINIDRONE_EVO_BRICK: case ARDISCOVERY_PRODUCT_MINIDRONE_EVO_LIGHT: break; case ARDISCOVERY_PRODUCT_ARDRONE: case ARDISCOVERY_PRODUCT_BEBOP_2: break; case ARDISCOVERY_PRODUCT_SKYCONTROLLER: break; case ARDISCOVERY_PRODUCT_JS: case ARDISCOVERY_PRODUCT_JS_EVO_LIGHT: case ARDISCOVERY_PRODUCT_JS_EVO_RACE: break; default: } } }); //ドローン探索機能クラスをインスタンス化 mDroneDiscoverer = new DroneDiscover(this); }
2-ドローン探索機能有効化の実装
DroneDiscoverer#setupを呼ぶことでドローン探索機能有効にする準備ができます。
ドローン探索機能によりドローンが発見したり、消失したときにコールバックしてもらうためにDroneDiscoverer.Listener(実装は後述)を登録します。
すべての準備が整ったのでDroneDiscoverer#startDiscoveringを呼びドローンをドローン探索機能有効にします。
@Override protected void onResume() { super.onResume(); // ドローン探索機能をセットアップする。 mDroneDiscoverer.setup(); // ドローン探索機能クラスが周囲のドローンを検知したときのコールバックを登録する。 mDroneDiscoverer.addListener(mDiscovererListener); // ドローン探索機能を開始する。 mDroneDiscoverer.startDiscovering(); }
3-ドローン探索機能無効化の実装
ドローン探索機能を無効にする時は有効化した逆の手順を踏みます。
DroneDiscoverer#stopDiscoveringを呼ぶことでドローン探索機能を停止します。
停止しただけではDroneDiscovererが持っていたリソースは解放されません、DroneDiscoverer#cleanupを呼びすべてのリソースを解放します。
最後にコールバックを解除します。
@Override protected void onPause() { super.onPause(); // ドローン探索機能を停止する。 mDroneDiscoverer.stopDiscovering(); // ドローン探索機能の後処理をする。 mDroneDiscoverer.cleanup(); // ドローン探索機能クラスが周囲のドローンを検知したときのコールバックを解除する。 mDroneDiscoverer.removeListener(mDiscovererListener); }
4-コールバックの実装
ドローン探索機能によりドローンが発見したり、消失したときに呼ばれるコールバックを実装します。
探査済みドローンリストをクリアし、コールバックの引数で受け取った探査済みドローンリストを新しくリストに追加します。
最後にBaseAdapter#notifyDataSetChangedを呼びListViewの表示を更新します。
/** * 探知済みドローンリストが更新されたときのコールバックリスナー */ private final DroneDiscover.Listener mDiscovererListener = new DroneDiscover.Listener() { @Override public void onDronesListUpdated(List<ARDiscoveryDeviceService> dronesList) { //探知済みドローンリストの更新 mDronesList.clear(); mDronesList.addAll(dronesList); //ListViewの更新 mAdapter.notifyDataSetChanged(); } };
5-Adapterの実装
最後にBaseAdapterの実装です、一般的なAdapterの実装なので説明は省略します。
ListViewに表示する内容はドローンの名前です。
/** * ListView用のViewHolder */ static class ViewHolder { public TextView text; } /** * ListView用のAdapter */ private final BaseAdapter mAdapter = new BaseAdapter() { @Override public int getCount() { return mDronesList.size(); } @Override public Object getItem(int position) { return mDronesList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; // reuse views if (rowView == null) { LayoutInflater inflater = getLayoutInflater(); rowView = inflater.inflate(android.R.layout.simple_list_item_1, null); // configure view holder ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) rowView.findViewById(android.R.id.text1); rowView.setTag(viewHolder); } // fill data ViewHolder holder = (ViewHolder) rowView.getTag(); ARDiscoveryDeviceService service = (ARDiscoveryDeviceService) getItem(position); holder.text.setText(service.getName()); return rowView; } };
6-まとめ
今回は周囲のドローンを一覧表示するActivityを実装しました。
次回はドローンを操作するクラスを実装します。
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; /** * ドローン探索機能クラス */ public DroneDiscover mDroneDiscoverer; /** * 探査済みドローンリスト */ private final List<ARDiscoveryDeviceService> mDronesList = new ArrayList<>(); /** * ARSDKのライブラリを初期化する */ static { ARSDK.loadSDKLibs(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ListView listView = new ListView(this); setContentView(listView); listView.setAdapter(mAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // リストが選択されたときの処理 Intent intent = null; ARDiscoveryDeviceService service = (ARDiscoveryDeviceService) mAdapter.getItem(position); ARDISCOVERY_PRODUCT_ENUM product = ARDiscoveryService.getProductFromProductID(service.getProductID()); switch (product) { case ARDISCOVERY_PRODUCT_MINIDRONE: case ARDISCOVERY_PRODUCT_MINIDRONE_EVO_BRICK: case ARDISCOVERY_PRODUCT_MINIDRONE_EVO_LIGHT: break; case ARDISCOVERY_PRODUCT_ARDRONE: case ARDISCOVERY_PRODUCT_BEBOP_2: break; case ARDISCOVERY_PRODUCT_SKYCONTROLLER: break; case ARDISCOVERY_PRODUCT_JS: case ARDISCOVERY_PRODUCT_JS_EVO_LIGHT: case ARDISCOVERY_PRODUCT_JS_EVO_RACE: break; default: } } }); //ドローン探索機能クラスをインスタンス化 mDroneDiscoverer = new DroneDiscover(this); } @Override protected void onResume() { super.onResume(); // ドローン探索機能をセットアップする。 mDroneDiscoverer.setup(); // ドローン探索機能クラスが周囲のドローンを検知したときのコールバックを登録する。 mDroneDiscoverer.addListener(mDiscovererListener); // ドローン探索機能を開始する。 mDroneDiscoverer.startDiscovering(); } @Override protected void onPause() { super.onPause(); // ドローン探索機能を停止する。 mDroneDiscoverer.stopDiscovering(); // ドローン探索機能の後処理をする。 mDroneDiscoverer.cleanup(); // ドローン探索機能クラスが周囲のドローンを検知したときのコールバックを解除する。 mDroneDiscoverer.removeListener(mDiscovererListener); } /** * 探知済みドローンリストが更新されたときのコールバックリスナー */ private final DroneDiscover.Listener mDiscovererListener = new DroneDiscover.Listener() { @Override public void onDronesListUpdated(List<ARDiscoveryDeviceService> dronesList) { //探知済みドローンリストの更新 mDronesList.clear(); mDronesList.addAll(dronesList); //ListViewの更新 mAdapter.notifyDataSetChanged(); } }; /** * ListView用のViewHolder */ static class ViewHolder { public TextView text; } /** * ListView用のAdapter */ private final BaseAdapter mAdapter = new BaseAdapter() { @Override public int getCount() { return mDronesList.size(); } @Override public Object getItem(int position) { return mDronesList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; // reuse views if (rowView == null) { LayoutInflater inflater = getLayoutInflater(); rowView = inflater.inflate(android.R.layout.simple_list_item_1, null); // configure view holder ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) rowView.findViewById(android.R.id.text1); rowView.setTag(viewHolder); } // fill data ViewHolder holder = (ViewHolder) rowView.getTag(); ARDiscoveryDeviceService service = (ARDiscoveryDeviceService) getItem(position); holder.text.setText(service.getName()); return rowView; } }; }
|
|
||||
|
|
||||