Android関連のことを調べてみた

Android関連のことを調べてみた

TextFieldのPlaceholderを表示させたい

Android Jetpack Composeでテキスト入力を受け付けるコンポーネントとしてTextFieldをよく使用します。そんな中でもよく使う機能であるPlaceholder(プレースホルダー)を未入力の場合はずっと表示する方法を載せておきます。
※厳密にはプレースホルダーではないですが…
まずは普通にTextFieldでプレースホルダーを使用した際の動きを確認します。
# 通常
“`kotlin
var textFieldValue by rememberSaveable { mutableStateOf(“”) }
TextField(
value = textFieldValue,
onValueChange = {
textFieldValue = it
},
modifier = Modifier
.wrapContentSize(),
textStyle = Typography.bodyMedium,
label = {
Text(
text

元記事を表示

.NET MAUI アプリを USB 接続した Android 実機にデプロイする

# .NET MAUI アプリを USB 接続した Android 実機にデプロイする

こんにちは、@studio_meowtoon です。今回は Windows 11 で .NET MAUI アプリを作成する方法を紹介します。
![dotnet-maui_on_android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/e045e21e-d6a1-422e-4963-23e1bcf2177b.png)

## 目的

Windows 11 に Visual Studio Community をインストールし、.NET 8 で MAUI (Multi-platform App UI) を使って Android 実機に Hello World アプリをデプロイするまでの手順を解説します。

## Visual Studio Community のインストール

### Visual Studio インストーラーのダウンロード

[Visual Studio の公式サイト](https

元記事を表示

クローズドテストの審査に通らない

## 8月30日、審査落ち

この時、落ちた理由はアンケートの回答が雑すぎたからだと勝手に思ってました。
リリース要件を満たすことの難しさからGoogleにひどく腹を立てていて、当て付けで雑に回答をしたのです。
それからは何もしないでも「20人以上のテスターで審査日から●日以上」の日数が再びカウントされていったのでとりあえず放置することにしました。
そして2週間後、今度は丁寧にアンケートに回答しました。

## 9月15日、審査落ち

また落ちました。
明らかにおかしいと

元記事を表示

【Android】2Dアプリに3Dの輝きを施す登壇で本当に光輝いていた話

# はじめに
みなさん、DroidKaigi2024お疲れ様でした!
今回もとても収穫が多いイベントだったと感じましたが、みなさんはいかがでしたでしょうか?
特に今回はキャリアの話も多く聞く事ができ、一石二鳥以上の収穫でした。
そんな中でDaniele Bonaldoさんが登壇されていた【2Dアプリに3Dの輝きを】という登壇がとても印象的な内容でしたので、振り返りも兼ねて記事にできたらと思います。

https://2024.droidkaigi.jp/timetable/693695/

# Filamentが凄すぎる話
まずは以下をご覧ください

![screen-20240914-195743.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/3175ae1e-e425-de09-ec27-f2d61345aa81.gif) ![screen-20240914-195954.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaw

元記事を表示

Android デバッグで強制的に値を変更する方法

普段開発をしていると、サーバーの関係で希望するレスポンスでは無い場合があると思います。

今回は強制的に値を変更する方法です。

`getName`の返却値を`Greeting`のnameに渡して表示します。

“`.kt
private fun getName(): String {
return “World”
}
“`

“`.kt
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = “Hello $name!”,
modifier = modifier
)
}
“`

アプリを起動するとこんな感じです。

![Videotogif (12).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/ad51eb47-c51c-d4c4-626f-cf7509ee5843.gif)

こちらの`getName`の返却

元記事を表示

【Android】アプリの対応バージョンを決める際の考え方

前職でAndroidのアプリケーションに携わる業務が多く、要件生理時に作成するアプリの対応バージョンについて話し合う場合が多かったので、
対応OSバージョンを決める際に抑えてたポイントを備忘録がてら書き出します。
iOSアプリ開発やWebアプリ開発でも同等の考えはできると思います。

当時抑えていたものはこの2点+αでした。
(+αについては最後に記載します)
1. 機種の制限の有無
2. 各端末でのシェア率による検討

## 1. 機種の制限の有無
対応OSを決めてから要件を整理することは原則ありません。
機能等の要件を整理したうえで、開発の要件を抑えるのが基本なので決まるのが定石です。

いくら開発側が「Android 13で開発したい!」といっても顧客側が「この機種で動くものを作ってほしい」と言われたら該当機種に搭載されているOSで頑張るしかありません。

ただし、上記のような事象は業務用で利用するアプリ開発でのみ発生するパターンです。
世の中に出るアプリの場合は1種のみの指定等はまずありません。ですので「じゃあこの記事書いてること意味ないやないか!」ということはありませんので、

元記事を表示

play coreのSDK34+警告について

# エラー(警告)について
>com.google.android.play:core has added this note for core:バージョン:

>If your app is targeting SDK 34+ (targetSdkVersion), then the PlayCore SDK is outdated and will likely cause crashes in your app! Please update: developer.android.com/guide/playcore#playcore-migration

こちらの警告は、このメッセージが表示されているアプリがplay coreというgoogle提供のライブラリを使用している場合に表示されます。「Please update: 」の後のURLに記載がありますが、この警告が表示されるようになった理由はplay coreライブラリが複数のライブラリに分かれたのが原因になっています。
下記ではマイグレーションの手順と出くわす可能性のあるエラーについて書いていますが、マイグレーションについて

元記事を表示

Jetpack Composeでバケツリレーをしない方法

# はじめに
今回はJetpackCompose実装時に必要な型やクラスをComponentにバケツリレーをしない方法を紹介していきます
### 本文
その方法とはCompositionLocalです
まずは準備からです
“`kotlin
private val MyLocalColor: ProvidableCompositionLocal = compositionLocalOf {
error(“No current color”)
}
“`
ラムダ内はデフォルト値で値が与えられる前に取得しようとすると呼ばれます。
値を適用するには下記のようにします
“`kotlin
CompositionLocalProvider(MyLocalColor provides Color.Black) {
MyApp()
}

“`
ラムダ内は使用したいComposable関数を定義します。
これは、子要素に伝播していくので基本的には該当Moduleや該当パッケージの上部要素に対して設定しておけば問題ないです。
滅多に変わら

元記事を表示

DroidKaigi 2024 9月13日資料一覧

[DroidKaigi 2024](https://2024.droidkaigi.jp/)資料一覧
見つけた分だけ


## 10:20-11:00
### [アプリをリリースできる状態に保ったまま段階的にリファクタリングするための戦略と戦術](https://2024.droidkaigi.jp/timetable/690441/)
会場:Iguana
スピーカー:Yuki Anzai様
資料:[アプリをリリースできる状態に保ったまま 段階的にリファクタリングするための 戦略と戦術](https://speakerdeck.com/yanzm/strategies-and-tactics-for-incremental-refactoring)

### [アイデアからIDEへ: Android Studio用プラグインの開発](https://2024.droidkaigi.jp/timetable/684398/)
会場:Hedgehog
スピーカー:Ahmed Ali様
資料:—

### [Android 15と日本語](https://2024.droidka

元記事を表示

adb devices -l で出た番号を変数に出力したい

Androidデバイスが複数あるとadb devices -lの後に番号を指定しなければならないため作成した。

下記は:の後を取得するようにした。

“`
@echo off
setlocal enabledelayedexpansion

REM adb devicesコマンドを実行してデバイス番号を取得
for /f “tokens=1,2” %%i in (‘adb devices -l’) do (
REM デバイスのシリアル番号は2列目(statusが”device”の行)にある
if “%%j”==”device” (
set DEVICE_ID=%%i
REM コロンの位置を探して、それ以降の文字を抽出する
for /l %%x in (0,1,255) do (
set CHAR=!DEVICE_ID:~%%x,1!
if “!CHAR!”==”^:” (
set AFTER_COLON=!DEVICE_ID:~%%x+1!

元記事を表示

logcat取得を自動化したい。

logcatでファイルを分けたいがログキャットをクリアし、ファイル名を入力し、ログキャットを止める処理がチョット面倒くさい。。。

なのでそれをなるべく楽にしたいのだが、やりたいことを簡単に書くと

“`
REM ログキャットをクリア
adb logcat -c
REM File名を入力
set /p FleName=”Input file name”
REM 入力されたファイル名でlog catを取得
adb logcat > %FleName% + “.txt”
“`

こんな感じである。

## が

これだとlogcat 取得停止時にCtrl Cを押し、その後にコマンドプロンプトからバッチ処理を終了しますか? Y/N でNを押さなくてはいけない。
ちなみにY or N 以外を押さないと押されるまでLOOPする。

なのでそこをスキップさせたいがbatには非同期処理が無いため、adb.exeをkillすればいいのではないかという結論にたどり着いた

完成形
“`
@echo off
adb devices

set /P grep=”grepしたいWord:”
set e

元記事を表示

DroidKaigi 2024 9月12日資料一覧

[DroidKaigi 2024](https://2024.droidkaigi.jp/)資料一覧
見つけた分だけ


## 11:20-12:00
### [サプライチェーン攻撃に備える](https://2024.droidkaigi.jp/timetable/690464/)
会場:Iguana
スピーカー:RyuNen344様
資料:[サプライチェーン攻撃に備える](https://speakerdeck.com/ryunen344/sapuraitiengong-ji-nibei-eru)

### [宣言的UIを学ぶ際に知っておくべき重要なコンセプト](https://2024.droidkaigi.jp/timetable/694168/)
会場:Hedgehog
スピーカー:HyunWoo Lee様
資料:—

### [Android ViewからJetpack Composeへ 〜Jetpack Compose移行のすゝめ〜](https://2024.droidkaigi.jp/timetable/689254/)
会場:Giraffe
スピーカー:s

元記事を表示

Androidデバイスのストレージ容量を取得する

# アプリでストレージの全体容量を取得したい
ひょんなことで、内部ストレージの全体容量と空き容量を取得する必要性が出てきました
先行調査から「android.os.StatFsを使えばいけるんじゃね?」とのこと

https://developer.android.com/reference/android/os/StatFs#getTotalBytes()

確かに行けそう…
まぁどうやるかもよくわからんし、他サイトも調べてみると

https://zenn.dev/no4_dev/articles/bb7af37d5b44074d29bf-2

まさにな記事も発見!
さらに調べてみると上の記事でやっている
“`kotlin
val statFs = StatFs(path)
// 総容量
val totalSpase: Long = statFs.blockCountLong * statFs.blockSizeLong / 1024L / 1024L
// 空き容量
val freeSpase: Long = sta

元記事を表示

ヘルスコネクトから歩数を取得したけど、なんだか合わないな…

# はじめに
この記事は、ヘルスコネクトから歩数を取得したけど、なんだか歩数の合計値が合わないな…ってなって、対処した時のメモです。

# 最初の実装
自分の場合は1日ごとの歩数の合計値を取得したくて AggregateGroupByPeriodRequest[^1] を使って下記のような実装をしていました。

“`kotlin
// 1日ごとの歩数を集計する
// startTs, endTs … Unix Time(ミリ秒)
AggregateGroupByPeriodRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
// wrong
timeRangeFilter = TimeRangeFilter.between(
Instant.ofEpochMilli(startTs),
Instant.ofEpochMilli(endTs)
),
timeRangeSlicer = Period.ofDays(1),
dataOriginFilter = setOf(DataOrigin

元記事を表示

【iPhone・Android】壊れたスマホから写真を取り出す方法

以前使用したiPhone・Androidスマホが何らかの理由で故障しました。 このような場合、通常は新しいスマホに機種変更という選択になります。 正常に動くスマホであれば、データを転送して、古いスマホから新しいスマホに写真などのデータを簡単に復元できます。しかし、スマホが壊れたら、写真はどうなりますか? それに、壊れたスマホに保存されたデータは全部消えてしまいますか?戻せますか
上記の疑問点をを解消するために、ここでは、[壊れたスマホから写真を取り出す](https://x.gd/o7Ri7)方法を紹介します。
# Part1.壊れたスマホから写真を取り戻すことはできるか?
スマホが壊れても、必ずしも全てのデータが完全に消えてしまうわけではありません。壊れたスマートフォンから写真を取り戻せるかどうかは、スマホの破損状況やデータのバックアップ状況によって大きく変わります。
Googleフォト、iCloudなどのクラウドサービスにバックアップしていれば、新しいスマホにログインするだけで、写真を取り出すことができます。バックアップがない場合でも、いくつかの復元方法を試す価値があります。
しか

元記事を表示

AndroidでJsonを扱う

## AndroidでJsonを扱うための設定など

* プロジェクト
“`build.gradle.kt
plugins {
id(“org.jetbrains.kotlin.plugin.serialization”) version(“2.0.20”)
}
“`

* モジュール
“`build.gradle.kt
plugins {
id(“org.jetbrains.kotlin.plugin.serialization”)
}

dependencies {
implementation(“org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2”)
}
“`

* JSONに対応したデータクラス
“`JsonData.kt
import kotlinx.serialization.Serializable

//Serializableアノテーション必要
@Serializable
data class JsonData(
val id:String = “”,
val

元記事を表示

AndroidのWebViewでAngularからアプリへデータを渡す

## AndroidのWebViewでAngularで作成したWebページからアプリへデータを渡す

* Angular側のソース

以下を宣言する
“`top.component.ts
declare global {
interface Window {
android: any;
}
}
“`

アプリへデータを渡す箇所(抜粋)
“`top.component.ts
let model : TicketModel = new TicketModel();
model.id = “00001”;
model.name = “テスト”;
let jsonStr : string = JSON.stringify(model);
window.android.showMessage(jsonStr);
“`

TicketModelクラスは以下の通り
“`ticket.model.ts
export class TicketModel {
id? : string;
name? : string;
}
“`

* Android側のソース
 (act

元記事を表示

Kotlinのfactoryってなに?

# factoryとは
– Kotlinにおけるインスタンス生成方法の1つ
– インスタンスの生成で、“`single“`または“`factory“`を使う
参考サイト:

# “`single“`と“`factory“`の使い分け
– “`single“`と“`factory“`をどうやって使い分けるかはアプリの設計に関係してくる
– 一般的なAndroidアプリでは、以下の観点で使い分けられるケースが多い(あくまで一例)
– Repositoryクラスのように**決まった対象のDBへアクセスする必要があり、かつ、アクセスする際に、一貫性を保つ必要があるケース**
single(Singleton)
– HttpClientクラスのような**決まった設定値を全てのアプリで使い回すケース**
single(Singleton

【Azure/Firebase】Azure PipelinesでCLIツールのインストールに失敗するのを解決する方法

## はじめに

Azure Pipelineでアプリを`Firebase App Distribute`に配布しています。
このパイプラインで本日(2024/09/12)突然エラーが発生したため、解決方法を記録しておきます。

## 環境

– Firebase CLI 13.17.0
– Azure Pipeline
– ubuntu-latest (Ubuntu 22.04)
– macos-13

## 起きたこと

以下の公式サイトにある、「Standalone Binary」の手順でインストールしていました。

https://github.com/firebase/firebase-tools

具体的には以下のコマンドを使用しインストールする方法を使用していました。

“`sh
$ curl -sL https://firebase.tools | bash
“`

ですのでパイプラインの定義は以下のようになります。(前後省略)

“`yml
– script: curl -sL https://firebase.tools | bash
d

Kotlinのinvoke()ってなに?

# ざっくり言うと
– invoke()が付いていた場合はメソッド名は無く、クラス名を使って呼び出している
→Android Studioで呼び出し元を知りたければ、クラス名をctlキーを押しながらクリックする

# もう少し詳しく
– invoke()は、メソッド名を省略できると言う意味の方が近いカモ
(メソッド名が無くても呼び出せるし、「invoke()」とインスタンス名に続けて書くこともできる)
– 例外として、インスタンスがnullableな場合は、省略ができなかったりする

“`kotlin:省略ができない例
hogeHogeClass?invoke()
“`