「生存率計算機」――懲りずにまたアプリを作ってみた

以前作成したScript Calculatorに続き、またアプリを作成してみました。

play.google.com

作成したアプリのタイトルは生存率計算機、厚生労働省のデータを基に生存率を計算します。

play.google.com

github.com

作ったきっかけ

カメラアプリを作ろうと四苦八苦していたのですが、残念ながらリアルで時間が取れない状況が続きそうで、完成まで持っていくには少し厳しい状況と感じていました。

一方この土日は空いていて、開発したいという意欲はあったので、サクッと作ることができそうな題材でアプリを作ってみました。要するに暇つぶしです。

感想

題材が題材だったので、色々なことは感じましたが、取りあえずこのアプリを作ってみた感想としては、暇つぶしでアプリをリリースする日が来るなんて想像していなかった、です。

まあ対して難しいことはしておらず、レベルはお察しな感じですが、ソースコードそのものはきっかり24時間以内で書き上げられたので、そこは成長かなあと思うことにします(笑)。

Android6.0(APIレベル23以上)で、アプリに権限を与える

アプリに権限を与えようとした時に詰まったので、備忘用に。

やること

APIレベル23から、Androidでアプリを動かす際に必要なパーミッションが、アプリインストール時ではなく、その機能を使う時に取得するようになったため、AndroidManifestへの記述だけでなく、そのためのコードが必要になった(今更)。
この権限を与える処理が非常にめんどくさかったので備忘を兼ねて投稿。
ただ、まだ理解が追いついておらず、このやり方で効率が良いのかは確認できていない。
余分なものが入っていないコードはまとめに記載。

やったこと

前提として、AndroidManifestにパーミッション関連を記述しておく。

onCreate

今回はアプリ起動時に権限を付与することを想定して、onCreateメソッドから。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //カメラ権限の確認
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {//権限がまだ無い場合
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {//明示的に権限が拒否されていた時
            //拒否されていた時の処理、なんかしらのメッセージを出すと良いと思われる、今は何も考えずにパーミッションを聞いておく
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
        } else {//まだ聞いてなかったとき
            //与えても良いか聞く、onRequestPermissionsResultが答えを受ける
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
        }
    }else {//権限がある場合
        initCameraView();//そのままカメラをセッティング
    }
}

※initCameraViewメソッドは自作したもので、この記事の内容には関係無し

ここではカメラ権限のチェックと、権限が無かった場合の付与を呼び出している。
大半はコード中のコメントに書いた通りで、権限のチェックには

  • 現在権限が与えられているか
    • 権限が無かった場合どうするか
      • 権限が無いのは、ユーザーに拒絶されているからか
        • 拒絶されているならどうするか
        • まだ聞いていないならどうするか
    • 権限が有った場合どうするか

といったような手順が必要。

権限を与えるために呼び出すメソッドは以下。

ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);

Manifest.permission.CAMERAとなっている部分は取得する権限を意味する。
末尾で与えている定数の1は、後述するonRequestPermissionsResultメソッドで利用する。

onRequestPermissionsResult

このメソッドは、権限付与のために呼び出したrequestPermissionsメソッドに対する返答を受け取るメソッド。
これを書かないと権限の有無を確認しないまま処理が開始されてしまい、権限が無いまま機能を利用しようとしてアプリがSecurityExceptionで落ちたりする。

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: { //ActivityCompat#requestPermissions()の第2引数で指定した値
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//許可された場合
                setContentView(R.layout.activity_main);
                initCameraView();
            }else{//拒否された場合の処理
                //とりあえず終了しておく
                MainActivity.this.finish();
            }
            break;
        }
    }
}

ここでrequestCodeをswitchに渡しているが、この数字が先ほどのrequestPermissionsメソッドに与えた定数。
先ほどは1を渡したので、1に関してはカメラの権限付与がどうなったか確認を行っている。
幾つかの権限を与える最には、enumなりを使ってrequestCordを管理した方が良いかも?
とりあえずここまで実装しておけばアプリに権限を与えることができた。

蛇足

onRequestPermissionsResultにて、initCameraの前にsetContentViewを行っているが、これをしないとカメラを起動する前にアプリが落ちた。
原因を理解する前に多分ビューの切り替えがおかしいんだろと予想して切り替えを記述してみたが、ドンピシャだったので何故落ちるか理解できていない。

まとめ

今回載せたコードから、余計なものを取り除いてまとめたものが以下。

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: { //requestPermissions()の第2引数で指定した値
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//許可された場合
            }else{//拒否された場合の処理
            }
            break;
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //カメラ権限の確認
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {//権限がまだ無い場合
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {//明示的に権限が拒否されていた時
            //拒否されていた時の処理
        } else {//まだ聞いてなかったとき
            //与えても良いか聞く、onRequestPermissionsResultが答えを受ける
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
        }
    }else {//権限がある場合
    }
}

Androidアプリで、簡単にファイルにデータを保持する

 開発の備忘のため記事を残す。

やりたいこと

 EditTextなど、アプリ内でユーザーが行った変更をファイルに保持しておき、アプリを起動した際に、データを読み込む。

 設定などを保持することにも応用できるかも?

 プリファレンスを使うなどの方法もあるそうだが、Javaを扱ったことがあるなら単純さの分だけFileを利用するこの記事のやり方が向いているかも。

やり方

 やり方は以下のようにしてFileを初期化すること。ここではhogeというファイル名のファイルを作っている。

File file = new File(getFilesDir(),"hoge");

 ここからBufferReaderなりPrintWriterなりにfileを渡してやれば読み書きできる。

補足

 getFilesDir()は素では呼べないのかもしれないが、自分のソースコード上では特に何もimportせずに動いていた。(備忘と言いつつ書いている時には何で動くのか分からなくなっていた……)

 getCacheDir()でも同じようなことができるようだが、こちらはストレージ容量がキツくなった時に消される可能性があるらしい(未検証)。

参考サイト

 今回の記事は以下のサイトから必要だった部分のみ抽出して作成した。

 Saving Files | Android Developers

初めて他人に使ってもらうためのプログラムを作って感じたこと

 自分は、ScriptCalculatorというAndroidアプリを作りました。

play.google.com

github.com

 このアプリは、自分が初めて他人に使ってもらうために作ったプログラムです。このアプリを作ったきっかけと、その中で感じたことについて書きます。

なぜアプリを作ってみようと思ったか

 自分がアプリを作ろうと思ったきっかけは大きく3つあります。

  • 他の人がアプリを作って公開していたから
  • 響く言葉に出会ったから
  • 自分が成長したかったから
他の人がアプリを作って公開していたから

 まず自分は、高専から大学3年に編入して、初めて自分で作ったアプリを公開しているような人間と出会いました。これまでの人生の中で、そうやって他者にアプリを公開するような人と出会ったことはなく、そういった人と友人になれたのは、大学に入ってからでした。

  正直、とてもショックを受けました。

 プログラムというものは自分の中で、学校で課題としてやるものという領域を出てはおらず、他人に公開するなんてイメージはありませんでした。ただ一方で、これぐらいなら自分もできるんじゃないか、というイメージも持っていました。

響く言葉に出会ったから

 そんな風に、なんとなく自分にもできるんじゃないか、というイメージを持った状態で、twitterで、自分にとても良いヒントを与えてくれる言葉に出会いました。保存を忘れてしまったので出典が出せないのですが、出会った言葉は、内容的には以下の2つです。

「芸事は学生の内にやっておかないで、どうして社会に出てからできるようになると思うのか。学生の内にやっていない奴が伸びる訳が無い」

「金にならない知識に価値は無い」

 自分は、これらの言葉でプログラミングは芸事と同じだと感じました。確かに大学でもプログラミングを学ぶことはできますが、あくまでそれは基礎の基礎で、突き詰めるならより深く、どこまででも行ける物です。

 一方で、突き詰めるためには時間が必要です。

 自分はプログラムを組むことは好きですが、それをやりたい放題で学ぶことができるのは時間がある今しか無いのだ、という意識が、この言葉で固まりました。

 そして、自分の知識はまだ金になるようなものではない、という気付きも重要なきっかけでした。芸事だからこそ、金になるレベルまで何かする、ということが自分の目標として定まりました。

自分が成長したかったから

 そうこうしているうちに、自分の中には成長したいという気持ちが強く生まれていました。自分でも信じられないほどに、お金を稼ぎたい、何かを作っている他人に負けたくない、その為に成長したいという感情が沸いていました。

 そして春休みに入り、ようやく時間ができたことで、アプリの作成に着手できました。

アプリを作ってから感じたこと

 アプリを作ってから感じたことは、「何だか割と簡単じゃん!」という納得と、「これはどうやったら金になるんだろうか?」という疑問でした。

なんだか割と簡単じゃん!

 アプリをリリースするまでに掛かった時間は、大体2週間程でした。

 二週間のかなりの部分をアプリ作成に費やしたので、これが長いか短いかは何とも言えませんが、作るだけなら割と簡単にできました。

 勿論、Androidの機能をそれほど使いこなしたわけではなく、JavaAndroidで動く形にしただけというようなアプリでしたが、これ位の内容であれば割と簡単に作れるんだということは感じました。

 今回のアプリ開発はAndroidStudioで行いましたが、AndroidStrudioの使い方にも多少は慣れたので、次にアプリを作るならもっと短時間でも行えると思います。

これはどうやったら金になるんだろうか?

 作っている間から薄々感じていましたが、このアプリは金にはならないだろうと思っています。掲載開始は3月12日ですが、ストア掲載情報の訪問者数、インストール数共に1桁を越えていません。

 これからインストール者数が増えたとしても、たかが知れているでしょう。

 自分はこのアプリを開発するために、本とGoogle Playデベロッパーへの登録料とで8千円程使っていますが、この出費の分を取り返すためには恐ろしく時間が掛かりそうだと感じています。

反省と今後のこと

 今回の開発での反省点は、やればできることを確認できた点と、金を稼ぐことを甘く見ていた点です。

やればできる

 今回の開発で、これ位なら自分もできる、という曖昧なイメージは、具体的な作品に変わりました。

 自分はやればできる、ということを確認できたことは自信につながったと思います。

 目新しい技術を使ったり、面白いことをしているという訳では全くありませんが、それはそれ、これはこれでしょう。

金を稼ぐことは甘くない

 今回の開発で自分が手に入れたものは、Androidアプリの開発のための本、Google Playデベロッパーアカウント、AndroidStudioを利用した開発の経験、ちょっとだけ友人に凄いと言ってもらえた喜びの4つでした。

  成長という目的はある程度達成できたのかもしれませんが、単純に金銭的だけを見ると大負けです。全く金の気配がしませんし、短期的に見るなら2週間バイトした方がよっぽど大きな金になったでしょう。

 正直開発する前には、「アプリを出す→ちょっとはお金になる」ということしか考えていませんでしたが、予想以上に金を稼ぐということは難しいようです。

今後のこと

 兎に角今は、分からないこと、知らないことが多すぎるということしか分かっていないなあと感じています。反省していることが正しいのかすらも分かりませんし、学生の勉強に金という基準を持ち込むことはそもそも間違っているような気もしています。

 ただ、やったことは無駄にならない、という実感だけは持つことができました。

「まずはやったぞ!」という記念として、この記事を残しておきます。

ブログ開設

こんにちは、wrongwrongと申します。

 

情報系の大学生をやっています。

自分の勉強したことや挑戦したことをまとめるため、ブログを開設してみました。

 

よろしくお願いしますm(_ _)m