Android関連のことを調べてみた2023年01月02日

Android関連のことを調べてみた2023年01月02日

【Android】JetpackCompose の基本【kotlin】

# はじめに
今回はJetpackComposeの基本的なことを記事にします
自分の中の解釈で書いているので間違っている点もあるかとは思いますが、使いながら慣れていき
間違っていることに気が付いたら直していければな と思います

# 基本
“`
@Composable
“`
上のアノテーションが付けられた関数がコンポーズ可能な関数

“`
@Preview
“`
コンポーズ可能な関数に上のアノテーションを付けてプロジェクトをビルドすることで
Android Studio内でプレビューを表示することができます

“`
@Composable
private fun Hoge(name: String) {
Surface(color = Color.Green) {}

“`
Composeで作られたUIの背景色を変える場合はSurfaceでラップします
Surfaceは色を受け取ることができるので背景色に指定したい色を引数に渡します

SurfaceやTextなどのCompose内の要素は **modifier** という省略可能なパラメータにより親レイアウ

元記事を表示

【Android】Jetpack Composeで、表示させたいURLの画像をImageに渡す方法

# アプリを作っていて・・・

ユーザーが保存した画像を、アイコンとして表示させたいなと思っていました。
ところが、今までアプリの内部で保存されていた画像リソースを参照して表示するくらいの機能しか作ったことがありませんでした。

そこで、どうやったら画像URLをアプリ上で表示できるようになるかを調べたので、今後の自分への忘備録として記しておこうと思います。

今回は執筆時点のバージョンが**2.2.2**の**Coil**ライブラリを使用した場合の解説となりますので、あらかじめご了承ください。

# 画像を読み込むために必要なライブラリのインポート

外部URLに存在する画像を読み取るためには、**Coil**ライブラリが必要になります。

“`gradle
implementation(“io.coil-kt:coil:2.2.2”)
“`

https://coil-kt.github.io/coil/compose/

続いて、Jetpack ComposeにてCoilを使いたいので、次のライブラリをインポートします。

“`gradle
implementation(“i

元記事を表示

Androidのホーム画面にウィジェットを配置しよう

(今年一回目の投稿です)

今回はAndroidのホーム画面に自分カスタムのウィジェットを配置します。
カスタムといっても、自分の好きなWebAPIを呼び出すだけモノのです。
ですが、サーバを立ち上げてWebAPIの呼び出し先での後処理をカスタマイズすれば、なんでもできますよね。
ということで、ウィジェットを配置するAndroidアプリケーションと、WebAPI呼び出しを受け付けるNode.jsサーバの2本立てです。

ソースコードもろもろは以下のGitHubに上げてあります。

poruruba/CustomWidget

https://github.com/poruruba/CustomWidget

# 全体構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/f9278efc-6f24-2878-d212-518d31cb0cf0.png)

ウィジェットのためのAndroidアプリケーションと、WebAPI呼び出しを受け付けるNode.jsサーバの2つからなりま

元記事を表示

[WearOS] Androidアプリ開発との相違点

## :speaker: 今回話すこと
– Androidアプリ開発とWearアプリ開発との相違点について

## :thinking: Androidアプリ開発との相違点
### :ok_woman: 同じところ :ok_woman:
#### AndroidStudioで開発できる
エミュレーターもWearOS端末で実行できるので、実機がなくても実行は出来ます。
ワイヤレスデバックにも対応しています。

AndroidのエミュレーターとWearのエミュレーターを接続することも出来ます。

#### Jetpackライブラリを使用できる
Jetpackライブラリなどが使える点で、Androidエンジニアとしての知識がそのまま活用できます。
そのため、ViewModelやFlow, Hiltなどを用いたAACベースのアーキテクチャを採用できます。
また、UIもViewベースでの書き方とComposeベースの書き方両方あるので、特に変わりはないです。

#### OSのバージョンが対応されている
同じである点か微妙ですが、一応。
AndroidのAPIレベルと対応されています。

元記事を表示

CoroutineDispatcherをHiltでいい感じにDIする

# 概要
CoroutineのCoroutineDispatcherをHiltでDIできるようにした方法です。

# 解決したいこと
まず前提としてCoroutinesをAndroidで使用する際に下記のように実装することが好ましいとされています。
また今回は1と3の問題を解決するためにCoroutineDispatcherをDIする必要性が出てきました。
1. suspend関数はmain-safeな実装にすること
2. suspend関数はcancellableな実装にすること
3. withContextのCoroutineDispatcherはハードコードしないこと

https://developer.android.com/kotlin/coroutines/coroutines-best-practices?hl=ja
## main-safeな実装について
suspend関数はMainスレッドから呼び出されても問題ない(クラッシュしたりフリーズしない)実装にすることが好ましいとされています。
## withContextのCoroutineDispatcherはハードコ

元記事を表示

【Android】未使用リソースをまとめて削除する方法

# はじめに
本日は大晦日ですね、年の瀬となれば大掃除ですが、プロジェクト内のリソース整理できていますか?
歴史の長いプロジェクトであれば人の入れ替わりもあり、その辺りも疎かになりがちだと思いますが、全てサクッと消す方法があるので備忘録的にもまとめておこうと思います。

# まとめて削除する方法
削除する方法は至って簡単です。
AndroidStudioのメニューから Refactor > Remove Unused Resources…を選択する形になります。

上記に沿って選択していくと以下ダイアログが表示されますが、直ぐに消すのが不安な方はプレビューを選択していただければ消す前に削除する対象の一覧が確認できます。

Android の Geofence で気をつけること

もう年末ですが、今年とある機能の開発で戦った Android の Geofence について [Android Advent Calendar 2022](https://qiita.com/advent-calendar/2022/android) に書こうと思います。試しに動かすと動いちゃうんですよね。コイツは。でも少し深く掘って見ると様々な障害点が見つかります。

# Geofence とは

https://developer.android.com/training/location/geofencing?hl=ja

事前に設定した領域からの出入りをイベントとして処理を行うことができます。

:::note info
さらに Google Play 開発者サービスを利用の [Activity Recognition Transition API]( https://developers.google.com/location-context/activity-recognition) を利用すると、行動の様子(歩く・走る・止まる・乗り物)も含めてイベントにすることができます

元記事を表示

【Android】Jetpack Composeで、イメージピッカーを作ってみる【rememberLauncherForActivityResult()編】

# イメージピッカーをJetpack Composeで作ってみたい

なにかしらの登録画面で、ギャラリーから画像を選択して、その選択した画像を登録できるようにしたいと思ったことはありませんか?しかも、Jetpack Composeを使って。

僕はこの問題に、今まさに直面しています。

そこでこの記事では、未来の自分への忘備録として、Jetpack Composeでイメージピッカーを作成する手順を解説しようと思います。

# rememberLauncherForActivityResult()とは

実際に、イメージピッカーの実装に入る前に、あるメソッドについて説明しておかないといけません。
そのメソッドとは、`rememberLauncherForActivityResult()`のことです。

コンポーザブル内で、ファイルを選択したり保存したりする機能を実装したことがある方なら見覚えがあるかもしれません。

公式のドキュメントには次のように書かれています。

> rememberLauncherForActivityResult() API を使用すると、コンポーザブル内のアクテ

元記事を表示

SearchViewでソフトキーボードを非表示にする

AndroidアプリでActionBarにSearchViewを実装する際のソフトキーボードを非表示にする方法は、以下の通りです。
今回は、Fragmentに

## レイアウトファイル
“`menu/search.xml


【Android】LazyColumnに手を出す前に、スクロール可能なColumnを作る方法

# コンポーザブルで実装したい画面のレイアウト

まず、次のようにテキストフィールドが複数あって、ボタンを押すことで入力内容に基づいた何かしらのアクションを行える画面を作りたい場面を考えます。

![名称未設定のデザイン (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/4e919e3f-916c-ed75-3018-560777f3eec4.png)

# LazyColumnを使った無理矢理な実装

上記のような画面を作りたい時、今までは`LazyColumn`と`item`を組み合わせて次のようなコンポーザブルを作成していました。

“`kotlin
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SignUpScreen(
scrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(),
e

元記事を表示

AndroidのMediaExtractorで映像・音声のソース確認

# はじめに
株式会社THIRD IT開発部でモバイル開発チームでアプリ(Android及びiOS)の開発を行なっているエンジニアです。
弊社では不動産の点検や作業報告などをスマートフォンで行うためのアプリとして,管理ロイド等のアプリを開発及びリリースしています。

管理ロイドではマンション等の各種点検業務でビデオデータを添付する事があります。
添付したビデオデータがごく稀に壊れている場合があるため`MediaExtractor`を使用しメディアデーター内のソースを確認する事としました。

# ビデオ撮影について
ビデオ撮影については[ACTION_VIDEO_CAPTURE](https://developer.android.com/reference/android/provider/MediaStore#ACTION_VIDEO_CAPTURE)を使用してカメラアプリに撮影してもらっています。

> カメラアプリ呼び出し例

“`kotlin
val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
startActivity

元記事を表示

Android Enterpriseを支えるAndroid OSのソースコード解説

今年のAndroid Enterpriseアドベントカレンダーの締めくくりとして、この過疎っているアドベントカレンダーで紹介してきた機能の裏側(おもにAndroidフレームワークのソースコード)の解説を軽くしてみようと思います!

## まえおき

Android Enterpriseにはいくつかの動作モードがあります。

https://support.google.com/work/android/topic/9563482?hl=ja&ref_topic=9621435

1つのデバイスを仕事専用デバイスとしてMDM管理下に置くFully Managed deviceだけではなく、個人端末の業務利用(いわゆるBYOD)や業務端末の個人利用(BYODの逆)ができるWork Profileと呼ばれるモードがあるのが特徴的です。

1つのデバイスを複数のプロファイルで利用する、それをAndroid OS / Google Playサービスはどのように利用しているのでしょうか?

## Android OSはそもそも複数ユーザで利用ができる

Androidは、もう8年前くらいのバージョ

元記事を表示

Google mapをJetpack Composeで扱うための環境構築

公式ドキュメントのインストール手順通りに進めてもうまく行かない箇所があったのでここに調査結果をまとめる。
なお、すでにGoogle mapのAPIキーは取得しているものとする。

# プロジェクトを作成する
AndroidStudioのNew ProjectからEmpty Compose Activityを選択し、プロジェクトを作成する。

# Google mapをAndroidで扱えるように設定する
Google maps platformの[Set up an Android Studio project](https://developers.google.com/maps/documentation/android-sdk/config)を参考に、以下の設定をしていく。

### moduleレベルのbuild.gradleに依存関係を追加
“`gradle
dependencies {
implementation ‘com.google.android.gms:play-services-maps:18.1.0’
// …
}
“`
バージョンは

元記事を表示

AndroidでVolleyを使った送信でcookieを使用する場合

# VolleyでCookieって・・・どうすんねん?
[AndroidでVolleyを使ってMultipart/form-data形式で送信してみる](https://qiita.com/cozyk100/items/927da723204f5c54a35b)でAndroidでVolleyを使ってHTTPでMultipart/form-data形式で送信する例を書きましたが、送信する相手がAPI形式で同時に認証もやってくれるならいいのですが、そうではない場合があります。

例えば、API形式のI/Fが全く用意されていないく、ブラウザからHTMLで送信する画面しか用意されていない場合があります。この場合、通常
1. ログイン
1. Multipart/form-data形式で送信
1. ログアウト

という流れになりますが1.でサーバ側からのレスポンスヘダーのset-cookieで払い出されたcookieをHTTPヘダーに設定して2.で送信しないと「ログインされていません」となります。

Volleyを使って1.、2.、3.で3回通信する場合、1.のレスポンスのset-cookieを2

元記事を表示

Cloudflare Tunnelを使ってAndroidに立てたWebサイトを外部公開できるか検証してみた

## はじめに

[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)はローカルに立てたサーバーを外部からアクセスできるようにするトンネリングサービスです。同じようなサービスに[ngrok](https://ngrok.com/)などがあります。今回はAndroidのTermuxに立てた.NETサーバーをCloudflare Tunnelを使って外部に公開できるか検証してみます。

## Cloudflare Tunnelがどのように動作するか

Cloudflare Tunnelは、[cloudflared](https://github.com/cloudflare/cloudflared)をインストールすることで動作します。cloudflaredは、近くのCloudflareデータセンターに対して長期間の接続を作ります。Cloudflareがドメインへのリクエストを受信すると、接続しているデータセンターにリクエストを中継します。中継されたリクエ

元記事を表示

複数のRecyclerView間での移動を含むドラッグドロップ並べ替え機能を実装する

一つのRecyclerViewの中でdrag&dropでの並べ替え機能は、ItemTouchHelperを利用すると簡単に実装することができます。

https://qiita.com/ryo_mm2d/items/973b056b52b111bb58d4

ただ、一つのRecyclerViewの中の並べ替えではなく、複数のRecyclerView間での項目移動もしたくなります。候補リストから取捨選択もできるような機能で見られる以下のような動きですね。

実装方法としてはいくつかあると思いますが、AndroidのDrag&Dropフレームワークを利用する方法で説明しようと思います。ドラッグ中の描画や、対象となるViewの判定処理などを実装する手間がいらないというメリットがありますが、本来想定されている使い方は、View間のD

元記事を表示

Composable FunctionからUIと状態を返す

どうも、こんにちはあみゅーです。
もうここ数年はずっとReactばかり書いています。

# はじめに
みなさん、大体Composable Functionを実装するときは新しいUI Componentを作成する目的で書いているのではないでしょうか。
しかし、 `remember` や `LaunchedEffect` などがComposable Functionとして提供されていることから分かる通り、特にUIに限って実装するものではありません。

今回はUIと状態を返すComposable Functionの実装と、適当なSampleを紹介していきます。

# UIと状態を返すComposable Function

“`kotlin
@Composable
fun Content() {
val (UI, 状態) = ComposableFunction()

UI()
}
“`

## ポイント入力UIの例
device-2022-12-27-181505.gif[Comopse]Coilを使ってString -> Bitmap -> Drawableに型変換する方法

## こんな時
– StringをどうしてもBitmapの形に変換したい時
– BitmapをどうしてもDrawableの形に変換したい時
– StringをどうしてもDrawableの形に変換したい時

## 前提
– Composable関数の中で書く
– coilを使うのでgradleに以下追加
“`
implementation(“io.coil-kt:coil-compose:2.1.0”)
“`

## コード
コルーチンの中で変換します。
以下は String -> Bitmap -> Drawableの順に変換してます。

“`
val myString = “画像URLとか”
val context = LocalContext.current

val coroutineScope = rememberCoroutineScope()
coroutineScope.launch{
val loader = ImageLoader(context)
val request = ImageRequest.Builder(context)
.data(myS

元記事を表示

JetpackComposeを利用して状態に寄らないアニメーションを実装する

こんにちは!
Life is Tech! 名古屋土曜日スクールでクラスマネージャーをしているカーキです。
本日、アドベントカレンダーの9日目を担当します。
普段はAndroidエンジニアとして、働いているのでAndroidに関するネタを投稿します。

## 概要

2年前にも[Androidでポヨンするアニメーション](https://qiita.com/Takarkiz/items/5af59902b042171d21dd)を実装する紹介をしたのですが、今回はその2022年版として、JetpackComposeだとどう実装をするのかを想定して紹介していきます。

具体的には、以下のプリン画像をタップして、ポヨヨンとアニメーションする動きを実装していきます。
![purin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82263/00665b37-45c1-6e47-e472-6915eb886098.png)

## ゴール
今回のゴールとしては、2年前に投稿した[Androidでポヨンするアニメ

元記事を表示

アプリの再表示時に生体認証を求める(Android10以下対応)

## はじめに

生体認証、便利に使っていますか?
Androidでは、セキュリティをより強固にしたいプロダクトでは、認証や操作の許可をするために生体認証を使うことが推奨されています。

今回はログインセッションの有効期限等によらず、アプリがタスク復帰した際に都度生体認証を求める動きを実装しました。

※生体認証そのものの処理は割愛しています。

## アプリ全体の構成について

私のアプリは1Activityで、その上にFragmentがスタックする形式です。
また、画面遷移にはNavigationComponentを使用しています。

## 仕様

– 複数画面があり、それぞれ画面遷移することができる。
– 先頭の画面はログイン画面で、認証が通ったあとはログイン画面に戻れない。戻るボタンやスワイプバックすると、ログイン画面には戻らずアプリが終了する(タスクにしまわれる)。
– 他アプリの割込時やタスクからの復帰時など、メモリ上にアプリが存在していたら(キルされていなければ)生体認証を求めて、認証OKだったら前に閲覧した画面が表示される
– ただしログイン画面だけは、タスク復帰したと

元記事を表示

OTHERカテゴリの最新記事