- 1. 3 ヶ月掛けて 1 人で Android アプリをリプレイスした話
- 2. AndroidからAWS Cognitoのユーザプールをさっくり使う
- 3. ダークモードにまつわる誤解を解いておく
- 4. 【Android】センサーを使う方法
- 5. HMSスマホでLINE CLOVA Assistantを有効にする手順と機能紹介
- 6. スコープ関数のrun()関数を使わずに、ピリオドでメソッドを連結させる
- 7. Android端末におけるMSALを使用したSSO認証
- 8. Android UIテストでActivityとFragmentにコンストラクタインジェクションする
- 9. Kotlin SAM変換(ラムダ式)を元に戻す
- 10. 【Android】APIのレベルによるエラーの対処方法
- 11. Android QのScoped StorageでJPEG/MPEG撮影→外部Storageに保存→EXIF編集
- 12. HiltViewModelでAbstractなViewModelをInjectしてみるチャレンジ
- 13. Dagger 2.31のAssisted Inject
- 14. ハッカソンでOSMを使いたかったので、別の投稿を参考にOSMDroidとMapQuestを使ってみた話
- 15. AAC の ViewModel で View のライフサイクルとリンクさせる時は OnLifecycleEvent でフックするといいよね、と言う話
- 16. AndroidTV9にadbでapkインストールし開くメモ
- 17. ピンあてゲーム「Hit and Blow」をFlutterでリリースした話【個人開発】
- 18. 【Android】AndroidセンサーAPIの種類
- 19. Flutter で仕事したい人のための Widget ツリー入門
- 20. 【Android】Code Reformatに関するメモ
3 ヶ月掛けて 1 人で Android アプリをリプレイスした話
最近、現場で 3 ヶ月掛けてアプリのリプレイスを 1 人で行いました。
下記はプルリク時の修正ファイル数の画像です。![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/ddc2ae75-b208-e5a0-74cc-23142358358c.jpeg)
どのようなきっかけでリプレイスを行い、問題点は何だったか、具体的に何をやって結果どうなったかなどをまとめます。
# ソースコード構成
コア機能を実装したモジュールがあり、各社ごとにアプリを作成し、各アプリがそのモジュールを参照する構成となっております。
リプレイス対象としてはモジュールと、ある会社向けにリリースしていたアプリの 2 つになります。# なぜリプレイスを行ったのか
きっかけはとある会社から直近で大幅な機能追加をしてほしいと要望があったことです。
ところが現行アプリは機能追加を想定した作りになっておらず、このまま追加するのが困難だと予想されました。
また、今後もさらに機能追加を行っていくとのことで、このままでは間違
AndroidからAWS Cognitoのユーザプールをさっくり使う
![スクリーンショット 2021-01-21 8.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924658/026507a3-3977-e0d2-c867-46e2c94ed8b3.png)
サインアップやサインイン、パスワード再発行など、ユーザ管理がないアプリケーションを見かけない日はありません
とはいえ自前でバックエンドのシステムを作るのも大変…
でもAmplifyはちょっとリッチすぎる気がする…そんな私のための備忘録です
下記のことができます
– メールアドレス、パスワードによるサインアップ、ログアウト
– メールアドレス認証
– パスワード再発行メールアドレスやパスワードはガッツリ個人情報です
その辺りの管理をAWSにお願いできるのはかなり気楽ですよねー# 前準備
## SES (Simple Email Service)に配信用のメールアドレスを登録する
![0_SESにメールアドレスを登録し、送られたURLをクリックしてVerifyする.PNG](
ダークモードにまつわる誤解を解いておく
Githubがダークモードに対応したのが昨年12月。調べて見るところ我々開発者には「目に優しい」と認識されている一方、一般層には単に「格好いいモード」と思われていたりなようです。更にそれだけでもないという記事を見つけました。
## 概要
以下、流行ってるな~と思ったので、まとめました。「ダークモード」のメリット、デメリット。本当のところ。[GitHubをダークモードで使う](https://qiita.com/TerToEer_sho/items/7e14149c7172a2eb19c5)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f77e6e14-4ee6-5ba9-b569-dfe95522d282.png)
[ダークモードに対応したデザイン](https://qiita.com/sugar_tk/items/54562d8756b69774aecf#%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89%E3
【Android】センサーを使う方法
#プログラミング勉強日記
2021年1月20日
[一昨日の記事](https://qiita.com/mzmz__02/items/d5fc432fbc772866b2e8)でAndroidのセンサーAPIについてまとめた。今日はAndroidのセンサーの使い方を簡単にまとめる。#Androidセンサーを使う方法
Androidセンサーを使う処理を説明する。##1. SensorManagerを取得
SensorManagerを取得するためには、getSystemServiceメソッドを使う。引数には、android.contentパッケージのContextクラスの定数SENSOR_SERVICEを指定する。“`java:SensorManagerの取得
// SensorManagerインスタンス
private SensorManager sensorManager;@Override
public void onCreate(Bundle savedInstanceState) {
// SensorManagerのインスタンスを取得する
senso
HMSスマホでLINE CLOVA Assistantを有効にする手順と機能紹介
# HMSスマホの音声アシスタント
音声アシスタントとは音声だけで端末を操作する機能です。
一般的に、Android端末ではGoogleアシスタントがプリインストールされ、使われています。ところが、ファーウェイの最新端末にGoogleのアプリがプリインストールされていないし、GMSも入っていないので、Googleアシスタントが利用できません。
ファーウェイは去年[セリア(Celia)](https://consumer.huawei.com/en/emui/celia/)という音声アシスタント機能をリリースしました。しかし、残念ながら、日本語がまだ対応されておらず、日本もまだサポート地域に入っていません。
幸い、HMS端末で使える音声アシスタントはほかにあります。それはLINE CLOVA Assistantです。しかも、以下の[HMS端末ではLINE CLOVA Assistantが標準搭載になっています](https://clova.line.me/huawei/)。
– [HUAWEI P40 Pro 5G](https://consumer.huawei.com/jp
スコープ関数のrun()関数を使わずに、ピリオドでメソッドを連結させる
金田著「[はじめてのandroidプログラミング 第5版](https://www.sbcr.jp/product/4815607968/)」を使って、勉強しています。
「第9章カウントダウンタイマーを作ろう」で使っているkotlinの文法のテクニックを解析してみます。
スコープ関数のrun関数を関数式に直してみます。
はじめはrun関数の意味が分からなかったので、まずはrun関数を使わず、インスタンスを作り、そのメソッド()を一行1行、操作する古いやり方に書き換えようとしました。しかしSoundPoolクラスの[コンストラクタ](https://developer.android.com/reference/android/media/SoundPool#public-constructors_1)が非推奨になっていたので、本書のとおりSoundPool.Builder()でインスタンスを作ることにしました。調べて行く過程でrun関数を使わずに、ピリオドでメソッドを連結できることが分かったので紹介します。以下、本書を持っている前提で説明します。本書を使って勉強中の方、一
Android端末におけるMSALを使用したSSO認証
急に「これやりたいから調べてくれない?」と言われた自分用メモ
## 結論
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/quickstart-v2-android
https://github.com/Azure-Samples/ms-identity-android-java
公式のクイックスタートとサンプルリポジトリのREADMEとソースを読むと良い。~~ドキュメントたくさんあるし自分がこれを書く必要なくない?~~## アプリの初起動
`PublicClientApplication.createSingleAccountPublicClientApplication()`を叩いて`ISingleAccountPublicClientApplication`インスタンスを取得する。
このインスタンスを使用して、サインインやサインアウト、アカウントの状態確認等ができる。`auth_config_single_account.json`はMSALで使用する構成ファイル
Azureにアプリ登録した
Android UIテストでActivityとFragmentにコンストラクタインジェクションする
DIの仕組みが導入されていないAndroidプロダクトでのUIテストは、Activity・Fragmentからアクセスされる外部依存の差し替えをどうするかが課題になる場合があります。
テスト実行時にはアクセスしたくない依存がある場合(例:API通信)、これに当てはまります。ここではコンスタラクタとデフォルト引数を駆使しながら、テストコード上で依存を差し替えできるようにする方法について紹介します。
## ActivityとFragmentのコンストラクタインジェクション
ActivityとFragmentは基本的にカスタムのコンストラクタを作成しません。
システムによって引数を持たない空のコンストラクタからインスタンスが生成されるためです。一方、カスタムコンストラクタの引数にすべてデフォルト値をセットした場合は、引数なしのコンストラクタを追加で生成します。そのコンストラクタからインスタンスを生成したときは、プロパティはデフォルト値で設定されています。
これを利用して、プロダクトコードではデフォルト引数の値を参照し、テストではコンストラクタから実装を差し替えるようにすること
Kotlin SAM変換(ラムダ式)を元に戻す
金田著「[はじめてのandroidプログラミング 第5版](https://www.sbcr.jp/product/4815607968/)」を使って、勉強しています。
「第8章タイマーを使ってスライドショーを実装する」で使っているkotlinの文法のテクニックを解析してみます。
今日のテーマは、「SAM変換を元に戻す」です。初心者にとって、ラムダ式は難しいですよね。javaのインターフェースでメソッドをひとつしか持たないものをSAMインターフェースと呼び、KolinではSAMインターフェースを引数としたメソッドを、ラムダ式で置き換えることができます。これをSAM変換といいます(本書p121から引用)。
そこで、SAM変換しているコード、変換を使わない元のコードに戻してみようと思います。
以下、本書を持っている前提で説明します。本書を使って勉強中の方、一緒に勉強しましょう。##0.前提
p227まで写経が済んでいるとします。##1.原型
p227まで写経が済んでいる状態のコードを示します。説明に不要な部分は、著作権に配慮して省略しています。“`Main
【Android】APIのレベルによるエラーの対処方法
#プログラミング勉強日記
2021年1月19日
最近Android開発をしていて、普段と違うAndroid端末を利用したときにエラーが出た。その解決方法を示す。#エラー内容
Android端末のAPIよりもプロジェクトのAPIの方が新しく、このエラーが出た。なので、プロジェクトのAPIをAndroid端末のAPIに合わせることで解決する。“`
Session ‘app’: Installation did not succeed.
The application could not be installed: INSTALL_FAILED_OLDER_SDK
“`#解決方法
##1. 必要なSDKをインストールする
`ツール→SDKマネージャー→Android SDK`から選択して端末と同じSDKをインストールする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/58bc76f9-ac54-3978-1677-97ffa8171e8b.png)
Android QのScoped StorageでJPEG/MPEG撮影→外部Storageに保存→EXIF編集
# TL;DR
Android QからScoped StorageのFeatureによってCameraで撮影したJPEG/MPEGを外部ストレージ直下の任意Directoryに保存することができなくなりました.
`DCIM`や`Picture`/`Video`のような汎用Directoryに保存することになりますが,それでもAndroid PまでのようにExternal StorageのPathに直接ファイルを保存することはできません.
そのため,`MediaStore` (`ContentProvider`/`ContentResolver`)を使ってExternal Storageの汎用Directoryにファイルを保存するようにします.
撮影したJPEGのEXIFを`ExifInterface`で自力で編集している場合も直接External StorageのPathからは読み書きできないので,`MediaStore`経由で読み書きするようにします.
# Permissionについて
Android PまではExternal Storageへの保存のために,↓ の宣
HiltViewModelでAbstractなViewModelをInjectしてみるチャレンジ
ちょっとHiltViewModelで何ができて何ができないのかわからないので調べてみましょう。
HiltViewModelは基本的にはこういう感じで利用できます。
“`kotlin
val viewModelHilt: VideoPlayerHiltViewModel by viewModels()
“`“`kotlin
@HiltViewModel
class VideoPlayerHiltViewModel @Inject constructor(val videoPlayer: VideoPlayer) : ViewModel() {
}
“`https://github.com/takahirom/hilt-sample-app のComponent図です。(arunkumar9t2/scabbardによる生成 )どうやらActivityRetainedComponentの下にViewModelのComponentがいるようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazo
Dagger 2.31のAssisted Inject
例えば、動画を再生しているアプリで、このVideoのIDの動画を再生したい!みたいなときにViewModelにidを渡したくなったりしますよね?そしてそのViewModelに**Repositoryとかのインスタンスをinjectしつつ、videoIdを渡してvideoIdがNullableであるとかlateinitであるとかを意識せずに簡単に使えるようにしたい**ですよね。これができるのがAssited Injectです。
これを使うとコンストラクタに自分で指定した引数を追加することができるのでNullableやlateinitにせずに引数を追加できます。
この用途に、これまでsquare/AssistedInjectを使っていましたが、Dagger 2.31でこの機能が追加されました。# コード
基本的にinterfaceでFactoryを作ってそれに`@AssistedFactory`をつけて、そこに渡したい引数を追加したメソッドを追加し、作りたいクラスのコンストラクタに`@AssistedInject`をつけて、カスタマイズしたい引数に`@Assisted`をつけるだけで
ハッカソンでOSMを使いたかったので、別の投稿を参考にOSMDroidとMapQuestを使ってみた話
ハッカソンで、OSMつかって経路出したいねーなんてメンバーと話をしていて、その為にちょっとやってみたのでメモついでにまとめておく。
#参考にした記事
– [Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d)
– [HowToInclude](https://github.com/MKergall/osmbonuspack/wiki/HowToInclude)参考にした [Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d) はJavaだったので、Kotlinで書きながら実装してみた。
実際の実装は参照元を参考してもらうとして、実際にこの記事でつまづいたことなどを補足していきます。
参考にした記事を投稿してくれた方には感謝!#[Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d)の補足
AAC の ViewModel で View のライフサイクルとリンクさせる時は OnLifecycleEvent でフックするといいよね、と言う話
タイトルがここで言いたい事の全てです:innocent:
Android における ViewModel 側で onCreate 等のライフサイクルが走った時に何かしたい、みたいなシーンは結構あると思います。
(例えばユーザ情報を fetch する、とか)そういった時どうやって ViewModel 側にイベントを通知するかと言うと
“`SampleActivity.kt
class SampleActivity: AppCompatActivity() {
private val viewModel: SampleViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
viewModel.onViewCreated()
}
}
“`“`SampleViewModel.kt
class SampleViewModel: ViewModel() {
AndroidTV9にadbでapkインストールし開くメモ
#はじめに
某中国電機メーカーのスティックAndroidTV買った。
自分はお初AndroidTVでは無いが、最近のAndroidTVに野良apkをadbで入れても自動的にAndroidTV HOME Launcherに登録はされないことを思い出した。
検索しても日本語の記事が無かったようなので、今更ではあるがそれの開き方のメモである。#adbでアプリインストール
分からない場合はここを参照。
https://developer.android.com/studio/command-line/adb?hl=ja※AndroidTVは基本的にUSBでadb接続できない機種が多い。そのためTCP/IPで接続を行う。
**インストールしてもadbからの指示で起動はできるが、Launcher自体に登録されない。**
#開き方
今回はその某中国電機メーカーのスティックAndroidTVでやっていく。
サンプルとして今回はCPU-Zを開いてみる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c
ピンあてゲーム「Hit and Blow」をFlutterでリリースした話【個人開発】
## 概要
* アプリの説明
* 作ろうと思ったきっかけ
* Hit and Blowってどんなゲーム?
* Flutterでどう実現するか
* リリース準備について!
* 現状・今後実現していきたいこと、意気込み
* 最後にはじめまして[tomo](https://twitter.com/tomoDev_)と申します。
インターン生として大阪のスタートアップでエンジニアをしながら個人開発をしている大学生です。
Qiita初投稿になります!
自分と同じようにアプリを作る方またこれからアプリを作りたいと思っている方に向けて何かのヒントになれば嬉しいです!## リリースしたアプリについて
[Hit and Blow(ヒット&ブロー)](https://play.google.com/store/apps/details?id=com.tomoyaNakano.HitandBlow)
というピンの色を推測するゲームです。シングルプレーヤーゲームでアプリ自体は3ヶ月ほど前にリリースしました。
Nintendo Switchの世界のアソビ大全51というゲームに搭載されてい
【Android】AndroidセンサーAPIの種類
#プログラミング勉強日記
2021年1月18日
Android端末には様々なセンサーが搭載されている。具体的には温度や方位、方角、明るさ、傾き、加速度センサーなどがある。そういったセンサーを使うために必要なセンサーAPIについてまとめる。#AndroidのセンサーAPI
Androidでは、センサーによって変換された電気信号を取得するためのセンサーAPIが提供されている。このAPIによってセンサーを用いたアプリを簡単に開発できる。
android.hardwareパッケージには、SensorManager、Sensor、SensorEvent、SensorEventListenerの4つのセンサーAPIが提供されている。##SensorManager
センサーにアクセスするためのクラス。各センサーのイベントリスナーの登録や解除、センサーの情報の取得を行う。“`java:SensorManagerクラスのメソッド
// イベントリスナーを登録するメソッド
registerListener(SensorEventListener listener, Sen
Flutter で仕事したい人のための Widget ツリー入門
ご存知の通り、 Flutter は Widget を入れ子の構造で記述することで UI を構築します。
“`dart
Center(
child: Column(
children: const[
Text(‘Hello, Flutter!’),
SizedBox(height: 16),
Text(‘This is my first app.’),
],
),
),
“`Flutter の Widget 同士の関係は、このようなソースコードの形状から「入れ子」の構造をイメージしがちですが、 Flutter の仕組みを理解する上では、このソースコードから Widget の __ツリー構造__ がイメージできるようになっておくと何かと役に立ちます。
この記事では、Flutter の仕組みを説明する上でよく使われる __「Widget ツリー」__ について、初学者向けに基本から解説していきたいと思います。
# なぜ Widget ツリーを理解するのか
例えば「中央寄せしたければ `Center`
【Android】Code Reformatに関するメモ
# XML
– タグの一番初めの行を改行していてもReformatされないようにする:
Code Style→XML→Other→Keep line breaksにチェックを付ける– スラッシュの手前にスペースを入れない:
Code Style→XML→Other→In empty tagのチェックを外す![スクリーンショット 2021-01-18 15.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/3dc51e78-cdae-4fe6-b8c1-fcc19397bf82.png)
# Kotlin
– コメントの前の行を勝手に改行させない:
Code Style→Kotlin→Blank Lines→Before declaration with comment or annoationを0にする![スクリーンショット 2021-01-18 15.41.49.png](https://qiita-image-store.s3.ap