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

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

[Kotlin]Android11での「他のアプリより上に重ねて表示」の権限許可対応

#「他のアプリより上に重ねて表示」の権限
Android11より前では「他のアプリより上に重ねて表示」の権限を許可するために「Settings.ACTION_MANAGE_OVERLAY_PERMISSION」のインテントアクションで、直接、そのアプリの「他のアプリより上に重ねて表示」の権限を許可する設定画面が開けていましたが、Android11からは、「他のアプリより上に重ねて表示」できるアプリ一覧画面にしか飛べなくなりました。つまり…、ユーザには、その画面からわざわざ該当アプリを探してもらって、「他のアプリより上に重ねて表示」の権限を許可する設定画面に遷移してもらわないといけなくなったんです。

####`えっ、ちょっと待って、それじゃ、ユーザにリストからアプリを探して選択させて、許可をしてもらって、さらに2画面分前に戻らないと、元のアプリまで戻れないじゃん!Googleさん勘弁してくださいよぉ。`

って感じで、今まで1画面で完結してたんで、大したことはなかったのですが、これはちょっとユーザ負担が大きくなりますね…

#調査
ただ、「ユーザにリストからアプリを探して選択させて」

元記事を表示

Jetpack Compose IntrinsicSize

AndroidのJetpack ComposeでIntrinsicSizeを用いてComposeを作成した時の知見です。
この記事は以下のバージョンに対応しています。

– Jetpack Compose: 1.0.4
– AndroidStudio: ArcticFox 2020.3.1 Patch 3

#IntrinsicSize
– 子要素Aは親の高さと同じ
– 子要素Bの高さによって親の高さが決まる

この条件を満たすComposeを作成する場合に、IntrinsicSizeを用いると実装できます。
例えば
![スクリーンショット 2021-10-29 9.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/78321471-53e8-d6e9-98cd-0cc1f9569bcf.png)
このようなComposeを作成する場合、左の縦線(子要素A)は親の高さと同じで、テキスト(子要素B)の高さによって親の高さが決まります。

この場合、親のmodifierにModifie

元記事を表示

THETAプラグインで手持ち/固定を判定する

## はじめに
リコーの @KA-2 です。

弊社では[RICOH THETA](https://theta360.com/ja/)という全周囲360度撮れるカメラを出しています。
RICOH THETA VRICOH THETA Z1は、OSにAndroidを採用しています。Androidアプリを作る感覚でTHETAをカスタマイズすることもでき、そのカスタマイズ機能を「プラグイン」と呼んでいます(詳細は本記事の末尾を参照)。

今回は、THETAが手持ちされているか固定されているか、簡単に判断する方法を紹介します。
Android標準のライブラリをうまく使うことでも、かなり高精度な判定ができるのです。
(ある意味、厳密に判定しすぎかも?)

元記事を表示

Android12のFCM対応問題

# 背景

Flutter1.xでアプリを開発しました。

運営でAndroid12を対応しないといけないため、色々苦労しました。

Firebase Clound Messaging(FCM)の対応は一番しんどいでした。

Android12ではServiceに対して、exportしないといけない

# export対応

[こちらのGoogle先生のドキュメント](https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja)によると

FCMのServiceはFirebaseMessagingServiceなので、`export=false`かと思います。

そして、この後はビルド成功し、特に問題なかった。

リリース審査出す直前、まさかの通知不通のテスト結果出て、exportの影響だなぁと思いきや、他の問題でした。

# 問題

前提:
FCMの20.0.0を使用しています。

現象:
Android12のセキュリティ対応によって、こんなエラー出ていました。
“`
Targeting S+

元記事を表示

Jetpack Composeのスクリーンショットを撮影する最小構成

## 概要

* Jetpack Composeのコンポーザブル関数のスクリーンショットを撮るという記事です
* とても簡単です :thumbsup:

# プロジェクトを作る

Android Studio で新規プロジェクトを作ります。テンプレートは **Empty Compose Activity** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/330a33d4-7ff5-2fb2-2a83-d6881629cf50.png)

次に必要なライブラリを追加します。`androidx.compose.ui:ui-test-manifest`だけデフォルトで入っていないはずなので追記します。

“`gradle
dependencies {
testImplementation ‘junit:junit:4.13.2’
androidTestImplementation ‘androidx.test.ext:junit:1.1.3’

元記事を表示

Androidで表示されているキーボードを閉じる方法

# 概要

Androidで表示されているキーボードを閉じる方法を記載する。
言語はKotlin

# Androidで表示されているキーボードを閉じる方法

InputMethodManagerのhideSoftInputFromWindowを使用する。
以下のコードを任意のイベントで実行されるようにすることでキーボードを閉じることができる。

“`kotlin
val inputMethodManager: InputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(this.windowToken, InputMethodManager.RESULT_UNCHANGED_SHOW)
“`

元記事を表示

Windows Subsystem for Android(WSA)でMagiskをインストールする

https://twitter.com/topjohnwu/status/1451282578514735131?s=20

事の発端はこのツイートでした
とりあえず初日からWSA(以下略称)を楽しみたいと思い、いろいろやりくりしていました(主にGMSの部分)
なくても.apkが動くので文句はないのですが、まぁストアがないのはかなりつらいと
かといってTWRPが動くわけもなく、Fastbootにはいれないのは実験していたのでMagisk GApps(https://mg.pixel-fy.com) をインストールできないかと考えていると、topjohnwu(現GoogleのエンジニアかつMagisk生みの親)がこのようなツイートしていました

やるしかない
思ったはいいものの、なかなか情報がなく、たまたまTelegramをのぞくとなんと???????のチャンネルに書いてあるではありませんか

>Brief steps (note this is just a tmp solution)
1. Enable dev mode in win, extract WSA package, di

元記事を表示

AndroidからiPhoneに移行するにあたって

携帯電話をAndroidからiPhoneに移行することになりました。

主たる要因は、自動車のApple CarPlayを利用するため。

https://www.apple.com/jp/ios/carplay/

いろいろわからないでつまづいたことを記録する。

目標はApple CarPlayをいかに安価に実現するか。

電話は楽天。

楽天のAndroidを利用していたのは、いろいろな事情による。

専門が無線通信などでの往路と復路の遅延差測定で、
いろいろな通信会社の、
いろいろな機器の、
いろいろなアプリ(主にブラウザ)の、
性能、便利さなどを評価するために、
関係者で分担していろいろな契約をしたり、
買い換えたり、古い機器はWi-Fiだけの試験に使ったりしてきた。

# 会員登録

契約者の事情で、今回契約者を変更した。

手続きとしては、新しい契約をして、導通試験が済んだら、古い方を解約する。

楽天会員の登録から始まる。クレジットカード、楽天Mobileの契約の順に進むといいらしい。

途中、紹介クーポンの画面で、PCではできませんと出た。
Androidでやろうと

元記事を表示

【Android】明日から使いたい DroidKaigi 2021 の実装

#DroidKaigi 2021
先日 [DroidKaigi 2021](https://droidkaigi.jp/2021/) が行われました。

3日間開催でTimetable(タイムテーブル)は以下です。
・[DroidKaigi 2021 タイムテーブル] (https://droidkaigi.jp/2021/timetable/)

DroidKaigi では多くの発表がありました。
その発表の中から **明日から使える実装** を2つ紹介します。
ViewModel と Lifecycle の技術にピックアップして選出しました。

#lifecycleScope.launchWhen**** で表示データを更新
アプリがバックグラウンドの状態でデータを更新させたくない時に使えるのが以下です。
・lifecycleScope.launchWhenStart
・lifecycleScope.launchWhenResume
を利用することで非同期処理の結果を更新させることで、画面回転やメモリリークに強いアプリを目指せます!
ライフサイクルに準拠したアプリ開発が大切です。

元記事を表示

Android 12 Advertising ID

## 2021/10 時点
2021/10 に Android 12 が正式リリースされましたが、こちら Adverting ID に関する変更はありません。
Google の説明によると下記のような変更は 2022 の早期にやります。というアナウンスのみです
不気味なのは、これをサーバー側のスイッチもしくはパッチか何かで当てられると、自動的に適用され、ある日突然取れなくなるということです。
ですので、2021のうちに準備しておくのがよいかと思います。

### 現在の仕様
* isLimitAdTrackingEnabled が true でも ADID はとれる (なんというざる)
* ユーザーのデバイスOS、アプリケーションのコンパイルSDKのバージョンに関わらず取得可能

試しにやってみた結果 (当方が開発しているSDKとアプリの関係も入っています)

| デバイス | SDKコンパイル/ツールバージョン | アプリのコンパイル/ツールバージョン | パーミッション | トラッキング設定 | ADID |
| —- | —- | —-

元記事を表示

【Flutter, Android】内部テストのアプリでFirebaseのAuthenticationのログインが失敗する

## 何が起こったか
FirebaseのAuthenticationを使用し、GoogleログインをFlutterアプリ内で実行しようとしたら下記のエラーが発生しました。

“`
PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
“`

しかも、debugモードやreleaseモードで実行したアプリでは発生せず、内部テストにアップロードしたアプリでのみ再現しました。

## 試したこと
debugモードやreleaseモードではログインできるのに、なんで内部テストにアップロードした途端に失敗するんだよと思いつつ、上記のエラー内容を調べるとSHA1のフィンガープリントがfirebaseのコンソールに登録していないのが原因とわかります。
しかし、いくらFirebaseのコンソールを確認してもSHA-1のフィンガープリントは登録されていました。
それもそのはず、debugモードやreleaseモードではログインできるのだから。

## 原因

元記事を表示

Android applicationIdの変更方法について

Android applicationIdの変更方法するには以下の箇所のファイルをいじります。

– android/app/build.gradle
– ![スクリーンショット 2021-10-24 0.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320838/cb5bc251-c1c1-69fc-b845-cf9a627533cf.png)
– AndroidManifest.xml

– ![スクリーンショット 2021-10-24 0.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320838/80cabfd1-0d35-0089-6cc4-e8a4cc7b15a0.png)

– MainActivity.kt
– ![スクリーンショット 2021-10-24 0.22.42.png](https://qiita-image-store.s3.ap-north

元記事を表示

iOS/Androidアプリの2要素認証対応 – TOTP認証アプリ設定編

## はじめに

Webサービスの個人認証において、[Google認証システム (Google Authenticator)](https://support.google.com/accounts/answer/1066447) のようなTOTP認証アプリによる2要素認証を利用することでセキュリティを向上させることができます。しかしながら、その設定方法やその後の運用は非常に難解で、正しく設定できずに挫折してしまったり、スマートフォンの機種変更などにより2度とログインできなくなってしまったというケースも良く耳にしますよね。

そのため、自身で開発しているiOS/AndroidアプリでTOTP認証アプリでの2要素認証に対応する場合、できるだけユーザーに優しいUIで作りたいです。この記事では、iOS/AndroidのOSの仕組みを最大限に活用してTOTP認証アプリ対応するために検討した内容を複数回にわたって共有しようと思います。まずは最も難解な、TOTP認証アプリ設定についてです。

以後、TOTP認証アプリのことを「認証アプリ」と表記します。また、この記事ではTOTP認証アプリの仕組みに

元記事を表示

アプリエンジニアが達人に学ぶDB設計〜徹底指南書〜から学んだ話

# TL;DR
– アプリケーションエンジニアもバックエンドの知識はあった方が面白いよ。
– いつどんな仕事が舞い込んでくるか分からないから守備範囲決めずに自己研鑽しようね。
– アンチパターンは実例としてわかりやすい。
– ストレージは、冗長設計しようね。
– 良書でしたので、是非いろんな方に読んで欲しい。(ステマじゃないよ)

# 簡単な自己紹介
iOS, Androidのモバイル開発を主に行なってるエンジニア3年目です。
今所属しているチームのリソースの関係でアプリに拘らずバックエンドの開発業務も舞い込んでくるのでそっちの知識も最近は積極的に取り入れています。

今回DBに関する書籍を読んだので、アプリエンジニアが知っておくメリットみたいな視点もなるべく取り入れながら、簡単な書評を中心に記事を書いていこうと思います。

## 書くこと
参考書の書評
アプリケーションエンジニアがこの本を読んで学べること
*ばちばちのインフラ屋さんはちょっと物足りない記事だと思います。

## 書かないこと
業務レベルでDBを設計・運用する上での知識技能
*本書では論理設計に関してはかなり実用的

元記事を表示

KMM kotlinx-serializationでクラッシュする時にやったこと

普段、iOSをやっていて、Androidは全く触っていないですが、KMMがずっと気になっていて某記事を参考に試しにやってみました。
慣れない中、クラッシュの連続で直すのが一番大変だったkotlinx-serializationでのエラーの直し方を残しておきます。
なかなかライブラリが参照されなかったり、クリーンしてようやく直ったと思ったら@ Serializablを使っているクラスが not foundでクラッシュしてしまいました。。

まず、shared内のbuild.gradleに下記を記述します。

“`plugins {
kotlin(“multiplatform”)
kotlin(“plugin.serialization”) version “1.4.10” //これを追加
id(“com.android.library”)
}
“`

次にandroidApp内のbuild.gradleに下記を記述します。
“`android {
compileOptions {
targetCompatibility = org.g

元記事を表示

[jetpack compose]Row/ColumnとConstraintLayoutでどの程度レイアウトの作り方が違うのか

jetpack composeでかんたんなレイアウトをそれぞれ
– Row/Column/Box (※今回Boxは使っていません)
– Constraint

で作成した場合、どのような違いが出るのか見てみました。

ConstraintLayoutのUIの作り方とかはこの記事では触れませんがコード見ていただいてもある程度理解できるかなと思います。

作ってみたのはこちら。
[search, share, home, star]
というラベルが付いたアイコンを並べる

という部分をそれぞれRow/Columを使って実現したパターンとConstraintLayoutを使って実現したパターンとなります。

“`kotlin
@Composable
fun RowColumnOrConstraintScreen() {

元記事を表示

【Android】 DataStoreを試してみる

# [DataStore](https://developer.android.com/topic/libraries/architecture/datastore?hl=ja)とは?
> プロトコル バッファを使用して Key-Value ペアや型付きオブジェクトを格納できるSharedPreferencesの進化版

DataStore には、以下2 種類がある
– **Preferences DataStore**
– キーを使用してデータの保存およびアクセスを行います。この実装では、
定義済みのスキーマは必要ありませんが、タイプセーフではありません。
– **Proto DataStore**
– カスタムデータ型のインスタンスとしてデータを保存します。この実装では、
プロトコル バッファを使用してスキーマを定義する必要がありますが、タイプセーフです。

## 試した環境
サンプル用に[こちら](https://github.com/Slowhand0309/DataStoreSample)にリポジトリ作成しています。

“`

元記事を表示

Androidのテストでだけ使うライブラリモジュールを作る

# 概要

[Kotlin, LiveData, coroutine なんかを使って初めてのAndroidアプリを作る(16)ライブラリバージョンアップ2021春(2)](https://qiita.com/kasa_le/items/3fc4814159e20f25c59a)

上記の記事にて、KotlinでAndroidアプリを作るシリーズを作っていますが、InstrumentationTest(androidTestフォルダのテスト)とRobolectric版のテストを同時に作っていて、いわゆるUtil系のクラスや関数が双方に必要でコピペしていくのが面倒になってきました。

テスト用の共通コードを共有する方法をとれば、コードのコピペは減らせるのですが、build.gradleのライブラリの記述が長くなってきて、テスト用のライブラリだけで長くなってしまい、本体のライブラリが分かりづらくなってきました。

そこで、テストに関連するコードを共通モジュール化することをやってみたので、その覚え書きです。

Android向けのライブラリモジュールを作る方法はいくらでも探せばありますが、私が

元記事を表示

【Jetpack Compose】Scaleアニメーション

ComposeをScaleさせるアニメーションの実装に苦労したので書きます。

ここで書くのは以下2パターンです

– 無限ループするScaleアニメーション
– 表示時に一回だけ実行するScaleアニメーション

今回動かすComposeはこんな丸いBoxです。

“`kotlin
@Composable
fun Circle(modifier: Modifier = Modifier) {
Box(
modifier = modifier
.size(80.dp)
.clip(CircleShape)
.background(Color.DarkGray)
)
}
“`

## 無限ループするScaleアニメーショ

元記事を表示

本当にリリースできるの?FlutterでQiitaアプリを作った話。

![poster_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678085/27dcb69c-c257-7add-27aa-0a723fe70ada.png)

## はじめに
昨年の春先からFlutterを触り始めて、状態管理シリーズの記事や「Dart vs Swift」の翻訳を出してきたが、いつかFlutterで自作アプリを出したいとの思いが強くなり、今回のQiitaアプリに至りました。

####ダウンロード先
▼iOS
https://apps.apple.com/jp/app/open-qiita/id1590830106

▼Android
https://play.google.com/store/apps/details?id=com.jamestong.open_qiita

## Open Qiitaの技術要素
– 状態管理
グローバル状態、例えば記事本文の文字サイズ変更、テーマカラーの変更は**BLoC** + **Equatable**;
特定イベントの状態あるいは通知

元記事を表示

OTHERカテゴリの最新記事