2016年10月22日土曜日

Androidで超シンプルな写真メモを作る!

こんにちは、aschです!!

今回はなんと!!

「われわれ」が作った独自アプリ!!

写真メモアプリ「PictureMemo」の紹介!!



まだストア申請していないので、野良アプリですが以下からDLして動作確認も可能です!
http://wareware.apptest.sparetimes.jp

その名の通り、写真にメモができるアプリです!

えっ!?それだけ??

写真にメモをすることなんてある??

ノンノン、このシンプルさと手軽さが他にはない「われわれ」独自のものとなっています。

それではアプリの特徴を紹介します。
※技術的なことは記事の終わりに書くので、技術者の方はそちらまで読み飛ばしてくださいm(--)m



・機能がとにかくシンプル!

カメラなどで撮った写真を最新のものから順番に表示しています(表示枚数は3種類から選択化)
タップで↓のように拡大表示


リストをロングタップすることで簡易のメモを記入できる!


日付は写真を解析してリスト表示されているので、

場所や天気、気温などを記入するとあとでブログや日記、学校の課題をまとめるときに便利でしょう。

「われわれ」が修行を行うにあたって、滝や景色の場所を詳しく覚えておきたいという要望があり、今回アプリ作成にいたりました。

・広告表示なし!

次の特徴はこちらです!

そもそも「われわれ」内部だけでしか使うことを考えていなかったので、広告は一切ありません!

つまり完全無料!

誘導・誘発クリックもおきないので使いたいときにぱっと使える

・写真が撮れる

カメラボタンを押せば写真もとることができます!
・解像度は機種依存
・AF機能つきピントもばっちりおk
・シャッター音なし



今後も「われわれ」ではアプリ開発など行っていきます!
アイデアがあれば、ぜひ「われわれ」まで!!

・Android、iOS などのモバイルアプリ開発
・Perlによるファイルの解析出力
・Unityなどでゲーム作成
・Windowsアプリ開発
・Web系(デザイン除く)
※上にあるものほど、得意としています


ここからは技術的なお話を…



今回のアプリ作成でつまづいたのは「権限」の問題!!

API23(つまりAndroid 6.0)から権限についての考え方が変わりました。

今までは、アプリインストール時に権限が表示され、ユーザーが許可をしないとそもそもインストールができない仕様になっていました。

API23からはユーザーが1つ1つの権限の許可を決めることができるようになりました。

そのため、

「カメラはおkだけど、電話帳の許可はOFFにしておこっと」

という使い方ができるようになります。

つまり…開発者は

「権限が許可されないこともある」


ということを念頭においてアプリを作る必要があります。

そのため、アプリ内で権限の許可を確認し、ない場合は許可をうながす…

許可された場合、されなかった場合を考えて実装しなければなりません。


if ((ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) ||
    (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) ||
    (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
    // 許可されている時は画像表示などの処理
}else{
    if ((ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.CAMERA)) ||
        (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)) ||
        (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
        //拒否された時は機能の無効化や、再確認ダイアログなどの処理
    } else {
        //許可されていない場合は、許可を求めるダイアログを表示処理。       
    }
}

ContextCompat.checkSelfPermission(this, android.Manifest.permission.○○) == PackageManager.PERMISSION_GRANTED
で○○の権限があるかを確認します。
許可がない場合は以下の関数で許可ダイアログを出すことができます

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA, android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);

第二引数は、権限のStringの配列です。

配列を追加していくことで、その分の許可ダイアログをいっぺんに出すことができます。

第三引数はint型の任意の値です。

今回は0ですが、たとえば、別々に許可ダイアログを出した場合に0,1,2としておけば

後述するハンドラ内部でswitch文などで処理をわけることができます。

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


上の形で受け取りを行います。

このように、権限の考え方が変わったので、開発者は苦労が増えると思いますが、

逆に幅が広がったと前向きに考えていきましょう

0 件のコメント:

コメントを投稿