Android関連のことを調べてみた2021年01月21日

Android関連のことを調べてみた2021年01月21日

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

元記事を表示

OTHERカテゴリの最新記事