- 1. 【Jetpack Compose】WebViewにpull-to-refreshを実装しようとしたらハマったこと
- 2. 「debug」と「attach debugger to android process」の違い
- 3. CastContext.getSharedInstance(context: Context)のdeprecated対応
- 4. Androidスマホ/タブレットにTermux/google-home-playerをインストールしてアラーム指定日時に各部屋のGoogle Home(Google Nest)を喋らせる
- 5. KMP (Kotlin Multiplatform)の導入検討
- 6. AndroidアプリをGoogle Play Consoleから公開するときにこまったこと
- 7. 【Android】アプリアイコンをさくっと作成する方法
- 8. Androidアプリのproguardで画像が表示されなくなる件
- 9. google-home-notifierもGoogle Nestも使わずにAndroidだけでTermuxを使って喋らせる
- 10. 【Android】Android端末の画面サイズを取得する【Kotlin】
- 11. android.util.PairはUnitテストではfirst==null & second==null になる
- 12. EmacsのAndroidポートのビルド
- 13. 【Android】SearchViewをComposeで実装する
- 14. Jetpack Composeでスクレイピングしてみた
- 15. ElixirDesktop Android Exampleを参考にAndroidアプリを1から作ってみる
- 16. Godotでaabファイルつくってアプリ公開しました
- 17. 【Flutter】ListViewを無限ループスクロールできるようにしてユーザーを幸せにする。
- 18. 【Android】画像URIから拡張子を取得
- 19. Channel実装時に気をつけたいこと
- 20. JetBrains Toolbox Appでインストール場所を変更する
【Jetpack Compose】WebViewにpull-to-refreshを実装しようとしたらハマったこと
# はじめに
現在(2023/10/10)Jetpack Composeでは、WebViewを使うにはAndroidViewで囲む必要があります。対して、pull-to-refreshはJetpackComposeに実装されているPullRefreshと以前のViewのSwipeRefreshLayoutがあります。結論、SwipeRefreshLayoutで解決しました。
# WebView
Jetpack Composeでは、WebViewを使用するためにはAndroidViewというラッパーを用いてその中にWebViewを配置する必要があります。AndroidViewはJetpack Composeのコンポーザブルから従来のViewシステムを使うための架け橋的存在です。
以下にコード例を示します。“`kotlin
@Composable
fun WebViewContainer() {
AndroidView(factory = ::WebView) { webView ->
// WebViewの設定をここで行う
webVie
「debug」と「attach debugger to android process」の違い
「普通のDebug」と「Attach Debugger to Android Process」の違い
前者はアプリ起動時からデバッグする。
後者は既にアプリが起動した後にデバッグする。起動時の画面に変化が無いかの確認等でよく使うのは前者。
起動した後の画面から特定のボタンやビューをタップした後の動作を確認するときに使うのが後者。
CastContext.getSharedInstance(context: Context)のdeprecated対応
`CastContext.getSharedInstance(context)` が deprecated になり、Taskを渡して取得する方法が推奨されるようになりました。
https://developers.google.com/android/reference/com/google/android/gms/cast/framework/CastContext#getSharedInstance(android.content.Context)
公式の[Sample](
https://github.com/googlecast/CastVideos-android/blob/99d3de47890c7c02650db45dda806b5255d27787/app-kotlin/src/main/kotlin/com/google/sample/cast/refplayer/VideoBrowserActivity.kt#L92)では以下の使い方をしていますが、この方法だと困ったことにうまく取得できません。“`kotlin
val castContext =
Androidスマホ/タブレットにTermux/google-home-playerをインストールしてアラーム指定日時に各部屋のGoogle Home(Google Nest)を喋らせる
### Androidスマホ/タブレットにTermux/google-home-playerをインストールしてアラーム指定日時に各部屋のGoogle Home(Google Nest)を喋らせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123229/936fb6b5-4b18-d437-cce4-ad0c926407dc.png)### 今回は各部屋に置いてある複数台のGoogle Home(Google Nest)を喋らせます
今回はAndroidスマホ・タブレットを直接喋らせるのではなく、「各部屋に置いてある複数台のGoogle Home(Google Nest)を喋らせる」方法について書きます
### 前回の記事の続きになります
前回の記事「Androidスマホ/タブレットにTermuxをインストールしてアラーム指定日時に自由に喋らせる」の続きになります
Androidスマホ/タブレットだけを使ってAndroid自体にアラーム指定日時に喋らせるだけであれば前回の記
KMP (Kotlin Multiplatform)の導入検討
はじめに
–本田技研工業でAndroidAutomotiveOS向けのアプリ開発を担当している松村です。
新規アプリを作成するにあたって、マルチデバイスに対応できる拡張性を持たせた構成にしたいという考えから
KMP(Kotlin Multiplatform)の検討をいたしましたので軽く紹介したいと思います。まず最初に
–
[最近まで使われていたKMM(Kotlin Multiplatform Mobile)という名称は廃止され、
KMP(Kotlin Multiplatform)に名称を統一されました。](https://blog.jetbrains.com/ja/kotlin/2023/08/update-on-the-name-of-kotlin-multiplatform/)なぜKMPを検討したのか
–
他にもクロスプラットフォーム([Flutter,](https://flutter.dev/) [.NET MAUI](https://dotnet.microsoft.com/en-us/apps/maui), [ReactNative](https://dotn
AndroidアプリをGoogle Play Consoleから公開するときにこまったこと
Godot4.1.1で開発したゲームをGoogle Playで公開しました。
https://play.google.com/store/apps/details?id=com.footinglow.android.tiltslalom&pli=1
その時に参考にしたサイトと、困ったけど解決した方法などまとめます。
# 参考にしたサイト
こちらのサイトを参考にしました。大変お世話になりました。https://pursue.fun/tech/how-to-android-app-release-overview/
# Google Play Consoleの登録で悩んだこと
JCBカードで支払いできました。
それ以外はネットで調べた内容で、迷わず登録できました。# Google Play Consoleで「アプリを作成」
Google Play Consoleの「アプリを作成」ボタンを押下すると、アプリケーションの情報登録が始まります。
たくさんの情報を登録しますが、その中に「プライバシーポリシー」の「url」を登録する必要があり、面食らいましたが、下記のサ
【Android】アプリアイコンをさくっと作成する方法
アプリのアイコンが付いていないとコードを書く気が出ない・・・そんなときに、とりあえずそれっぽいアイコンをさくっく作成する方法です。先日、[iOS](https://qiita.com/yuppejp/items/0cc2b8276d215cc24f14)でやったので、今回はAndroidでもやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/94d4cae1-1dd4-071f-5e71-0678fa4186a4.png)
↑ やる気がでないやつ# アプリアイコンの作成の流れ
1. アイコン画像を表示するViewを作成
1. Viewのスナップショットをファイルに保存(PNG)
1. Android Studioでアイコン画像を設定## アイコン画像を表示するViewの作成
Jetpack Composeで[マテリアルアイコン](https://developer.android.com/reference/kotlin/androidx/compose
Androidアプリのproguardで画像が表示されなくなる件
# 問題
過去にリリースしたアプリに取り込んでいる各種ライブラリの最新化などメンテしていた際に
proguardまわりを見直していたら、突如画像が出力されなくなった。
![スクリーンショット 2023-10-09 11.47.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183689/7557ea95-6646-7d46-de38-8ed71f2befd7.png)
画像1.正しく表示されている例
![スクリーンショット 2023-10-09 11.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183689/875e097a-bcb4-6f47-73fd-f50389f04142.png)
画像2.正しく表示されていない例# 原因・解決方法
build.gradle(:app)のbuildTypesに「shrinkResources true」を追加したことが原因。
これを削除したことで問題なく画像
google-home-notifierもGoogle Nestも使わずにAndroidだけでTermuxを使って喋らせる
## google-home-notifierもGoogle Nestも使わずにAndroidだけでTermuxを使ってアラーム指定日時に自由に喋らせる
Androidスマホ/タブレットにTermuxというLinuxアプリをインストールして、アラーム指定日時に自由に喋らせる方法について書きます
(※)説明が長くて難しそうに見えるかもしれませんが、Androidのアプリをインストールして実行してるだけなので非常に簡単です(一部Linuxコマンドの実行がありますが、それも簡単です)
(※)バックグラウンド常駐動作なので、スマホをスリープにしていても、スマホで他の操作をしていても動きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123229/40edd070-7e7d-a3f8-b79d-7d630ccd3323.png)### 一般のスマホ・タブレット系の音声例
(例)Redmi Note 9S
https://nisimura.org/wp-content/upload
【Android】Android端末の画面サイズを取得する【Kotlin】
# 実践
val textViewX = findViewById
(R.id.text_view_x)
val textViewY = findViewById(R.id.text_view_y) val display: Display = this.windowManager.defaultDisplay
val point = Point()
display.getSize(point)textViewX.text = point.x.toString()
textViewY.text = point.y.toString()参考記事から抜粋し、JavaからKotlinに変換したものです。
参考記事ではバージョン毎に処理を追加していますが、当時の環境のバージョンは現状なかなかないと思いますので、そこは省いて最小限の内容にしてあります。# 結果
![Screenshot_2023-10-08
android.util.PairはUnitテストではfirst==null & second==null になる
# 環境
– `androidx.core.core` : v1.9.0
– kotlin : v1.8.10
– `compileSDK` : 33
– `org.robolectric:robolectric` : v4.10.3# 起きたこと
“`kotlin
class ExampleUnitTest {
@Test
fun testA() {
val pair = Pair(1, 2)assert(pair.first == 1)
assert(pair.second == 2)}
}
“`こんなテストを、実行するとなぜか失敗。
# 原因
→原因は、ここで呼んでいた`Pair`が`android.util.Pair`だったから。
“`kotlin
import android.util.Pairclass ExampleUnitTest {
@Test
fun testA() {
val pair = Pair(1, 2)
EmacsのAndroidポートのビルド
# EmacsのAndroidポートのビルド
[0. 前書き](#0-前書き)
[1. 手順](#1-手順): ビルド用レポジトリを用意手順をさっくり説明
[1.1 レポジトリの準備](#11-レポジトリの準備)
[1.2 forkする](#12-forkする)
[1.3 ローカルにclone](#13-ローカルにclone)
[1.4 作業用ブランチのcut](#14-作業用ブランチのcut)
[1.5 リモートにpush](#15-リモートにpush)
[1.6 デフォルトブランチの設定](#16-デフォルトブランチの設定)[2. ワークフローファイル](#2-ワークフローファイル)
[2.1 ワークフローファイルのadd](#21-ワークフローファイルのadd)
[2.2 リモートにpush](#22-リモートにpush)[3. ビルド](#3-ビルド): ビルドする手順(詳細略)
[3.1 ワークフローをrun](#31-ワークフローをrun)[4. ワークフローで行っていることの説明](#4-ワークフローで行っていることの説明)
[4.1 ワークフローの定義]
【Android】SearchViewをComposeで実装する
# はじめに
だいぶComposeで実装しやすい環境が整ってきましたが、AndroidViewの機能であるSearchViewをComposeで実装したらどんな感じになるのか調べる機会がありましたので、備忘録的に残しておこうと思います。# SearchViewをComposeで実装する
まず旧実装は以下になります。“`main.xml
“`
Composeが普及してきているとはいえ、XMLを使用したAndroidViewの実装はまだまだ現役ですよね。
上記に対してComposeの実装は以下になります。“`main.kt
val focusManager = LocalFocusManager
Jetpack Composeでスクレイピングしてみた
# はじめに
どうも、フリーランスエンジニアをしているモブ太郎です。
このの記事では、Jetpack Composeで「Jsoup」というライブラリを使用して、スクレイピングをしたいと思います。
細かい説明は省いていますので、参考程度、こういったものがあるんだな程度に見ていってください。# 完成形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331610/7495d370-2592-5283-a253-2c8fa334ad5a.png)# Jetpack Composeとは
Jetpack Composeは、ネイティブUIをビルドする際に推奨されるAndroidの最新ツールキットのことです。
Jetpack Composeを導入する理由は以下になります。
– **コードを削減**
少ないコードで多くの機能が可能になり、あらゆる種類のバグが避けられるので、コードがシンプルで維持しやすくなります。
– **直観的**
UIを記述するだけで、残りの部分はComposeで処理されます
ElixirDesktop Android Exampleを参考にAndroidアプリを1から作ってみる
# はじめに
本記事は以下を参考にAndroidStudioでプロジェクトを作るところから初めて
実際に起動するまでの手順の備忘録ですhttps://github.com/elixir-desktop/android-example-app
# プロジェクトを新規に作成
Native C++ を選択
![スクリーンショット 2023-10-07 21.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/12b9ee06-2e0d-2207-7d91-65add479745b.png)Save Locationは phoenix_pj/native/android に設定
Minumum SDKはお好きに自分は10.0にしました
gradleはElixirDesktopに合わせてgrooby DSLにする .ktsにしない![スクリーンショット 2023-10-07 0.21.38.png](https://qiita-image-store.s3.ap-northeas
Godotでaabファイルつくってアプリ公開しました
Godot4.1.1で開発したゲームをGoogle Playで公開しました。
ご興味があれば是非一度遊んでみてください。https://play.google.com/store/apps/details?id=com.footinglow.android.tiltslalom&pli=1
Google Playにアプリを公開するためには、apkファイルではなく、aab(Android App Bundle)というファイル形式にする必要があります。デジタル署名も必要です。その方法をまとめました。
:::note info
GoogleのAndroid Developperを参考にしました。というかそのままです。
https://developer.android.com/games/engines/godot/godot-export
:::# APKファイルエクスポートの設定
事前にAPKファイルのエクスポートができるようにしましょう。ここのプロジェクト設定や、デバッグ用キーストアの設定がaabファイルの作成にも必要です。https://qiita.com/F
【Flutter】ListViewを無限ループスクロールできるようにしてユーザーを幸せにする。
どうも、個人でアプリ開発をしているYuKiOです。
「最高にかっこいいメモアプリHacker Memo」や「社会や街の安全に貢献するためのプラットフォームアプリみんなのチカラ」などアプリを15本リリースしています。
今回の記事は、ListViewで作成したボタン一覧を無限ループでスクロールする方法を紹介したいと思います。
色々調べましたが、なかなか良い解決策がなかったので記事にしてみました。
もし、もっと楽な方法があれば、教えて欲しいです。
## 実現したかったこと
水平にスクロールして選択できるカテゴリ選択ボタンリストがあります。左右どちらにスクロールしても、前後が繋がってリストが表示され続ける無限ループのに表示したい考えました。無限ループにすることで、両端のボタンに素早くアクセスできるようになることで快適になり、ユーザーが幸せになると考えたからです。例えばリストのアイテム数が決まっている場合や、そこまで数が多くない(多くても20くらい)ことが想定される場合に限定される要望だと思いますが、以下のようにカテゴリ選択で今回は実装しました。
![IMG_2094.jpg](
【Android】画像URIから拡張子を取得
# はじめに
画像URIから拡張子を取得する方法について解説。# コード
URIには`content`スキーム`file`スキームの2種類が存在するので、それぞれの方法で拡張子を取得する。“`Kotlin
fun Uri.getExtension(contentResolver: ContentResolver): String? {
return when (scheme) {
ContentResolver.SCHEME_CONTENT -> MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(this))
ContentResolver.SCHEME_FILE -> MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(File(path ?: return null)).toString())
else -> null
}
}
“`# 参考
https://stackoverflow.com/questi
Channel実装時に気をつけたいこと
# はじめに
今回は`Coroutine`のひとつである`Channel`について気をつけておきたいことを紹介していきます
### 本文
まず、許容量です
`Channel`宣言時に下記のようにすることで`Channel`に対して幾つの値を詰めれるかを設定することができます
“`kotlin
Channel(Channel.CONFLATED)
“`
デフォルトだと`RENDEZVOUS`が設定されています
`RENDEZVOUS`は`send`と`recieve`各々が呼ばれるまで片方は止まり続けるのでスイッチに似た機構になっています
`CONFLATED`は上書きされ、常に最新のものが入っている状態になります
基本的には上記二種類を使うのが一般的かと思います。次に、`close`です
これは値の更新や取り出しをこれ以上したくない場合に呼び出すのですが、意図しないタイミングで更新をしてしまった時などのために下記のようにしておくことでクラッシュしてしまうことを予防することができます
“`kotlin
if (hoge.isClosedForReceive) {
JetBrains Toolbox Appでインストール場所を変更する
JetBrains Toolbox Appでは、
> 設定 > ツール > ツールのインストール場所
にて、ツールのインストール場所を変更できるはずなのですが、本稿執筆時点(JetBrains Toolbox 2.0.4.17212, macOS 13.4.1)においては、編集できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1790252/58505435-8443-6a79-06b0-24706d6c8faf.png)
そこで、以下のIssueコメントにあるように、 `~/Library/Application\ Support/JetBrains/Toolbox/.settings.json` の `install_location` に任意のパスを設定することで、インストール場所を変更できます。
https://youtrack.jetbrains.com/issue/TBX-9575/Enable-changing-install-location
以下は