始める時に思ったこと

この記事は主にプログラミングを始めたばかりの人に送る記事です。
偉そうなことを偉そうに書いているかもしれませんがお付き合いください。
偉そうだなとか言うだけの人よりじゃあどこでそう感じるのかどうやったら感じない文章になるのか考えたり指摘してくれたりする人がより素晴らしい人だと思います。
mito自身にも当てはまることがあったりしますが、とりあえず自分のことは棚に上げて書いています。

とりあえずやってみる

新しいことに挑戦するという事はとても勇気がいります。
失敗しないだろうか、自分にはできないんじゃないか、やらなくてもいいのでは、時間の無駄かもしれない、etc...
そう言うことをどんどん考えていくと挑戦しない道を選んだ方が楽なことが多いです。
でも、そこを敢えて挑戦していくと違った世界が見えてくるはずです。
新しい言語の勉強をするときもとりあえず動く何かを作ってみて実感を得ることが大事になってきます。

自分は今年のPCKの開発の際に、挑戦しなくてもよかったかもしれない事をやりながら開発していました。
一番大きいことは積極的にライブラリを使っていったことです。
去年のPCKで出したふぁみここのコードを見るとサーバとの通信方法やJSONのパースの仕方などを標準のはめんどくさい、使いにくいと言われても標準で用意されている機能だけでやったのが多いです。
(一部、okhttpとかが使われているのはおりさの先輩に相談した時のコードです)
その時は、使いにくさだったりは特に感じていなかったし、いざライブラリを使おうとなっても使い方が分からず結局元に戻るだろうと思いが強かったです。
そして今年の開発でもそのコードを流用すればすぐに終わったかもしれない事ばかりでした。
でも、今年はmoshiやokhttp、Ankoといったライブラリを多く使いました。
特にAnkoはKotlinでxmlなしに画面レイアウトが作成できるみたいなライブラリなんですが、そもそもKotlinの情報が増え始めた頃でAnkoの情報が多いわけもなく、分からないことだらけで辛かったです(特にid周り)
こういったライブラリを使ったことでライブラリの便利さ・有り難さが身に染みてわかりました。
今は積極的にライブラリを使うようにしています。

少し脱線しましたが、やってみることによって得られる経験はとても良いものです。
やってみて結局使わなかった・いらなかった・分からないままだったでも、それはそれで良いと思います。 使わなかった・いらなかったでも他のプロジェクトでは使えたり、他のことに挑戦する時にあれではこうだったけどこれではどうなんだろうとかで良い経験値にはなると思います。 分からないままでもしばらく他の事をやってたりして時間を置いてまたやって見ると案外楽になったりします。(少なくとも悪化することはないと思う)

できることからやる

なんか上のやつと矛盾したことになりそうですが、やりたいことがあるが途中でやる気を失ってしまったり達成できずに終わってしまったりすると精神的にしんどいです。
でも、そういう場合って基礎が足りていないだけだったり前提知識がないだけだったりするのでやりたいことだけでなく、今できることを地道にやってどんどんやりたいことに近づいていくというのも道だと思います。

いろんなことに手を出す

よくいろんなことに手を出すより1つのことを極めた方がいいだとか、広く浅い知識より狭く深い知識の方がいいだとか言われることがあります。確かにこれらのことは技術職や専門職の人達にとっては必須ですが、プログラミングを始めたばかりだったりどれを深めていいのかわかっていない状態だと、それよりはいろんなことに手を出して自分の好きなことやりたいこと興味を持ったことを見つけるのが最優先だと思います。
(自分の経験とか書きたいけど1つ目で疲れた長くなりそうなので以降省略)

時にはなぜを忘れる

開発中に実装したい機能がある時にやり方が分からずにググってQiitaとかStackOverflowとかにあるサンプルコードを見つけて使いたいときがあります。
その時になぜそのコードが動くのか分からない状態で使うのは良くないと言われます。確かにその通りでそのコードの意味がわからないと使用独特のバグが生えてしまったり、使えなかった時の対処法がわからなかったりして開発に支障が出てしまいます。でも状況によってはそんなこと言っていられず動けるものを作らないといけないと言った時はわからないままでもいいと思います。
わからないままでもしばらくすると自然にわからないままにしたくないだとか単純に興味が湧いらとかでなぜ動くのかを調べるようになります。
とりあえずは動かすことに意味があると思います。

自分の環境を作る

プログラミングをする際に、ツールにもっとこだわった方が良いです。 どんなに有名なツールでも自分にとってとても使い勝手の悪いものだったらそれを使い続けることは精神的負荷になってきます。 これもとりあえずやってみると近いですが、どんどんいろんな環境を試してみて自分にしっくりくるものを見つけ、それをまた自分に合うようにカスタマイズしていきましょう。
自分の場合はもうJetBrains製品の虜になってしまい、AndroidStudioやIntellijのカスタマイズを結構やっています。 しかし、もうすでに開発が終了していたり非推奨になっていたりするものはなるべく避けましょう。
それ以外であれば、周りの他人に少し言われるくらい言われても拘ったほうがいいです。

どんどん公開する

せっかく何かしら作っても、「いや、駄作だから,,,」とかと言って公開せずに自分や身内だけで終わらせてしまう人がいます。
正直、勿体無いと思います。
せっかく作ったものが日の目を浴びないというのもですが後悔しないと他の人からフィードバックを得られません。 フィードバックを得たものと得てないもののサハ歴然んです。
後悔したことによって起こる人はいませんし(多分)、どんどん公開していきましょう。
個人的にはgithubで星をもらえたらいPRもらうのは嬉しい。

理由を教えてくれそうな人を見つける

何かあった時にその理由や原因をきちんと教えてくれる人は良い人です。やるだけだよとかしか言わない人に聞いていても仕方ありません。他を当たってみましょう。
何かやろうとした時にダメとしか言わないよりなぜダメなのか説明があったほうがいいですよね。そんな感じです。

最後に

途中から疲れてしまって閣僚もだいぶ減って、いくつか項目を消したのもありますがいかがでしたか。
偉そうだなと思った人はいると思います。自分がそうです。
この記事は割と雑に書いてしまっていて間違っているところもあるとは思いますが、参考程度にしてやってください。
ここに書いてあることを実践したからといって必ず良くなるとは限りませんし、このことを意識しすぎるとそれもまた良くないでしょう。
何事も適当にやるのが良いですよ。(この適当は本来の意味)
頑張ってください。応援してます。自分も今以上に頑張ります。

mito.

2017年の振り返り

これはICT Advent Calendar 2017の27日目の記事です。

みなさんこんにちは、mitoです。
寒いですね。年齢を重ねていく度に寒さを感じるようになっている気がします。

いつの間にか学年的には高校生最後の年度ももう少しで終わりです。

とある事情で26日の夜中から急にバタバタしてほとんど寝れていないのでこの記事が27日中に公開されていたらいいな。

昨日(12月26日)の担当はkurokojiでした。

kurokoji.hatenablog.com

振り返り

今年あった・やった・なったこと

  • Android開発を教えながらのりょーこん作成
  • PCK
  • 学生寮の保安委員長
  • ICT委員会副委員長
  • ちょこちっぷマフィンのリーダー
  • みとった〜開発
  • ビジコン
  • 某企業の某と某バイトの面接

Android開発を教えながらのりょーこん作成

1~2人に聞かれた学校の勉強を教えるのはだいぶ慣れていてできるのですが、今回のような複数人相手に講義っぽく教えたり実装する機能を割り振ったりするのは慣れていなくほとんど行き当たりばったりになってしまったと思うので、参加していた13thには迷惑をかけていたかもしれません(今思えば結局ほとんど何も教えていなかった気がする)
一番基礎的なことを教えていなかった気がする...本当にごめん...

このりょーこん作成は確か1月2月くらいから始めて大会の活動が本格化し始める4月5月くらいまで続けていたと思います。
そこで一旦終了になり、統合・テスト・修正のmitoの作業が始まりました。

PCKの開発の良い息抜きになりました。

このりょーこんシステムは、実際に12月5〜8日に行われた研修旅行にて、「けんしゅうりょーこん」として試運転しました。
前日に変更しないといけないところが発覚したリ、ビーコンの数が足りてなかったりと色々なトラブルがありましたが、ちゃんと動いて点呼を取ることができていたので感動的でした。
mitoのgithubにてリポジトリがpublicになっていると思いますので興味ある方は見てみてください。

PCK

今年のPCKにはちょこちっぷマフィンとしておたすけじゅーるを持って行きました。
結果は去年同様、ベストデザイン賞でした。

アプリのUIのほとんどを自分が考えて実装したので褒められた時は嬉しかったです。(一番良いと言われていたところはIG先輩案のとこでしたけど)

仕様や画面デザインを確定させきれていない状態でタスクふりをして開発を始めてしまったため、結局びーまかが作成した1画面を丸々変更することになってしまいました。本当に申し訳なかったです。

詳細は前回の記事 にありますのでそちらを見ていただけると幸いです。

学生寮の保安委員長

これね、なんでやろうと思ったのか今の自分もわからない。
来年度から寮外生になるのですが、これ関連が理由の半分くらいを占めてます。

もちろん全男子寮生が当てはまるとは言いませんが、なんで自分が冷蔵庫に入れたものにくらい名前も書けないんですか。小学生よりひどい。
冷蔵庫内の物品を回収する前に毎回放送しているのに確認もしないんですか。放送やメールの連絡はちゃんと見て聞いて。

本当にお願いします。このままだともっとどんどんひどくなり、最悪全フロアの補食室閉鎖なんてこともあり得ますよ。(実際に可能)

それと次年度の委員長が決まらないんですか、誰か...
やりたくない気持ちはまあわかるけど,,,

ICT委員会副委員長

多分、去年の今頃くらいに副委員長になった気がします。
副委員長になったことによって2年の頃までは自分やチームがやっていることしか気にしていなかったけど、ICT委員会全体に関することも考えないといけなくなり、良い経験になったと思います。
副委員長の仕事を1年間できてとても良かったです。来年以降の委員長副委員長にも頑張って欲しいです。委員会の各位は委員長に負担をかけすぎないように各自しっかりしてください。

ちょこちっぷマフィンのリーダー

前回の記事 にも書いたのですが、リーダー・メインプログラマー・UIデザイナーの兼任は自分がリーダーとUIデザインの初心者だったからというのもあるとは思いますが大変でした。

どちらかに注力していると他のところでまだ?と催促され、全部を同時並行でできるほど経験や実力があるわけでもなくクオリティが残念なことになってしまう。
お前のやり方が悪いと言われるかもしれませんが難しかったです。でも、ちゃんと動くアプリを本選に持っていけ、受賞もできたので良かったです。

話がだいぶ変わるのですが、企画書を書いている頃か開発始まった頃くらいまで、チーム名は「ちょこちっぷまふぃん」と全部平仮名だと思っていました。

みとった〜開発

これの開発を始めた頃がいつだったのかは覚えていないんですが、今年の話とさせていただきます。
作り始めた理由が公式クライアントアプリで使いづらいところがあった、Androidアプリ開発の勉強が主な理由だったと思います。

もう基本的な機能は作り終え、あとは画面デザイン検討だったり、細々とした調整だけなので早くplayストアに公開したいと思っています。
公開するために、アイコン作成と名前を決めないといけない(みとった〜は音だけ聴くと色々不味い)けど全然進みそうにないです。

ビジコン

今年も去年同様、PCKで発表したアプリにビジネスプランをくっつけ提出しました。年明けにもビジコンがありそこにも出します。(最後のビジコンになりそう)
うちな〜ICTの方ではフロム理事長賞をいただきました。(去年と同じ)

某企業の某と某バイトの面接

今年の後期中間テストの頃から研修旅行前後に某企業の某と某バイトの面接や試験がありました。
先に結果をいうと両方とも合格?採用?されました。👏
春休みにしばらく東京に行ってきます。
これまで面接で合格したことがあるのが英検の面接しかな句く、そのほかの推薦入試や指導寮生の面接とかは落ちていたのでとても心配していましたがなんとかなりました。
良かったです。
またとない機会ですので両方とも頑張りたいです。

まとめ

今年も色々なことに参加・経験することができました。来年には進路の話も本格的になっていき考えないといけないことも増えそうな気もしますが、体調を気にしながら無理せず無理したいと思います。

皆さんも今年できなかったことややりたいことに来年はもっと挑戦していきましょう。

ここまで長い駄文になってしまいましたがお付き合いいただきありがとうございました。
良いお年を!

明日のAdvent Calendar担当は、がちゃみんです

gatyaminch.hatenadiary.jp

mito.

PCKの反省記事はAdventCalendarに書こうか別記事にしようか悩む(PCKの反省記事です)

11月2日~5日にみんなが高専祭の準備や高専祭を楽しんでいる間、福島県会津に行ってPCKモバイル部門に「ちょこちっぷマフィン」として参加してきました。

PCKには2年連続での参加でした。

今年のPCKは記念大会ということもありプログラミング部門もモバイル部門も本戦出場チームが多かったです。(一枚の絵部門は知りません。ごめんなさい)

結果はベストデザイン賞でした。

(2年連続...ペンタブ2枚目......)

アプリ開発のために意見や話をしてくれた先輩、アイコンやロゴを作成してくれたるいコ、プレゼンやパンフ、ポスターの協力をしてくれたりし、副委員長パイセン、みずきち先輩、やがみあん先輩、何から何までお世話になったM教授、そしてチームメンバーの眠人とびーまかのおかげです。 本当にありがとうございました。
僕がPCKに参加することはもうないと思うので今の1,2年生やまたその次にグランプリは期待したいです。

チームでの役割

うん、流石に辛いものがあった(わっさん先輩とかすごすぎる...)

感想

良かったところ

  • KotlinとAndroidに対する理解が深まった
  • 見易さや理解しやすさを意識しながらコーディングできた
  • ライブラリの便利さがわかった
  • 新しいライブラリや書き方に挑戦できた
  • ゲドさんやふなちさんと喋れた
  • 温泉最高
  • UIを褒められた
  • 2年連続受賞できた

悪かったところ

  • リーダー・メインプログラマー・デザイナー兼任は厳しい
  • ポスター・パンフ・プレゼンの完成がかなりギリギリ(というかアウト)
  • 教授に見せるのがだいぶ遅かった
  • びーまかをプレゼンの準備に送り出すのが遅かった

他にも色々ある気がするけど今思いつくのはこれくらいなので以上で締めさせていただきます。
来年はプロコンに挑戦すると思います。
あと、Androidアプリケーション開発に興味持っている人を引きずり込みたいです。

関係ないけど、最近このブログのPVが増えて嬉しいです。

mito.

KotlinとJavaのソースファイルが混じっているAndroidプロジェクトを複数人で開発する時の注意

某コンテストに参加しており、1人はJavaでもう1人はKotlinで、コンテストに出すAndroidアプリを開発していて、その時に片方ではエラーと出て片方では何も出ていなくて2人ともビルドや実行はできるという状況に陥ったけど解決した話。

 

# 開発環境

Windows 10

Mac OSX Sierra

AndroidStudio 2.3.3

Java8

Kotlin 1.1.50

 

# 状況

- gitでバージョン管理をしていて、Kotlinで書いている人(以下K)とJavaで書いている人(以下J)がdevelopから生やしたブランチでそれぞれ作業をしており、Kがmergeした後のdevelopブランチにJがmergeした後に急に出てきたらしい(当人ではないので詳しくは分からず)。

- KとJはそれぞれ別フォルダにそれぞれの言語のコードを保存していました。(main.java.srcDirs += 'src/main/kotlin')

- AndroidStudioに「cannot resolve symbol」と言われ赤波線を引かれてエラー扱い。

- ビルドや実行はでき、「Message」ではエラーと出ない。

- ビルドや実行はできるがエラー表示され、他のエラーに気づけなくなる可能性があるためどうにかしたい。

- Kの方ではエラー出されていない。

- エラーが吐かれたファイルはMainActivity.java

- エラーが吐かれた部分は全部、Kotlinで作成したクラスのインスタンス化だったり宣言をしているところ。

- Kotlinが入っているフォルダをAndroidStudioが見つけられていないっぽい...?

 

# 解決方法

ここまで読んできて、詳しい人なら気付いていると思いますが、

J側のAndroidStudioにKotlinのプラグインをインストールしたら解決しました。

これでAndroidStudioが.ktファイルを認識するようになったみたい。

そのあとは同じ状況にならずに済んでいる。

 

# 感想

エラーというか要注意扱いなのかと考えたけど「cannot resolve symbol」と言われたらね...

当然と言われればそうかもしれないけど、全く考慮できていなかった。

最初、全部Javaに書き直そうかと思って、少しJavaで書き直したところでめんどくさくなって解決方法を考えてみたけど成功してよかった。

今の所、これ以外でJavaとKotlinの混じった開発に支障はなくて安心。

進捗(´・ω・`)

AndroidStudioのプロジェクト作成方法

AndroidStudioを使ってAndroidアプリを作成する時に最も大切と言っても過言ではないであろうプロジェクト作成についての記事を書きます。

環境

AndroidStudio 2.3
MacOS Sierra

本題

まず初めに、「Start a new Android Studio project」を選択します。 f:id:mitoavadn:20170929124945j:plain

次に「プロジェクト名」、「ドメイン名」、「パッケージ名」、「プロジェクトの保存場所」を決めます。 f:id:mitoavadn:20170312221341j:plain

プロジェクト名等を決めたら、次は作るアプリの対象とするAndroidOSの最低バージョンを決めます。 f:id:mitoavadn:20170312222114j:plain

その次に、デフォルトとなるアクティビティを追加することができます。
ここで「Add No Activity」を選択して追加しなくても後で追加できます。 f:id:mitoavadn:20170312222931j:plain

最後に、追加したアクティビティの名前やもう少し詳しい設定をしたりします。
(ここでは「Empty Activity」を選択しているので名前だけです)
f:id:mitoavadn:20170312223412j:plain

そして、「Finish」を押すとプロジェクトが作成されます。

mito.

テキストボックスに入力した文字列を取得して表示する

タイトル通りなんですが、入力した文字を取得して表示させます。
表示のさせ方はトースト(朝食じゃないです)やダイアログ、テキストビューで出します。

開発環境

AndroidStudio2.3
MacOS Sierra

プロジェクト作成

mitoavadn.hatenablog.com

Project : Get_String_Textbox
MinimumSDK : API19(KitKat)

レイアウト作成

今回のレイアウトでは

  • テキストボックス
  • ボタン
  • テキストビュー

をそれぞれ一つずつ配置します。
android:id="+id/hoge" のようにして、それぞれにidを設定してください。(後で使います)

コード例
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.mito.get_string_textbox.MainActivity">


    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="156dp"
        android:ems="13"
        android:inputType="textPersonName"
        android:hint="Please Input Text"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="90dp"
        android:text="No Input" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:text="GET"
        android:id="@+id/button"/>
</RelativeLayout>

処理を書く

まず、テキストボックスやボタン、テキストビューの変数を用意します。

private EditText editText;
private Button button;
private TextView textView;

これらのインスタンスをonCreate内で生成します。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //変数 = (キャスト)findViewById(使いたいウィジェットのid)
        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.textView);
}

ボタンにリスナー(その動作、今回で言えばボタンが押された時に呼ばれるやつ)を設定します。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //ここに押された時の処理を記述
    }
});

押されたら、テキストボックスから文字列を取得してそれをテキストビューにセットします。
onClick内に記述

String text = editText.getText().toString();    //EditText(テキストボックス)から文字列を取得
if (!text.equals("")){
    textView.setText(text);    //TextViewに文字列をセット
    editText.setText("");
}

setText() で文字列のセット、 getText() で文字列を取得できます。

今度は入力された文字列をトーストで表示してみましょう。

//Toast.makeText(コンテキスト, 表示したい文字列, どれぐらい(時間)表示させたいか(LONG or SHORT)).show();
Toast.makeText(view.getContext(), text, Toast.LENGTH_LONG).show();

最後にshow()しないと表示されません。(mitoは忘れていて悩んでました)
コンテキストについては今は詳しく知らなくてもいいです。(thisや上のコードのようにすると良さげ)
これでトースト表示まではできたはずです。
最後に、ダイアログで表示させます。

new AlertDialog.Builder(view.getContext())
            .setTitle("ダイアログ")    //タイトル
            .setMessage(text)    //本文
            .setPositiveButton("OK", null)    //押したら閉じるボタンみたいなやつのテキスト(第一引数)
            .show();

ダイアログはこちらからコピペで使えます。
Fragmentを作った方がいいと書いてありますが、今回は書いていません。

おまけ

ついでにボタンを押した時に何も入力されていなかったらトーストを表示されるようにしてみましょう。

if (!text.equals("")){
    ...
    ...
}
else {
    Toast.makeText(view.getContext(), "入力してください", Toast.LENGTH_SHORT).show();
}

最終的なコード

MainActivity.java

package com.example.mito.get_string_textbox;

import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private Button button;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.textView);


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String text = editText.getText().toString();
                if (!text.equals("")){
                    textView.setText(text);
                    editText.setText("");
                    Toast.makeText(view.getContext(), text, Toast.LENGTH_SHORT).show();
                    new AlertDialog.Builder(view.getContext())
                            .setTitle("ダイアログ")
                            .setMessage(text)
                            .setPositiveButton("close", null)
                            .show();
                }
                else {
                    Toast.makeText(view.getContext(), "入力してください", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.mito.get_string_textbox.MainActivity">


    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="156dp"
        android:ems="13"
        android:inputType="textPersonName"
        android:hint="Please Input Text"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="90dp"
        android:text="No Input" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:text="GET"
        android:id="@+id/button"/>
</RelativeLayout>

mito.

3/11 追記
githubにて今回のプロジェクトを公開しました。
リンク(https://github.com/mitohato/AndroidTutorial)

Beacon検知

「ふぁみここ」を作成する際に、ビーコンの情報を取得しないといけない時にやり方が調べてもよくわからず、先輩に話を聞いたりして作成したので、そのやり方

engineer.recruit-lifestyle.co.jp

こちらのサイトを参考にさせていただきました。

やりたいこと

ボタンを押すとビーコンの検知を開始して、もう一度押すと終了するアプリ。
検知したビーコンの情報はログに出す。

開発環境

MacOS sierra
AndroidStudio 2.2.3
java8

準備

まずプロジェクトを作成します。
プロジェクト名「GetBeacon」
API 21:Android5.0 Lollipop
Empty Activity

ボタン配置

デフォルトで入っているTextVIewを削除して、Buttonを追加します。
自分は、真ん中に配置しました。

<!--省略-->
<Button
    android:text="Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:id="@+id/button" />
<!--省略-->

ボタンを押した時のリスナー用意

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     Button btn = (Button)findViewById(R.id.button);
     btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });
 }

ビーコン検知する

パーミッションを追加

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

をmanifests(app/src/main/AndroidManifest.xml)フォルダ内の<applicationと同じ高さに追加します。
このアプリが動作する端末をBLEが利用可能な端末のみにするには
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
も追加します

ビーコンを検知した時に呼ばれるCallBackを用意

新しくJavaClassを作成して、その名前をIbeaconScanCallBackにします。
このコールバックの中身は後で記述します。

BLE受信開始するためのコードを用意

BluetoothLeScanner mBLEScanner;
IbeaconScanCallback scanCallback;

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Bluetoothの生成(ここは5.0以前も一緒)
    final BluetoothManager bManager = (BluetoothManager)getSystemService(BLUETOOTH_SERVICE);
    final BluetoothAdapter bAdapter = bManager.getAdapter();

    // Bluetoothサポートチェック
    final boolean isBluetoothSupported = bAdapter != null;
    if (!isBluetoothSupported) {
        // 非サポート時の処理を書く
        return;
    }

     // Bluetoothオンかチェック
     if (!bAdapter.isEnabled()) {
         // オフ時の処理を書く
         return;
     }


    mBLEScanner = bAdapter.getBluetoothLeScanner();
    scanCallback = new IbeaconScanCallback();

    Button btn = (Button)findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

         }
     });
}

2つほどエラーが出ていると思いますが今は気にしないでください。

IbeaconScanCallbackの内容を記述していく

public class IbeaconScanCallback extends ScanCallback{
    final String TAG = "Beacon";

    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);
        // スキャン結果が返ってきます
        // このメソッドかonBatchScanResultsのいずれかが呼び出されます。
        // 通常はこちらが呼び出されます。
        //スキャン結果からビーコンの情報を取得する
        BluetoothDevice bDevice = result.getDevice();
        //情報からアドレスをログに出す
        Log.d(TAG, bDevice.getAddress());
    }


    @Override
    public void onScanFailed(int errorCode) {
        super.onScanFailed(errorCode);
        // エラーが発生するとこちらが呼び出されます
        String errorMessage = "";
        switch (errorCode) {
            case SCAN_FAILED_ALREADY_STARTED:
                errorMessage = "既にBLEスキャンを実行中です";
                break;
            case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED:
                errorMessage = "BLEスキャンを開始できませんでした";
                break;
            case SCAN_FAILED_FEATURE_UNSUPPORTED:
                errorMessage = "BLEの検索をサポートしていません。";
                break;
            case SCAN_FAILED_INTERNAL_ERROR:
                errorMessage = "内部エラーが発生しました";
                break;
        }
        Log.d("ERROR", errorMessage);
    }
}

BluetoothScanを開始

スキャンが開始しているかのためにflag変数を用意します。
その後、ボタンのリスナー内にスキャンを開始させるためのコードを記述します。

btn.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View view) {
         if (flag) {
             //スキャン開始
             mBLEScanner.startScan(scanCallback);
         }
         else {
             //スキャン停止
             mBLEScanner.stopScan(scanCallback);
         }
         flag = !flag;
    }
});

以上でボタンを押したらビーコンの検知を開始、もう一度押すと停止。
これで検知したビーコンのアドレスをログに出すことができたと思います。
詳しい説明等は参考元を見てみてください。
参考元と変わっている部分が多々あるので気をつけてください。

参考元

http://engineer.recruit-lifestyle.co.jp/techblog/2015-01-15-using-ibeacon-on-android5/

mito.

2/23 追記
Githubにて今回説明したアプリのプロジェクトファイルを公開しました。
https://github.com/mitohato/GetBeacon

2/23 追記 ↑のGithubリポジトリにてkotlinで書いた同アプリのプロジェクトを作成・公開しました。

2018/11/9 追記
Android 6.0からはパーミッションに以下のいずれかを追加しないといけなくなりました。
android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION