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

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

[Android]脳死で使っていたcontextを少し掘り下げる

# Contextってよく使うけども…
今まで、ダイアログ等の引数にcontextを要求されると、条件反射でcontextを打ち込んでいましたが、少しだけ掘り下げてみようかなと思います。

前提としてcontextは、奥が深いみたいなので完全な理解は難しそうなので、ここでは、Activityで用いるContextとApplicationContextの違いについて触れてみたいと思います。

# ApplicationContextとActivityContextの違い
ApplicationContextは、文字通りでアプリ間のライフサイクルと関係していてアプリを起動してから、ずっと生き残って欲しいときに使います。
その為、アプリ間で共有されるローカルデータベースのアクセス等で使われますね。

そして、ActivityContextは流れで分かるかもしれませんが、Activityのライフサイクルと関係しています。その為、ActivityがonDestroy()されると、死にます。
Intentの時に使いますね。

ちなみに、thisもよく使われますが、thisはクラス自体を指します。

元記事を表示

androidでapkファイルをインストールできない

androidでアプリをアンインストールし、そのアプリのapkファイルをダウンロードしてインストールすると、「アプリはインストールされていません」エラーが出てインストールできませんでした。なお、アプリはplayストアにないものです。

* 機種:huawei nova lite
* Androidバージョン:8.0.0

ネットで調べると、次のような方法が出ましたが、どれを試してもダメ。

* 「不明なアプリをインストールする」設定をONにする
* PlayストアでPlayプロテクトをoffにする
* [設定]→[アプリ]で、アンインストールしたアプリが残っていないか?残っていたら消す

「端末管理」でクリーンアップを行い、更に同画面にある「ディープクリーンアップ」で「インストールパッケージのクリーンアップ」をした後apkをインストールすると正常に行えました。

元記事を表示

AlertDialogのmessageのViewを取得したい

## はじめに

AndroidのAlertDialogを使っていると、messageのViewを取得したいことがあります。
検索すると、AlertDialogをそのまま使っているパターンで、messageのTextViewを取得する方法が出てきます。
こんな感じで↓

“`kotlin:
val builder = AlertDialog.Builder(context).apply {
setMessage(message)
}
val dialog = builder.show()
val messageView = dialog.findViewById(android.R.id.message)
“`

しかし、[ダイアログ](https://developer.android.com/guide/topics/ui/dialogs?hl=ja)によるとAlertDialogはDialogFragmentで包んであげることが推奨されており、AlertDialogをそのままshow()する場面はあまり多くないと思います(少なくとも私の所属するプロ

元記事を表示

【Kotlin】Firestoreで複数のタスクが成功したときにリスナーを呼ぶ

#FirestoreやFirestrageで同時に複数の処理を行う
【taskA】 FirestoreからドキュメントAを取得する
【taskB】 FirestoreからドキュメントBを取得する
といった2つのタスクを同時に行うとします。
このタスクAとBの両方が成功したときに、printlnします。

##タスクの取得
データを取得するときにタスクが返されます。

“`Kotlin
val taskA = db.collection(“user”).document(“A”).get()
val taskB = db.collection(“user”).document(“B”).get()
“`

##両方のタスクが成功した時に呼ばれるリスナー

“`Kotlin
Tasks.whenAllSuccess(taskA, taskB)
.addOnSuccessListener{
println(“両方のタスクが成功しました”)
}
“`

これで両方のタスクが成功するとプリントされます。

.addOnFailureListene

元記事を表示

【Android】ViewModel内でUiModelを使おう(その2)[UiModel編]

# はじめに
[前回](https://qiita.com/saitoyusuke/items/baef4f93f4a052b9639b)でsealed classを使ってViewModelをすっきり書けるようになりました。今回はさらにすっきり書けるようにUiModelについて説明します。

# 対象
– [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja)を利用している方
– MediatorLiveDataを利用している方
– kotlinが読める方

ViewModel、MediatorLiveDataについてはドキュメントがネット上に多くありますので、ここでは説明しません。

# LiveDataが複数必要になった
[前回](https://qiita.com/saitoyusuke/items/baef4f93f4a052b9639b)はうまくsealed classを使って1つのLiveDataに複数の意味を持たせて、まとめることができました。しかしこれ

元記事を表示

【Android】SDKバージョンごとのUNITテストを書く

#はじめに
Androidを開発しているとSDKバージョン(OSバージョン)によって処理を分岐させる必要が出てきます。
そういった処理はネット上に多く見つけることができます。
その場合のテストもしっかり考えるべきと思います。
今回はSDKバージョン別のUNITテストを紹介していきます。
#OSごとに分岐が必要な処理例
早速、SDKバージョンごとに分岐させるような実装を考えてみます。
テストを書くことが目的なので、インスタンス化するパターンと静的(companionObject、static)なパターン2つを用意します(処理は同じにします)
今回は実際に判定が処理の例としてネットワーク判定処理を実装します。trueでWIFI
に接続されている判定になる処理です。
判定を返す処理をしますが、その際、AndroidM(SDKバージョン23以上)と未満で使用するAPIを変えます。

詳しくは公式サイトを見てください。

https://developer.android.com/reference/android/net/ConnectivityManager

“`kotlin:Conne

元記事を表示

Androidでtcpdumpを取得する

パケットログを取得する必要があったので、パケットログを取得するためのメモ。
パケットログを取得させるには、emulatorでtcpdumpすると取得することができます。

“`bash
$ emulator -tcpdump <出力先ファイルパス> -avd
“`

emulator名は下記のコマンドで確認することができます。

“`bash
$ emulator -list-avds
“`

元記事を表示

React NativeでNavigationを使っていい感じに画面遷移する

## やりたいこと
– React NativeでReact Navigationというライブラリを使って画面遷移をしたい
– 画面が多くなっても管理しやすい形でまとめたい

## 前提条件
– React Nativeの環境構築が終わっている
– 何かしらプロジェクトが作成されている(initされていればOK)

## ライブラリのインストール
[公式ドキュメント](https://reactnavigation.org/docs/getting-started)にしたがって必要なライブラリをインストールします

“`
yarn add @react-navigation/native
yarn add @react-navigation/stack
“`
@react-navigation/stackと依存関係にあるライブラリもインストールします。

“`
yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-cont

元記事を表示

android:id以外に@+idが使われている問題を正規表現で解決する

# 内容
Androidでidを定義する場所ではないのに@+idを用いている場所を正規表現でぱっと置換えちゃおうって内容です。

# 使う場面
Androidでxmlを用いてレイアウトを作成している時、idを定義したい場所以外でidを使う場面がよくあると思います(ConstraintLayoutで位置を指定したい時など)。
そこで@+idを指定してしまうと思わぬエラーに遭遇する可能性がある [詳しくはこちらを参照](https://qiita.com/kamedon39/items/71986649f1a884e912cb)

一度書いてしまったコードを手作業で直すのはめんどくさいので正規表現で直しましょう。

# 使う正規表現
“`
^(?=(.*)@\+id(.*))(?!.*android:id).*$
“`
これで@+idを含む かつ android:idではないものを抜き出せます。
そして、

“`
$1@id$2
“`
で置換を行えば目的が達成できます!

# 例
たとえばこんな感じです。
![スクリーンショット 2021-03-30 12.27.15.png](h

元記事を表示

Flutterを知らない人がFlutterでアプリを公開するまでにどのような情報が必要でどのようなエラーを解消したか

## 記事の趣旨

普段iOSで開発をしておりAndroidはほぼ経験がない者が、Flutterでアプリを作り公開するまで、どのようなことを調べなければいけなかったかを記載します。

## アプリ

うつとか診断

iOS https://apps.apple.com/jp/app/うつとか診断/id1559362485
Android (2021/3/30現在 審査待ち 審査に提出したのは24日)

リポジトリ GitHub https://github.com/Satoru-PriChan/Depression_Diagnosis
CI/CD CodeMagic https://blog.codemagic.io/getting-started-japanese/

必要時間 測ってませんが50~150時間の間?(1日平均30分~1時間半ほど作業して3ヶ月強かかったため)

全体的な参考 [flutter create してから5日で iPhone / Androidアプリを公開した話](https://qiita.com/chooyan_eng/items/4ab2af269e1

元記事を表示

KMMに対応したRealmを使ってみた!

# はじめに

主は今回Kotlin, SwiftUIを初めて触ったので間違ってたら申し訳ないです。現時点では動くのでヨシッ!

あと今はまだx86_64アーティファクトのみの対応なので、エミュで試す場合は注意←ハマった。

AndroidStudioにKMMのプラグインとかもろもろ入ってる前提で話します。

Githubに上げてるのでよかったらどうぞ!
https://github.com/hirossan4049/KMMRealmSample

# #1 NewProject

![](https://i.imgur.com/6XweeNS.png)

KMM Applicationを選ぶ

![](https://i.imgur.com/hoR8SKe.png)

Android Application NameとiOS Application Nameは好きな名前でも大丈夫ですが、この記事は`androidApp` `iosApp` として進めます。

# #2 Gradleの設定

“`kotlin:/build.gradle.kts
buildscript {

元記事を表示

いつもぶつかって何となく調べて解決してきたAndroid周りの対応

# 前置き
– いつも同じようなエラーが発生する……
– 多分Unityのversion upしたタイミングな気がしている……
– でもその度調べて解決してるが、結局いつも原因忘れてしまっている……

# 環境
– Unity2019.4.18f1
– GoogleMobileAds-v5.4.0
– Android Studio 4.1.3

# 結論
– JDKのバージョンをテキトーなやつ指定してるとUnityでエラーになる場合がある

# 事象
– GoogleMobileAdsを更新したので、Android Force Resolveを再度実施しようとした
– そうしたら以下のようにエラーが発生……

“`sh
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
at org.codehaus.groovy.vmplugin.VMPluginFactory.(VMPluginFactory.java:43)
at

元記事を表示

【Kotlin 初学者】setの使い方

# setについて
KotlinではSetter,Getterを省略してくれますすが、今回はカスタムして書いてみます。

“`
var text: String = “”
set(value) {
field = value
if(field == “name”){
binding.text = “”
} else {
“”
}
}

fun test(){
type = “name”
// typeの中に文字列が入ってるのでsetが実行される
}
“`

元記事を表示

【Android】Android Sleep APIことはじめ

# Sleep API
以下抄訳↓

– Sleep APIを活用すると、アプリでユーザーがいつ寝て、いつ起きているかを判断することができます。
– 周囲の明るさ、デバイスの動きなどに関連する情報を収集して、ユーザーが眠りに落ちて目を覚ます時間を推測します。
– 情報の更新を購読することができます。

https://developers.google.com/location-context/sleep

様々な機能に組み合わせることで効力を発揮しそうなAPIですね。

# 実際に試してみる

## 下準備

#### 1. target sdkを29以上に設定する

※29以下だと取得ができないので、minsSDKは29に設定してます

“`gradle:build.gradle
android {
compileSdkVersion 30
buildToolsVersion “30.0.3”

defaultConfig {
applicationId “xxx”
minSdkVersion 29
targ

元記事を表示

いい感じのランダムの色が欲しいなぁって時にこれ。

例えば10個のいい感じのランダムの色が欲しいって時。
ガチのランダムにすると意味わからない変な色が出来上がったりしてしまうので。
っていうものをメモ程度に残しておきます。
意外と使える!

hueの部分の分母を欲しい個数にするだけです。
saturationとbrightnessに関しては自分の好みの色味にしてください。

下記コードそのまま使用した際にはこんな感じの色が出力されます。
~~似てる色があるとか言わないで~~
`#CC8B29`
`#ABCC29`
`#49CC29`
`#29CC6A`
`#29CCCC`
`#296ACC`
`#4929CC`
`#AB29CC`
`#CC298B`
`#CC2929`

“`swift.swift
let colorList =
[
UIColor(hue: 0/10, saturation: 0.8, brightness: 0.8, alpha: 1),
UIColor(hue: 1/10, saturation: 0.8, brightness: 0.8, alpha: 1),
UIColor(

元記事を表示

【Android】Test dynamic delivery offline のやり方

# はじめに
Android AppではDynamic Feature Modules(DFM)を用いて、リリース後に必要な機能を追加でインストールすることができます。これにより開発者がアプリのサイズを小さくできたり、ユーザも使わない機能はそもそもインストールしないことでストレージの節約にもなるという便利なものです。
今回はこちらのDFMのインストール状況をユーザへと通知するテストを、内部テストを使用することなく完全オフラインで実施できるようにしていきます。

# FakeSplitInstallManagerの実装

https://developer.android.com/reference/com/google/android/play/core/splitinstall/testing/FakeSplitInstallManager

こちらを使っていきます。
通常のDFMのリクエストやインストールをするにはSplitInstallManagerを使いますが、そのFakeバージョンになります。
まずはSplitInstallManagerやSplitInstallManage

元記事を表示

【Android】ConstraintLayout Attribute まとめ

# はじめに
この記事は[公式リファレンス](https://developer.android.com/reference/androidx/constraintlayout/widget/ConstraintLayout?hl=ja)の内容をまとめたものになります。
ConstraintLayoutのAttributeってどんなのあるの? という方向けのまとめです。
自分の備忘録も兼任していたり…

# [Relative positioning](https://developer.android.com/reference/androidx/constraintlayout/widget/ConstraintLayout#RelativePositioning)
Viewを別Viewに対して相対的に設置する。

|

元記事を表示

Androidで”storage/emulated/0/”直下にアクセスしてファイルを保存

#はじめに
androidでファイルを保存したいとき、ユーザーがアクセス可能なルートディレクトリ(”storage/emulated/0/”)に保存すると何かと便利。
そこでファイルアクセス方法を調べてみた。

#現在は非推奨
以前(Android10以前)ではEnvironment.getExternalStorageDirectory()を使用して外部パブリックストレージへのパスを取得できた。
しかし現在では非推奨となり使用できない。

【Android】getExternalStorageDirectory()について①

【Android】getExternalStorageDirectory()について②


http://blog.lciel.jp/blog/2014/02/08/android-about-storage/

#推奨方法
1. Context#getExternalFilesDir(String)
1. MediaStore
1. Intent#ACTION_OPEN_DOCUMENT.

元記事を表示

ConstraintLayoutを使ったフラットなレイアウトでもタッチイベントをInterceptしたい

AndroidではConstraintLayoutが登場してから、より一層Viewのネストが少なく、フラットな階層のレイアウトを作れるようになりました。しかし、イベントのハンドリングなど、Viewにネストがあれば簡単だったことが難しくなっている部分も存在します。

例えば、以下のように上下にスクロールするシートと、横スクロールするカルーセルがあるとします。

横スクロールのカルーセルは横方向の操作しか消費しません。一方シートは縦方向の操作だけが必要です。
こういった場合で、特にシートの大きさが十分でない等の場合、カルーセル部分を触った場合でも、操作が上下方向だった場合、動かないカルーセルではなく、シートの操作に反映した方がユーザビリティが高い場合があります。

# 親子関係がある場合

このような要求がある場合、シート

元記事を表示

2年かけて個人で全く新しいSNSアプリを作ったお話し

こんにちは。歴10年のアプリエンジニア(Best of AppStore?受賞歴あり)です。

**neeboor?**という位置情報を使った新しいSNSアプリを作りました。
toC向け&コンテンツ系&モバイルアプリというサービスの特性上、**最初からある程度高い完成度のサービスを提供しないとユーザーの手に取ってもらえないな**と思い、UI/UX中心にかなりこだわって開発した結果、**開発に2年以上**かかってしまいました。

今回はサービスの紹介をしつつ、開発で苦労した点や工数をかけた点について記事にしたいと思います。

# サービスの紹介
neeboor?は、「**あなたの生活圏をもっとおもしろくするSNS** (Make your living area hackable)」というコンセプトの位置情報系SNSアプリです。従来のローカル系サービス(=地域情報サイト、半径◯メートルでお店や友達探す系、出会い系、ナビ系、トラッキング系など)とは異なり、**場所を演出要素としてオープンでカジュアルなコミュニティを作れる**ところがユニークな点になっています。

### 機能 / こんな使

元記事を表示

OTHERカテゴリの最新記事