- 1. 【Android】 メディアの権限やアクセス方法について
- 2. 【Flutter】依存パッケージがエラーに対応していない場合に自力で対応する
- 3. 【Jetpack Compose】戻るボタン←をつける
- 4. Androidスマホ起動時に自動的にサービスを起動させる
- 5. 【Android】Retrofit2 で Kotlin Serialization を用いて変換を行う
- 6. スマホの気圧センサーと台風
- 7. スマートフォンのセットアップ手順
- 8. 【Jetpack Compose】OutlinedTextField 全体に対して onClick する方法
- 9. 不正なExtraを含んだIntentを受け取ったことによるクラッシュに対処する
- 10. 【Android Studio】辞書ファイルを設定してうるさいタイポ指摘にサヨナラする
- 11. Type Safety に Navigation Compose を使う場合、SavedStateHandle 経由で NavArg を受け取るときは typeMap を渡そう
- 12. テキストを装飾する -SpannableString-
- 13. 話題のkotlin Multiplatformを使ってみた(~実装まで)
- 14. android studioのstringResourceで頭に空白を入れる方法
- 15. 【AndroidStudio】日本語化手順まとめ
- 16. 【Unity】StreamingAssetsに配置したファイルをAndroidで実行時に読み込む
- 17. 【初心者向け】個人開発しているAndroidアプリでCIを回してみた【種族値クイズ】
- 18. Android クイック設定タイル開発 使える物を作ってみよう その1
- 19. ASUS ZenFone 2 Laserをバッテリレスで使用する
- 20. BroadcastReceiverでの非同期処理にはgoAsyncを使おう
【Android】 メディアの権限やアクセス方法について
## はじめに
Android側のメディア周りはOSアップデートごとに変更が入って対応が大変なイメージがあります。
最近で一番影響があったのはOS13のアップデートですかね。
OS13以上と未満でメディア領域にアクセスするための権限が異なり、対応していないと写真や動画をアプリに持って来れないといこともあったかもしれません。今回はメディア領域の権限・アクセス方法について整理していこうと思います。
## 写真や動画はどこに保存されるのか
そもそもの疑問ですが、カメラアプリ等で撮影した写真や動画はどこに保存されるのか気になり調べてみました。
Androidのストレージの仕様は大きく2つに分かれてそうで、写真や動画は「共有ストレージ」に保存されているようです。| ストレージ種別 | 内容 |
| – | – |
| アプリ固有のストレージ | ・アプリ専用のファイルを保存する場所
・他アプリからはアクセスできない |
| 共有ストレージ | ・カメラで撮った写真や動画、スクリーンショットなど、共有可能なメディア ファイルが保存される場所
・他アプリと共有することが可能
【Flutter】依存パッケージがエラーに対応していない場合に自力で対応する
## 今回の背景
Flutterで自作したアプリの Android Gradle Plugin (AGP) を最新のバージョンに更新しようと思い、7.x.x から 8.x.x にアップデートしました。すると、使用しているパッケージの`sound_mode`にて以下のエラーが発生し、アプリのビルドが通らなくなりました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985195/cc6f993f-eff6-df71-0077-953a2db4884f.png)
“`
Namespace not specified. Specify a namespace in the module’s build file:
“`自分のアプリ内でビルドエラーが発生している場合、通常は build.gradle に namespace を追加することで解決できます。しかし、今回のケースではパッケージ側のソースコードまで遡って修正する必要がありました。
“`groovy:android/build
【Jetpack Compose】戻るボタン←をつける
## 今回実装するもの
今回は一つ前の画面に戻るためのボタンを実装します。
前回の記事で観光地リストを表示するアプリに詳細画面を追加したのですが、その時に戻るボタンの実装を忘れて随分と不親切なアプリになってしまい、その反省として今回戻るボタンを追加します。
|Before|After|
|—|—|
|||## 前回の記事
詳細画面に画面遷移する機能の実装をしたときの記事です。https://qiita.com/jtakumi/items/395f17187df9228
Androidスマホ起動時に自動的にサービスを起動させる
以前、Androidのフォアグラウンドサービスを使って、位置情報を常に取得するサービスを作成しました。
[Androidのフォアグラウンドサービスで位置情報を取得する]( https://qiita.com/poruruba/items/aa02207080a390e1ac85)
今回は、これをCordovaプラグインにするとともに、Androidスマホ起動時にも自動的に起動するようにします。
ちなみに、この投稿は、以下の投稿の補足です。全ソースファイルは以下を参照してください。
[散歩ルート計画アプリを作った](https://qiita.com/poruruba/items/90d25395670f1bf5a5fe)# AndroidManifest.xml
Androidスマホの起動時に、OSから通知されるブロードキャストを受け取ることで、起動時の処理ができるようになります。
そのために、以下のパーミッションを付けておく必要があります。“`xml:AndroidManifest.xml
【Android】Retrofit2 で Kotlin Serialization を用いて変換を行う Retrofit2 で Kotlin Serialization を用いて変換を行う方法として、
Codelab では retrofit2-kotlinx-serialization-converter を使う方法が紹介されている。https://github.com/JakeWharton/retrofit2-kotlinx-serialization-converter
https://developer.android.com/codelabs/basic-android-kotlin-compose-getting-data-internet#7
## 手順
### Kotlin Serialization をモジュールに導入する。
モジュールの build.gradle.kts の `plugins` ブロックに次を追加する。
“`build.gradle.kts
id(“org.jetbrains.kotlin.plugin.serialization”) version “1.9.10”
“`モジュールの build.gradle.kts の
スマホの気圧センサーと台風
# はじめに
以前スマホのセンサーをPythonで操作するアプリをPlyerで作ってみたが、気圧センサーが本当に動作しているのか?がわからなかったが、ちょうど、今日台風7号がきていたので試してみた。# 気圧センサーのデータ取得
[PythonでAndroidスマホの各種センサー情報を取得する。](https://qiita.com/tapitapi/items/51ddefc1dd8e810430c8)barometer.pressureで取得。
“`python:Barometer
from plyer import barometer
#有効
barometer.enable()
#取得
output+=f’Barometer\n{barometer.pressure:0.2f} hPa\n\n’
“`# 結果
台風が近づくとどんどん気圧が下がっていく事がわかる。あらためて数値で見てみると面白い。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/221
スマートフォンのセットアップ手順
1. wifiに接続する
1. PCでパスワード共有用のlocalサーバーを立ち上げる serveなど
1. google もしくは appleのアカウントのID, passwordがわかるメモのファイルを 2. のサーバーから見られる状態に設定する
1. ログインする
1. 1passwordをダウンロードする
1. 1passwordにログインする
1. 各種サービスへログインする
【Jetpack Compose】OutlinedTextField 全体に対して onClick する方法
# 完成形(OutlinedTextField をクリックすると日付選択ができるようにする)
![OutlinedTextFieldAndDatePicker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1630025/053364ae-08ca-4287-325c-338e56bc4096.gif)
– 日付を選択すると OutlinedTextField の値を変更する
– 日付選択はダイアログから行う
– テキスト入力はさせない
– 日付選択のダイアログを閉じると OutlinedTextField のフォーカスを外す# 実装
## OutlinedTextFiled 全体を選択可能にする
【NG】 Modifier.fillMaxWidth().clickable(onClick)
“`kotlin
OutlinedTextField(
modifier = Modifier
不正なExtraを含んだIntentを受け取ったことによるクラッシュに対処する
Androidアプリは、外部からIntentを受け取ることによって起動します。IntentにはExtrasという任意の引数を渡す仕組みがあり、多くのアプリで利用されています。しかし、Extrasに不適切な情報が含まれている場合、アプリが容易にクラッシュしてしまうことはあまり知られていないかもしれません。Extraを読み出している場合や、明示的にExtraを扱っていなくても、SavedStateHandleを受け取るViewModelを扱っている場合は注意が必要です。
例えば、アプリAのonCreateで以下のようにExtraを読み出しているとします。
“`kotlin:アプリA
val data = intent.getStringExtra(“hoge”)
“`このアプリAを、アプリBから次のように起動させてみます。
“`kotlin:アプリB
val intent = Intent()
intent.setClassName(“com.example.myapplication”, “com.example.myapplication.MainActivity”)
【Android Studio】辞書ファイルを設定してうるさいタイポ指摘にサヨナラする
## 概要
オリジナルのアプリを作っていたりすると、コード中にオリジナルの言葉が登場することは多々あると思います。
ですがAndroid Studioは親切なので、そういった言葉も~~余計なことに~~ご丁寧にタイポ指摘してくれます。アプリ自体に影響があるわけではないのでそのままでも全然問題ないのですが、何か気持ち悪い!となるのでこれが出ないようにします。
## 対処法
### 1. Android Studioの設定で対処
以下の画像のように、設定のSpellingで指摘しないでほしいワードを追加します。
個人で進めているプロジェクトならこれで必要十分だと思います。![スクリーンショット 2024-08-15 15.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724617/41a81fab-c872-ee74-5812-3dafa8f475e4.png)
### 2. spellチェック自体外してしまう
設定 -> Inspections -> Typoの部分のチェッ
Type Safety に Navigation Compose を使う場合、SavedStateHandle 経由で NavArg を受け取るときは typeMap を渡そう
# 結論
**Type Safety に Navigation Compose を使う場合、SavedStateHandle 経由で NavArg を受け取るときは `typeMap` を渡しましょう!**
Type Safe な Navigation Compose に関するドキュメントはこちら 👇
[Type safety in Kotlin DSL and Navigation Compose](https://developer.android.com/guide/navigation/design/type-safety)# ハマっていたこと
NavGraph を定義するとき、`typeMap` を渡しているのにアプリがランタイムで落ちる事象が発生しました。
具体的には次のエラーメッセージを確認しました。
“`text
java.lang.IllegalArgumentException: Cannot cast page of type XXX to a NavType. Make sure to provide custom NavType for thi
テキストを装飾する -SpannableString-
# SpannableStringとは?
### 概要
・文字列にさまざまな装飾やスタイル設定を行えるようにするためのもの
・一つの文字列に対して複数のスタイルを適用させることができる## 注意点
・例として掲載しているコードはViewBindingを使用しています
(変数`b`として定義しています)## 主な種類
|クラス名|概要|
|:-:|:-:|
|ForgroundColorSpan|テキストの色を変更する|
|BackgroundColorSpan |テキストの背景色を変更する |
|StyleSpan|テキストを太文字やイタリックにする |
|TypefaceSpan |指定フォントを適用する |
|RelativeSizeSpan |テキストのサイズを相対的に変更する |
|AbsoluteSizeSpan |テキストのサイズを絶対値で変更する |
|URLSpan |テキストをリンクにする |
|UnderlineSpan |テキストに下線を引く |
|StrikethroughSpan |テキス
話題のkotlin Multiplatformを使ってみた(~実装まで)
# はじめに
基本、公式のチュートリアルをなぞってます。
https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html公式チュートリアルは全文英語の記事となっているので、英語苦手だよーって方とかは参考にしていただけると幸いです。
いままでアプリ開発とかをしてこなかった方でも理解できるよう、深くまでは掘らず比較的ざっくりとした感じの記事構成となっていますので、あらかじめご了承ください。
# 前提
– kotlin multiplatformの環境構築が完了していること
https://qiita.com/atsu123456789/items/147e9e03d2018b20841b# ロジックの実装
## 共通処理について
まずは`GreetingKMP/composeApp/src/commonMain/kotlin/com/jetbrains/greeting/Greeting.kt`の中身を書き換えてみます。“`Greeting.kt
package com.jetbrains.
android studioのstringResourceで頭に空白を入れる方法
# 初めに
今回はandroid実装でStringResourceを使う際、頭に空白を有効にする方法を紹介します
### 本文
定義したい文言の頭に下記を追加することで半角の空白を追加することができます
\u0020
### さいごに
今回は自分が実装していて少し手間取ったので備忘録として残しておきます
【AndroidStudio】日本語化手順まとめ
# はじめに
みなさん慣れていればAndroidStudioインストールしてそのまま使用することが多いかと思います。
ですが、初学者の方や英語が弱い方などは、英語というだけで萎縮してしまうもの。
そこで今回は入門編として、AndroidStudioを日本語化する手順をまとめてみようと思います。# 日本語化手順
実はJetBrainsのマーケットに日本語化プラグインが公開されています。
今回はそのプラグインを使用して日本語化してみます。まずはご利用のAndroidStudioのバージョンを確認しましょう。
“`
Android Studio Koala | 2024.1.1
Build #AI-241.15989.150.2411.11948838, built on June 11, 2024
“`確認できたら次に、以下リンクより該当のプラグインページを参照します。
https://plugins.jetbrains.com/plugin/13964-japanese-language-pack——/versions
上記リンクより適切なプラグインを導入し
【Unity】StreamingAssetsに配置したファイルをAndroidで実行時に読み込む
# はじめに
想定読者様はこちらです。
– StreamingAssets(ストリーミングアセッツ)に配置したファイルをAndroidビルド時に使用したいお方
– 具体的にどのような仕組みでAndroid実行時に読み込んでいるのか知りたいお方調べてみたところ方法は書いてあっても順序を追って仕組みを説明してくださる方は見かけなかったので確認の意味合いも込めて仕組みについても言及させていただきます。
:::note warn
**折りたたみ**
折りたたみになっている個所は自身の解釈を織り交ぜて解説をしております。
間違い等のご指摘は大変に歓迎しておりますのでお時間のある方はぜひお願いいたします。
:::# 実装
解説するに際してこのようなものを作成してみました。
“`C#:StreamingAssetsPathFormatter.cs
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using Cysharp.Threa
【初心者向け】個人開発しているAndroidアプリでCIを回してみた【種族値クイズ】
# はじめに
最近、自分の個人開発をしているプロジェクトでCIを回せるようにしました。
リリースしたアプリがこちらです。ポケモン好きな人にはぜひ使ってみて欲しいです
最近100インストールを超えました!🎉 嬉しい。。https://play.google.com/store/apps/details?id=com.nagumoapps.pokemonstatsquiz&hl=ja
CIを回せるようにしようと思った経緯や学びについてまとめておこうと思います。
# この記事の対象者
– CI/CDに興味がある人
– アプリ開発初心者# CIとは
CIとは、Continuous Integrationの略で、日本語では継続的インテグレーションと言われます。
主に開発の中で、静的解析、ビルド、テストなどの工程を自動化することを指します。
また、CD(継続的デプロイ)と合わせてCI/CDとして使われることも多いです。
CDも名前の通り、本番環境やテスト環境へのデプロイを自動化することです。CI/CDを実現することで、品質の確保とリリースサイクルにかかる時間の削減ができるようになる
Android クイック設定タイル開発 使える物を作ってみよう その1
# はじめに
– [こちら](https://qiita.com/stranger396/items/d001172004755cd8c65a)の記事で紹介した、最小限タイルをカスタマイズしていきます。
:::note warn
この記事は、断片的に役立つ人間もいるだろうとの考えの下、「筆者の筆者による筆者のためのタイル」の開発過程を共有するものです。
:::# 完成イメージ
– タップしたときにダイアログが表示され、ディスプレイの輝度を数パターンから選んで変更するタイルを目標とします。
– イメージが近いのは、インターネットの設定を行うタイルです。それのダイアログで選択するものがWiFiアクセスポイントではなくディスプレイ輝度になっているようなものをイメージしています。# 本記事の範囲
– ユーザーがタイルをタップしたときに、あらかじめ決められたディスプレイ輝度に変更するところまでを実験します。# 手順
1. AndroidManifest.xmlにて、システム設定の変更権限を要求します。
1. TileServiceを継承したクラスの*onClick*にタップしたときの
ASUS ZenFone 2 Laserをバッテリレスで使用する
### 背景
ASUS ZenFone 2 Laserのバッテリは交換可能なバッテリなのですが、バッテリが妊娠して使い物にならなくなって新規に購入する気もなく放置していました。このたび、USB充電器から直接配線して復活させたのでそのメモです。### 回路は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/e0af6701-c2ca-d23e-a2ce-17a7bb2c4c42.png)### 用意したダイオード
・整流用ダイオード 100V 2A PS2010R(秋月電子で10個80円のもの)
### 整流用ダイオードを入れている理由
・バッテリ電圧が定格3.85VのためUSB充電器(5.0V)の電圧を下がるため
・スマホ本体にPCとのUSBケーブルをつないだ時逆流しないようにするため
の2点です。スマホの内臓バッテリの定格電圧が3.85Vでした。ダイオードのデータシート(仕様)をみると順方向での消費電圧は0.6V-1.2V(1A)、200mA時0.
BroadcastReceiverでの非同期処理にはgoAsyncを使おう
Jetpack Glanceを調べていたら、非常に優れたコードを発見したので紹介します。
`goAsync`という拡張関数です。なぜこれがinternalなんでしょう?知見の詰まった素晴らしいコードです。https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:glance/glance-appwidget/src/main/java/androidx/glance/appwidget/CoroutineBroadcastReceiver.kt
“`CoroutineBroadcastReceiver.kt
internal fun BroadcastReceiver.goAsync(
coroutineContext: CoroutineContext = Dispatchers.Default,
block: suspend CoroutineScope.() -> Unit,
) {
val coroutineScope = CoroutineScope(