【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;
}
};
}
|
|
||||
|
|
||||



