20190714のAndroidに関する記事は8件です。

リモートマシンのエミュレータとadbで接続して開発する

はじめに

リモートの仮想マシンにRDPでつないでAndroid開発を試みた際、HAXMが動作しない問題1に直面しました。
さすがにリモートの仮想マシンというただでさえ枷の多い環境で、更にエミュレータまで動作に問題があるとなると、開発時のストレスが大変なことになりそうだったので、エミュレータだけローカルで動作させる方法を探してみました。

調査結果

以下のように開発を行うローカルマシンから、エミュレータを動作させるリモートマシンに対してsshでポートフォワーディングを行います。
こうすることで、ローカルのadbなどなど、各種ツールがリモートのエミュレータと接続することができるようになります。

ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 <ユーザー名>@<リモートマシンのアドレス> -p <ポート番号>

接続後、ローカルのadbを再起動することで認識されるようになります。
AndroidStudioからきちんとビルドしたapkをインストールさせて動かすことが出来ますし、Logcatにもきちんとログが出力されますし、ブレークポイントで処理を止めることも出来ます。
軽く触ってみた感じ、ローカルで通常の方法で動作させているエミュレータと遜色ない動作をします。

Peek 2019-07-14 22-58.gif

リモートのWindowsマシンからローカルのUbuntuマシン上のエミュレータを使う

解説

5554はtelnet用、5555はDDMSなどのツール用にオープンされているポートです。これらの通信をリモートに飛ばすことでリモートマシンに存在しているエミュレータを制御することが可能になります。

参考

https://stackoverflow.com/questions/1754162/remote-debugging-with-android-emulator


  1. HAXMは仮想マシン上で仮想化を行うことは出来ません 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

キラッとプリ☆チャンコーデ管理アプリを更新してみた!

以前、書いたこちらの記事(キラッとプリ☆チャンのコーデ管理アプリを作ってみた話)から更新しました。

更新した部分

リストの読み込み部分をSQLiteのデータベースにマルナゲ!

前のは、いちいちソースに書いてたので、これをSQLiteで作成しておいたデータベースを取得して、アプリのリストビューで見れるように。

     private class ListShowClickListener implements View.OnClickListener {

        @Override
        public void onClick(View view) {
            // データベースヘルパーオブジェクトを作成
            DatabaseHelper helper = new DatabaseHelper(PrichanJewel1.this);
            // データベース接続オブジェクトを作成
            try (SQLiteDatabase db = helper.getWritableDatabase()) {
                String sql = "select * from prij1corde order by _id";
                Cursor cursor = db.rawQuery(sql, null);
                String[] column = {"card_name", "card_own"};
                int[] cardList = {android.R.id.text1, android.R.id.text2};
                SimpleCursorAdapter adapter = new SimpleCursorAdapter
                        (PrichanJewel1.this, android.R.layout.simple_expandable_list_item_2,
                                cursor, column, cardList, 0);
                lvJprichan.setAdapter(adapter);
            }
        }
    }

これで、SQLiteに既に作られたデータベースにアクセスして、リストを取得して、リストビューに表示することができるようになりました。
更新の場合も同じような感じで出来ました。

        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
            // 長押しされた位置を取得
            Cursor item = (Cursor)lvJprichan.getItemAtPosition(position);
            // 取得した位置にあるリスト名を取得(ここではカード名を取得する)
            String card_name = item.getString(item.getColumnIndex("card_name"));
            // データベースヘルパーオブジェクトを作成
            DatabaseHelper helper = new DatabaseHelper(PrichanJewel1.this);
            // データベース接続オブジェクトを作成
            try (SQLiteDatabase db = helper.getWritableDatabase()) {
                String upSql = "update prij1corde set card_own = '所持済' where card_name = '" + card_name + "'";
                SQLiteStatement stmt = db.compileStatement(upSql);
                stmt.executeUpdateDelete();
            }
            Toast.makeText(PrichanJewel1.this,
                    "登録完了!",Toast.LENGTH_SHORT).show();
            return true;
        }

なお、データベースヘルパーは
男子大学生の考えること:自前のSQLiteDatabaseファイルをassetsからandroidで使えるようにする
で、紹介されているソースコードほぼそのまま使っています。
リスト取得はこちらの記事が参考になりました。

sqliteで取得した値をListViewに表示する簡単な例

どうしてそう出来たの?

なかなかいいアイデアが閃かず、半ばヤケクソでJavaとPostgreSQLで同じような仕組みのを作ったことで、ひらめいたわけです。
「データベース組み込んだらできるんじゃね?」
と。
やったことが全く無かったので、色々調べて半信半疑でやってみたら、うまく行ってしまったのでこういうことになったわけです。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidアプリ作成でつまづいた点

こんにちは、ハイノです。

初めてAndroidアプリ開発を行っているのでつまづいた点を備忘録として投稿します。
今回の投稿では、つまづいた点を随時更新形式で列挙していくものです。
解決策はまた、見つけた場合に別記事で投稿する形にしたいと考えています。

Androidアプリ開発初心者がつまづくポイントは同じところが多いと予想していますので、
同じく初めてAndroidアプリ開発を行うという方にも私がつまづいた点を共有できれば
と考えています。
また、「ここでつまづいたときの解決策はこんなのがあるよ」ってコメントを頂けると
非常にありがたいです。
では、以下につまづきポイントを列挙していきます。

つまづきポイント

1.xmlでlayoutを作成しているときにGUIの設定に頼って画面サイズに対応できないこと
2.TwitterAPIの通信方法
3.JSONのパース方法
4.Listener
5.Fragment

解決方法

随時更新

開発環境

Android Studio 3.4.1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidアプリ作成でつまづいた点【随時更新】

こんにちは、ハイノです。

初めてAndroidアプリ開発を行っているのでつまづいた点を備忘録として投稿します。
今回の投稿では、つまづいた点を随時更新形式で列挙していくものです。
解決策はまた、見つけた場合に別記事で投稿する形にしたいと考えています。

Androidアプリ開発初心者がつまづくポイントは同じところが多いと予想していますので、
同じく初めてAndroidアプリ開発を行うという方にも私がつまづいた点を共有できれば
と考えています。
また、「ここでつまづいたときの解決策はこんなのがあるよ」ってコメントを頂けると
非常にありがたいです。
では、以下につまづきポイントを列挙していきます。

つまづきポイント ※随時更新

1.xmlでlayoutを作成しているときにGUIの設定に頼って画面サイズに対応できないこと
2.TwitterAPIの通信方法
3.JSONのパース方法
4.Listener
5.Fragment
6.Layout

解決方法 ※随時更新

6.Layoutについて
下記サイトが非常にわかりやすくて参考にしました。
https://qiita.com/mii-chang/items/ee965c1e8826d4e59414

開発環境

Android Studio 3.4.1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AndroidでDarkThemeを実装する

ダークテーマの実装

要約

ダークテーマの実装の流れは

  1. テーマの切り替えを実装して
  2. ダークテーマ用にリソースを用意して
  3. レイアウトにあててデザインを確認する

です。

1.テーマの切り替え

ダークテーマは、夜間モードテーマを使用して実装します。

Medium - Android Developers "AppCompat — DayNight"
https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94

夜間モードテーマへの切り替えは、AppCompatDelegate.setDefaultNightMode()で行います。

  • AppCompatDelegate.setDefaultNightMode()
    • MODE_NIGHT_NO. // 昼間モードテーマ
    • MODE_NIGHT_YES. // 夜間モードテーマ

ユーザが夜間モードテーマに自ら切り替えた場合、切り替え後は Activity#recreate()を呼び出すとテーマが適応されます。
→ 切り替えるタイミングによっては、Activityの状態復元に注意してください!:point_up:

2.リソースの用意

夜間モードテーマ用にリソースを用意します。
夜間モードテーマ用にリソースは、リソース末尾に-nightを付けます。
こうすることで、昼間モードリソースと夜間モードリソースを設定できます。

2019-07-14.png

そして、各ファイル同じ名前のリソースを用意してあげます。
例えば、以下のようなcolor.xmlを用意すると、colorPrimaryの場合、昼間モードテーマでは#008577ですが、夜間モードテーマに切り替えると、#212121になります。

values/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="colorBackground">#ffffff</color>
    <color name="colorText">#000000</color>
</resources>

values-night/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#212121</color>
    <color name="colorPrimaryDark">#212121</color>
    <color name="colorAccent">#212121</color>
    <color name="colorBackground">#313131</color>
    <color name="colorText">#ffffff</color>
</resources>

どちらのテーマでもリソースが同じでよい場合は、夜間モードテーマで指定する必要はないですよ:ok_hand:

3.ダークテーマのレイアウト確認

ダークテーマを実装したとき、デザインの確認を毎回Buildしてダークテーマに切り替えて確認していました。
が、、、もっと簡単に確認できる方法がありました。:joy_cat:

  1. レイアウトを開いて、Designタブに切り替える
  2. 左上のアイコンをタップすると、Night Modeがある
    2019-07-13 (5).png

  3. Night Modeをタップ(Not Nightになってる)
    2019-07-13 (6).png

  4. Nightに切り替える
    2019-07-13 (14).png

これでビルドせずに、レイアウト上でテーマを切り替えることができるので、ダークテーマのデザインの確認もすぐにできます。
(私はこの機能をしばらく見つけれれていなかったので、毎回ビルドしてダークテーマのデザイン確認して、調整して、、、てやってたので効率悪かったです...:zipper_mouth:

参考

Google I/O 2019で、Android公式のダークテーマのデザインガイドラインも公開されています。

また、現在β版が公開され、もうそろそろ最終リリースされるAndroid Qでは、端末の設定にダークテーマが追加されました。
ダークテーマに対応したアプリなら、端末の設定に連動してダークテーマ表示になるようです:crescent_moon:

感想

ダークテーマの導入は、開発者よりも、ダークテーマ用にデザイン全部あてて、リソースも全部用意しないといけないデザイナーさんの負担の方が大きいなというのが所感でした。

Android Q のリリースとともに、今後ダークテーマの実装は、ユーザの需要が高まりそうですね:sparkles:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidアプリでダークテーマを実装する

ダークテーマの実装

要約

ダークテーマの実装の流れは

  1. テーマの切り替えを実装して
  2. ダークテーマ用にリソースを用意して
  3. レイアウトにあててデザインを確認する

です。

1.テーマの切り替え

ダークテーマは、夜間モードテーマを使用して実装します。

Medium - Android Developers "AppCompat — DayNight"
https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94

夜間モードテーマへの切り替えは、AppCompatDelegate.setDefaultNightMode()で行います。

  • AppCompatDelegate.setDefaultNightMode()
    • MODE_NIGHT_NO. // 昼間モードテーマ
    • MODE_NIGHT_YES. // 夜間モードテーマ

ユーザが夜間モードテーマに自ら切り替えた場合、切り替え後は Activity#recreate()を呼び出すとテーマが適応されます。
→ 切り替えるタイミングによっては、Activityの状態復元に注意してください!:point_up:

2.リソースの用意

夜間モードテーマ用にリソースを用意します。
夜間モードテーマ用にリソースは、リソース末尾に-nightを付けます。
こうすることで、昼間モードリソースと夜間モードリソースを設定できます。

2019-07-14.png

そして、各ファイル同じ名前のリソースを用意してあげます。
例えば、以下のようなcolor.xmlを用意すると、colorPrimaryの場合、昼間モードテーマでは#008577ですが、夜間モードテーマに切り替えると、#212121になります。

values/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="colorBackground">#ffffff</color>
    <color name="colorText">#000000</color>
</resources>

values-night/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#212121</color>
    <color name="colorPrimaryDark">#212121</color>
    <color name="colorAccent">#212121</color>
    <color name="colorBackground">#313131</color>
    <color name="colorText">#ffffff</color>
</resources>

どちらのテーマでもリソースが同じでよい場合は、夜間モードテーマで指定する必要はないですよ:ok_hand:

3.ダークテーマのレイアウト確認

ダークテーマを実装したとき、デザインの確認を毎回Buildしてダークテーマに切り替えて確認していました。
が、、、もっと簡単に確認できる方法がありました。:joy_cat:

  1. レイアウトを開いて、Designタブに切り替える
  2. 左上のアイコンをタップすると、Night Modeがある
    2019-07-13 (5).png

  3. Night Modeをタップ(Not Nightになってる)
    2019-07-13 (6).png

  4. Nightに切り替える
    2019-07-13 (14).png

これでビルドせずに、レイアウト上でテーマを切り替えることができるので、ダークテーマのデザインの確認もすぐにできます。
(私はこの機能をしばらく見つけれれていなかったので、毎回ビルドしてダークテーマのデザイン確認して、調整して、、、てやってたので効率悪かったです...:zipper_mouth:

参考

Google I/O 2019で、Android公式のダークテーマのデザインガイドラインも公開されています。

また、現在β版が公開され、もうそろそろ最終リリースされるAndroid Qでは、端末の設定にダークテーマが追加されました。
ダークテーマに対応したアプリなら、端末の設定に連動してダークテーマ表示になるようです:crescent_moon:

感想

ダークテーマの導入は、開発者よりも、ダークテーマ用にデザイン全部あてて、リソースも全部用意しないといけないデザイナーさんの負担の方が大きいなというのが所感でした。

Android Q のリリースとともに、今後ダークテーマの実装は、ユーザの需要が高まりそうですね:sparkles:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ナンプレ解答アプリ「ナンプレ自動解答」(Android版)とその実装機能の紹介

よちよちサンデープログラミングトップへ

はじめに

「ナンプレ自動解答」(Android版)は、ナンプレ(数独)の問題を写真に撮ると、その問題を自動的に解き、答えを示すアプリです。
そのため、例えばナンプレの懸賞本の大量の問題を解く時間を短縮したり、解答が載っていない問題の答えを確認したり、あるいは自作した問題が正しく答えを導き出せるものであるかどうかを確認したりするのに使えます。
ナンプレ自動解答画面

本記事では、ナンプレ自動解答で実装している各機能をTipsとして解説します。

  • アプリのダウンロードは、こちら
  • プロジェクトソースの入手は、こちら
  • iOS版「ナンプレ自動解答」の解説記事は、こちら

開発・実行環境

ナンプレ自動解答は、以下の環境で開発・実行しています。

  • 開発環境 : macOS、Android Studio(3.3~3.4)、Java
  • 実行環境 : Android 5.0以上

アプリの構成の概要

ナンプレ自動解答は、2つの画面を持ちます。1つは、ナンプレの問題(9x9のマス目や各マスの数字)を表示し、数字を編集するため操作を受け付ける独自ビューと、機能を呼び出す複数のボタンと、広告(AdMob)が表示されます。もう1つは、ナンプレの問題を写真に撮るためのCamera2 APIを使ったカメラ画面です。
本アプリでは、カメラで撮影した写真から、ナンプレの問題(9x9のマス目)を切り出し、さらにその各マスの数字を認識し、解答処理を行う対象データとして取り込みますが、マス目の切り出しにはOpenCVを使い、数字の認識にはOCRライブラリ(tess-two)を使っています。

実装している機能

本アプリを実現するために、以下の機能を実装しており、それぞれTipsとして解説していきます。
※リンクをクリックするとTips解説記事に飛びます。リンクされていない項目は、記事を鋭意作成中です。

  • AdMobを組み込む(AdMob SDK)
  • 広告を表示する(AdMob SDK)
  • OpenCVライブラリを組み込む
  • 写真から、四角形領域を切り出す(OpenCV)
  • OCRライブラリを組み込む(tess-two)
  • OCR機能で文字を認識する(tess-two)
  • アセットに格納しているデータをファイルに書き出す
  • 独自ビューを生成する(FrameLayout、View)
  • 独自ビューに描画する(View)
  • 画面レイアウト決定後に、ビューを再描画する(FrameLayout)
  • 独自カメラ機能を実装する(Camera2)
  • ユーザからカメラの利用許可を得る
  • 画面(アクティビティ)間でデータをやり取りする(Intent)
  • 画像(Bitmap)をファイルに保存する(FileOutputStream)
  • 画像(Bitmap)の一部を切り出す
  • 非同期処理(別スレッド処理)をする(AsyncTaskLoader)
  • 処理待ちのインジケータ(くるくる)を表示する・消す(ProgressBar)
  • アプリのバージョン番号を取得する(PackageManager)
  • メニューを表示する(Menu)
  • ボタンの形状をカスタマイズする(Button)
  • 多言語対応する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よちよちサンデープログラミング(トップ)

本記事群について

本記事群は、私自身が開発したスマートフォン(Android、iOS)やWebのアプリで実装した機能をコードや図表で解説します。
これにより、プログラミング初心者の方にとっての、アプリを開発する上で役に立つTips集となることを目指します。

解説の対象となるアプリは、以下の通りです。(2019.7.14現在)

Sign! (iOS版)

iPadやiPhoneをシンプルなデジタルサイネージとして使うためのアプリです。
WebページやGoogleスライドで作ったスライドショーや、固定のテキストメッセージやTwitterへの投稿をティッカー(流れるテキスト)としてフルスクリーンかつノースリープで表示できるもので、例えば商品POP、レストランメニュー、展示ブースの看板、電光掲示板などに使えるものです。
Xcode(10)、Swift(5)で開発し、ページめくり、Web表示、タイマー、多言語対応、Twitter SDK、広告(AdMob SDK)などの機能を実装しています。
Sign!利用イメージ

ナンプレ自動解答 (iOS版)

ナンプレ(数独)の問題を写真に撮ると、その解答が得られるアプリです。
Xcode(10)、Swift(5)で開発し、独自ビュー、非同期処理、カメラ機能(AVFoundation)、OpenCV、OCR(Tesseract OCR iOS)、広告(AdMob SDK)などの機能を実装しています。
ナンプレ自動解答画面

ナンプレ自動解答 (Android版)

iOS版と同様の機能を実装しています。OCRにはtess-twoを使用しています。
Android Studio(3.4)、Javaで開発しています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む