- 1. 【Android】Hiltを使用してRoomのCodelabソースコードにDI風にリファクタリングした話
- 2. 【Android】WebViewを使ってWebページを表示する方法と端末内のブラウザで開く方法
- 3. Jetpack ComposeのComposable内で端末のステータスバー(status bar)の高さを取得したい
- 4. プロジェクトで行ったVoiceOver対応
- 5. Android Studio Electric EelとRoom 2.5.0でSQLのハイライトが適用されないのを回避する
- 6. クリーンアーキテクチャのディレクトリ構成
- 7. MobileNet v3を用いた類似画像検索
- 8. 【Android】AdMobのアプリIDや広告ユニットIDをコミットしないで管理する方法
- 9. 【Flutter】TextFieldのキーボード管理で苦戦した話
- 10. 学校の制限付きのChromebookにAndroidアプリをインストールする
- 11. 複数引数のラムダ記述方
- 12. iOS/AndroidでONLYOFFICEドキュメントとNextcloudを連携する
- 13. Windows subsystem for Androidの導入
- 14. 【Android】locationフィールドにGeoPointが使えなかった時の対処法
- 15. Flutter の in_app_purchaseでGoogle Play Consoleで課金アイテムを作ったのに「The store is unavailable」
- 16. 【Android】Barrierとは【kotlin】
- 17. 【Android】Observableで監視をしながらレイアウトを変える方法
- 18. Google Play Consoleで新しいサブスクリプションの基本プラン作成時に「 予期しないエラーが発生しました。もう一度お試しください」
- 19. JetpackComposeでタップしている間だけテキストの色が変わる方法
- 20. 【UserLAnd】AndroidでUbuntu環境構築
【Android】Hiltを使用してRoomのCodelabソースコードにDI風にリファクタリングした話
# はじめに
皆さん、ごきげんよう!れぶです!
今回の記事では、公式チュートリアルCodelabの「[Android Room with a View – Kotlin](https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0)」で扱うコードを`Hilt`でDIしていきます。
上記のCodelabでは、英単語のToDoアプリを作りながら`Room`周辺の使い方を学べます。全体的にDIパターンを採用していますが、今回は**Hiltを使用してDIを自動化**します。
それでは、参りましょう!!
# この記事の対象者
* DIの概念やHiltの使い方を多少理解している方
* (かつ)上記のCodelabを参照して実装したコードをHiltを使ってリファクタリングしたい方# 開発環境
* MacBook Air
* Android Studio Electric Eel | 2022.1.1
* Kotlin
* compileSdkVersion 33
* minSdkVersion 21
【Android】WebViewを使ってWebページを表示する方法と端末内のブラウザで開く方法
# はじめに
Androidアプリの開発を行なっていて、利用規約やプライバシーポリシーのページなどをアプリ内で実装するのではなく、外部のWebページとして実装したい場合などはありませんか?
その場合に、どのようにリンクを端末内でひらけば良いのかを2種類の方法を使って紹介します。
この記事はJetpack Composeでの実装を考えている方向けの記事となっていますのでご了承ください。
# WebViewを使う方法
Jetpack Composeで`WebView`を使うには、`AndroidView`を使用します。
`factory`に`::WebView`を渡します。
レイアウトがインフレートされた`update`に指定したコールバックが呼び出されるので、`loadUrl()`を呼び出してURLを開きます。
“`kotlin
AndroidView(
factory = ::WebView,
update = { webView ->
webView.webViewClient = WebViewClient()
we
Jetpack ComposeのComposable内で端末のステータスバー(status bar)の高さを取得したい
Jetpack ComposeのComposable内で端末のステータスバー(status bar)の高さを取得したい
“`kotlin
val systemBarsPadding = WindowInsets.systemBars.asPaddingValues()
// ステータスバーの高さ
val height = systemBarsPadding.calculateTopPadding()
“`
プロジェクトで行ったVoiceOver対応
# はじめに
2021年6月に障害者差別解消法の改正により、民間事業者でも義務化され、公布から3年以内に対応が求められるようになりました。
そのため、自分の参画しているプロジェクトでもアクセシビリティの対応が増えました。
今後のためにも備忘録的に取り組んできた対応の一部を書いておこうと思った次第です。自分の参加しているプロジェクトでは[Apache Cordova](https://cordova.apache.org/)というモバイルアプリ開発向けのフレームワークをベースに開発を行っています。
技術的には3割ほどネイティブの実装で他はwebの技術を利用しています。
なので、iOS,Androidとタグにありますが、この記事ではHTML,TypeScriptでの対応方法です。また、利用した一部の例を取り上げるだけなので、根本的な技術の理解みたいなのはこの記事ではできません。。
# テキストやボタンの読ませ方の基本的な対応
基本的にはWAI−ARIAに定義されているaria-labelを利用します。
[WAI-ARIAについて](https://developer.mozi
Android Studio Electric EelとRoom 2.5.0でSQLのハイライトが適用されないのを回避する
Android Studio Electric Eel と Room 2.5.0 の組み合わせで `@Query` に書いている SQL のハイライトがなくなり、コードジャンプも使えない現象が発生します。
![ハイライトが適用されていない Query](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/bb845fed-9f27-0dbd-aa25-a4327d82c0ea.png)
この問題の回避策を書いておきます。
## 回避策
「Android Studio」 → 「Settings」 を開き、「Editor」 → 「Language Injections」 を開く
![スクリーンショット 2023-01-25 11.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/9274c9ba-8c07-6fe0-fdc5-b461619c9488.png)
+ ボタンから 「Generic
クリーンアーキテクチャのディレクトリ構成
“`
├── data
│ ├── datasource
│ │ └── 永続記憶デバイスへのアクセス。repositoryから依存される。
│ ├── repository
│ │ └── 永続記憶へのアクセス。データ取得の架け橋。
│ └── network
│ └── ネットワークへのアクセス。
├── domain
│ ├── model
│ │ └── ビジネスロジック。usecase、presenterから依存される。
│ ├── entity
│ │ └── ビジネスロジックが含まれないデータ。メソッドは含む。依存しない。
│ └── usecase
│ └── ユースケース。model、entityに依存する。
├── presentation
│ ├── presenter
│ │ └── ユーザインタフェースの制御。usecase、model、entityに依存。
│ └── ui
│ └
MobileNet v3を用いた類似画像検索
# はじめに
この記事ではMobileNet v3を用いた類似画像検索について記載します。# 問題設定
クエリ画像と分類対象画像集合が与えられたときに、画像集合を類似画像と非類似画像の2種類に分類します。# 手法
* MobileNetを用いて画像の特徴量を計算
* Tensor hubで公開されている学習済みモデルを使用。出力1024次元の特徴量。
* https://tfhub.dev/google/imagenet/mobilenet_v3_small_100_224/feature_vector/5
* 特徴量に重みをかける
* 特徴空間上のユークリッド距離で画像間の距離を計算し、距離が閾値以上の画像を類似画像と判断# 評価方法
* [SUN Database](https://vision.princeton.edu/projects/2010/SUN/)(シーン画像分類のベンチマーク)の部分データセットを使用(20クラス、各クラス100画像をランダムに選択)
* ある画像をクエリ画像として選択したときに、同じクラスの画像を類似画像、他のクラスの画
【Android】AdMobのアプリIDや広告ユニットIDをコミットしないで管理する方法
# はじめに
みなさんは、AdMobで発行されたアプリIDや広告ユニットのIDの管理ついてどのように行なっていますか?
実際に、テスト用のIDではなく、本番用のIDを発行した際にどのように管理すれば良いのか戸惑いました。そこで、今回はbuild.gradleを使ってビルドタイプごとに使用するAdMobのIDを切り分けて、コード内へのベタ書きを防ぐ方法を解説します。
ここで紹介する手順に沿って開発を行えば、AdMobで発行される広告用のIDもGitHub等へのコミットを回避して開発を行うことができるようになります。# admob.propertiesを作成する
**admob.properties**を、**app**や**gradle**などのディレクトリが並ぶルートディレクトリに作成します。
“`properties
DEBUG_ADMOB_APP_ID=”ca-app-pub-3940256099942544~3347511713″
DEBUG_ADMOB_BOTTOM_BANNER_AD_UNIT_ID=”ca-app-pub-3940256099942544/6
【Flutter】TextFieldのキーボード管理で苦戦した話
## きっかけ
参画させていただいているプロジェクトで、
「前の画面に戻ったときにキーボードが出ている状態にしたい」
とのことで、思いの外悩んだので備忘録も兼ねて。
(TextFieldも、CupertinoTextFieldも解決済み)## あまりいい記事がかけなかったので結論
インスタンスの生成タイミングの見直しをすべき:frowning2:## 悩んだ理由
### 1. 入力後すぐ初期化されてしまう
### 2. 初期値を設定時も入力後すぐ初期化されてしまう
### 3. キーボードが閉じなくなった
### 4. キーボードが開かなくなった
## 結論:何が悪いのか
### インスタンスを生成する場所が悪かった
ただこれに尽きる。
基本的なサイトでは**全て画面を描画するところで説明している**為、インスタンスの生成タイミングについては触れられていないので苦戦してしまったということ。
じゃあどうすればいいのかというと**親クラス**でインスタンスを生成すればいい。
“` dart
class _MyHomePageState extends State
学校の制限付きのChromebookにAndroidアプリをインストールする
# 準備
##### 必要なもの
– Chromebook
– Windows搭載PC
– WiFi
– インストールしたいアプリのAPKファイル##### ADB環境をインストール
ここではADB環境のインストール手順については割愛します。
Googleで「adb インストール」と調べたらいくらでも出てきます。##### ワイヤレスデバッグの有効化・ペアリング
– Chromebook
1. [設定] -> 左側の[アプリ] -> [Google Play ストア] を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483049/6e69f1a0-b7f5-28fc-3338-fa8388e2e3de.png)
1. [Android 設定を管理] を開く
1. 下の方にある [デバイス情報] を開く
1. [ビルド番号] を20回くらい連打
1. 戻って [システム] -> [開発者向けオプション] を開く
1. [ワイヤレスデバッグ] -> ONにする
![image.
複数引数のラムダ記述方
# 初めに
今回は、複数の引数を持ったラムダ式の書き方を書いていこうと思います
### 本文
基本的には複数の引数を必要としたラムダ式を書くときはその引数をまとめて`data class`にしちゃうことが多いですが、そこまでの手間をかけるのも面倒だし何よりそのためだけに`data class`を作るのは適してない時に使っていただけるかと思います。
今回は今後多く使われるであろう`compose`で紹介していこうと思います
“`kotlin
@Composable
fun Screen(
onClick: (hoge: String, huga: Long) -> Unit = { _, _ -> },
) {}
“`
呼び出す側は以下のようにすれば使えます
“`kotlin
setContent {
Screen(onClickIngredientTag = { hoge: String, huga: Long -> }
}
“`
### 最後に
今回は複数の引数を持ったラムダ式の書き方を紹介しました
地味に使う場面が多いのにあまり記事等に残って
iOS/AndroidでONLYOFFICEドキュメントとNextcloudを連携する
## ONLYOFFICEとNextcloudの連携について
ONLYOFFICEでは、ONLYOFFICE DocsとNextcloudを連携させ、クラウドストレージ内でオフィス文書を編集するための公式コネクタを提供しています。ONLYOFFICEコネクタは、Nextcloudの[アプリストア](https://apps.nextcloud.com/apps/onlyoffice)またはONLYOFFICE [GitHubページ](https://github.com/ONLYOFFICE/onlyoffice-nextcloud)よりダウンロードできます。
:::note warn
ONLYOFFICEとNextcloudの連携コネクタの詳細や仕組みについては、[APIドキュメント](https://api.onlyoffice.com/editors/nextcloud)のページをご覧ください。
:::### 主な機能
* テキスト文書、スプレッドシート、プレゼンテーションの作成、編集、閲覧
* オンラインフォームの作成と記入
* 他のユーザーとのファイル共有
* ト
Windows subsystem for Androidの導入
## はじめに
windows11ではwindows subsystem for Androidが利用可能です。
subsystemではapkファイルをインストールし、直接アプリを起動できます。必要スペック:Windows 11のバージョン22H2以降のスペックにしか対応していません。(8世代以降のcore i7など)
## 手順
今回はAmazon アプリ storeをインストールし、kindleやその他のapkを導入します。1. Micrrosoft Storeより、「Amazonアプリストア」をインストールします。
※再起動を促されて、再起動をしてもこちらで素直にインストールできない場合があります。
(何の設定弄ったか忘れたので、また追記します。)2.次に、**Amazon アプリストア**より、kindleをインストールします。(Microsoft storeのはインストールできません。)
## apkの直接インストール
※WSA_Pacmanなるソフトウェアを使うと、D&Dで簡単にインストールできるそうな。まずは、adbコマンドを必要としますので、[SDK
【Android】locationフィールドにGeoPointが使えなかった時の対処法
# はじめに
次のように、`location`フィールドに対して`GeoPoint`のインスタンスを設定して、データを追加しようとしました。
“`kotlin
val data = hashMapOf(
“createdAt” to FieldValue.serverTimestamp(),
“location” to GeoPoint(0.0, 0.0),
)val collectionReference = firestore
.collection(“records”)
.document(recordId)val reference = collectionReference
.add(data)
.await()
“`ところが、上記の処理を実行してみるとエラーが発生しました。
“`shell
Found conflicting getters for name getDefaultInstanceForType on class com.google.type.LatLng
“`# エラーの理由
Flutter の in_app_purchaseでGoogle Play Consoleで課金アイテムを作ったのに「The store is unavailable」
# 経緯
FlutterでAndroidのリリースビルドのために準備を済ませて、
`flutter build appbundle`で.aabファイル(App Bundle)を作成し、Google Play Consoleにアップロードして、アプリを作成したのち、課金アイテムを作成しました。
そしてFlutterのin_app_purchaseというパッケージの使用例
(https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase)
を使用したところ、
FlutterのUIで
「The store is unavailable」
との表示が出ました。# 解決策
Android Studioで
Create Device > Google Play Storeのアイコンマークがついているデバイス > 作成Google Play Consoleで
課金機能を実装したいアプリ > テスト > 内部テスト > テスター作成 > リンクを取得こちらでAndroid S
【Android】Barrierとは【kotlin】
# はじめに
前回 [【Android】Guidelineとは【Kotlin】](https://qiita.com/Tsubasa12/items/04a3676922cbfe2a7ba3) こちらの記事でGuidelineについて書きましたが、今回はそのGuidelineを調べている中で見つけた
Barrierについて調べたものを記事にします。# Barrier
Guidelineでは親Viewを基準にして補助線を引くものでしたが、
Barrierは子Viewを基準に補助線を引くものです。constraint_referenced_ids にViewを指定することでそのViewを基準にして補助線を引くことができます。
barrierDirection でそのViewのどの位置を基準にするか指定でき、
barrierMargin でその基準からMarginを指定することができます。例
“`
【Android】Observableで監視をしながらレイアウトを変える方法
# はじめに
こんにちは!
アプリ作成にボタンってほぼ必ずと言っていいほど使用しますよね?
そしてボタンを切り替えることをするかもしれないです。
例えば、ある処理を実行した後にボタンのグレーアウトを解除するとか、
ある処理の時はこのボタンを表示して別の処理の時はこのボタンを表示させるとかですね。
もちろんこれはボタンだけではなくテキストとかでも色々言えることだと思います。
この時まだ表示・非表示ならsetVisibility、文字列切り替えならsetTextとか使っていませんか?
もちろん場合によっては使用することもあるかもしれないですが、もし知らないのであればこれから書いていくObservableで切り替える方法を知っておくと便利かもしれないです。# Observableとは
ここではObservableはざっくりにしておきましょう。
話は戻りますがObservableとは値が変更された時に値が変更されたことを通知できるものになります。
これはString型やBoolean型に限らず例えば ”Hello” → “would” に変わった時 true → false に変わった時な
Google Play Consoleで新しいサブスクリプションの基本プラン作成時に「 予期しないエラーが発生しました。もう一度お試しください」
Google Play Consoleで新しいサブスクリプションの基本プランの値段付けが終わって保存しようとしたら、
「予期しないエラーが発生しました。もう一度お試しください」と表示されました。
ブラウザのキャッシュやクッキーを削除しても解決しませんでした。
# 解決策
国 / 地域の公開設定の管理
と書いてあるボタンをクリック
チェックボックスを全て外し、日本だけ有効にする。
JetpackComposeでタップしている間だけテキストの色が変わる方法
JetpackComposeでタップしている間だけテキストの色が変わる方法の簡単なサンプルを紹介いたします。
# 実装サンプル
“`ClickText.kt
@Composable
fun ClickText(
modifier: Modifier = Modifier,
onClick: () -> Unit = {},
text: String,
interactionSource: MutableInteractionSource =
remember { MutableInteractionSource() }
) {
val isLinkTextPressed by interactionSource.collectIsPressedAsState()
Text(
modifier = modifier
.clickable(
onClick = { onClick.invoke() },
indicati
【UserLAnd】AndroidでUbuntu環境構築
# はじめに
家にPCがないのでスマホ(Android)で開発環境を構築しようと考えました。# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS# UserLAndをインストール
PlayストアでUserLAndを検索してインストールします。
# Ubuntuをインストール
UserLAndを起動してUbuntuをインストールします。
# パッケージの更