【Androidでドローン(マルチコプター)を飛ばそう】 周囲のドローンを表示する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

前回の【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;
        }
    };
}


【国内正規品】Parrot Minidrones Airborne Night Blaze(レッド)ドローン規制対象外200g 未満・パリデザイン・LED 付き自動安定ホバーリングクアッドコプター ・30万画素カメラ・簡単にアクロバット・スマホ・タブレットで操作 PF723132

新品価格
¥17,150から
(2017/2/28 00:50時点)


Parrot Airborne Cargo MiniDrone - Mars (White) by Parrot

新品価格
¥22,692から
(2017/2/28 00:53時点)


Parrot MiniDrones Airborne Night Drone Maclane (Blue) [並行輸入品]

新品価格
¥12,000から
(2017/2/28 00:54時点)


【国内正規品】Parrot Bebop 2 ホワイト Full HD/30fps 魚眼レンズ カメラ・25分飛行時間・8GB 内部フラッシュメモリー・自動安定ホバーリング・最高水平速度:60KM/H・パリデザイン・GNSS (GPS GLONASS)付・クワッドコプター PF726073

新品価格
¥65,701から
(2017/2/28 00:57時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)