- 1. ComposeでMarkdownを表示するには
- 2. オレオレステータスボードを作ってみた
- 3. screenWidthDpをpxに変換すると値が小さくなります。
- 4. メモ:P20liteリカバリーなどの入り方
- 5. 【Android】Contextって何者なん?~Activity Context編~
- 6. ダークモード対応する際の見積もり手法
- 7. material3.ModalBottomSheetの使い方とTips・トラブルシューティング
- 8. Androidでメディア再生の問題を調べる
- 9. Next.js Native使ってみた
- 10. Androidエミュレーターの通信をBurp Suiteで取得する
- 11. [Jetpack Compose] scrollStateに連動したScrollBarの実装
- 12. [Android] Contextって何者なん?~Application Context編~
- 13. JetpackComposeのHorizontalPagerを使ってみた。
- 14. 複雑なDeepLinkをJetpackComposeで実装するPart4
- 15. 【Android】Bluetoothについてのメモ
- 16. AndroidStudioのlogcatを見やすくする方法
- 17. 無関心な ViewModel
- 18. 【体験記】私がモバイルエンジニアを続ける理由
- 19. スマホアプリ開発を始めたい自分がMacBook Pro 14インチ(M3 PRO)を選んだ理由
- 20. 恥ずかしがり屋の ViewModel
ComposeでMarkdownを表示するには
# 初めに
[ポート株式会社 サービス開発部 Advent Calendar 2023](https://adventar.org/calendars/9156) 5日目の記事です。
![スクリーンショット 2023-12-05 11.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179470/427216d2-62b6-76b6-24da-c30f9ded8b7a.png)
こんにちは。[ポート株式会社](https://www.theport.jp)でAndroid開発をしている[shxun6934](https://twitter.com/shxun6934)です。
自分が担当しているプロジェクトにJetpack Composeを入れて1年が経ちました。(早いw)
新規機能を作成する際に、Jetpack Composeを使用してガンガン開発を進めています。その新規機能を作成するタスクの中で、WebのAPIのデータからmarkdownの文字列を取得し、そのデータを表示する要件
オレオレステータスボードを作ってみた
# 前書き
研究室に置いてあった去年のカレンダーとその後ろに付いてあった「外出」「テレワーク」などのステータスボードを発見した僕。そのボードを活用していたが、「テレワークと決めても遠隔で操作できないと意味ないのでは?」と思い始め、Web上で操作できるステータスボードの作成を決意する。これが、この物語の始まりである。# 使用技術選定
## ステータスボードに使用するハードウェア
### ESP32(却下)
WiFi接続マイコンのド定番であるESP32。最初はこれを採用し、手作り感満載のステータスボードを作ろうとしたが、思いもよらぬ壁をぶつかる。なんと、大学のWiFi認証は単なるパスワード認証ではないため、普通にESP32だけでは接続が困難であることが発覚したのだ。
そのため、電子工作オタクである僕もこの案は諦めることにした。### Amazon Fire 7(採用)
そうなると次はやはり安物のAndroidタブレットを検討することとなる。WiFi認証も問題なく突破できる上、最近はコスパの良いモデルもたくさん登場している。しかし、ずっとつけっぱなしにしておくので、ある程度検証された
screenWidthDpをpxに変換すると値が小さくなります。
以下のスライドを記事に書き起こしたものです。
## 結論
画面幅をpxの単位で欲しいときは、Configuration.screenWidthDpをpxに変換すると正確な値が取れません。
BoxWithConstraintsScope.maxWidthにtoPxをかけたもの、またはResources.getSystem().displayMetrics.widthを使いましょう。## 前提知識
dp、px、dpiの知識がある方がより理解しやすいので、以下の記事などをみてみるといいかもしれません。
https://qiita.com/nein37/items/0a92556a80c6c14503b2## screenWidthDpについて
dp単位で表示可能な画面領域の幅のことです。(WindowInsetを除いた値)
取得方法は以下の二つです。Resources.getSystem().configuration.screenWidthDp
メモ:P20liteリカバリーなどの入り方
# 書き始めた理由
自分が操作方法を忘れるから。
普通に間違ってるかもしれないので完全にはあてにしないでください。# 注意
この中のいくつかの方法はbootloader unock時に有効です。
BLUの方法はいろいろありますが、この機種の場合は[PotatoNV](https://github.com/mashed-potatoes/PotatoNV)がおすすめです。## fastboot
PCに接続した状態で電源ボタン+音量DOWN## eRecovery
PCに接続していない状態で電源を切り、PCに接続した後電源を付け、その後音量UPを3秒押し## カスタムリカバリ
PCに接続していない状態で電源ボタン+音量UP
【Android】Contextって何者なん?~Activity Context編~
これは、アドベントカレンダーの2日目の続きになります。
そちらがまだの方は、2日目を先に読んでいただけると幸いです。
https://qiita.com/minomusi/items/78693966e99f05af3e00それでは行きましょう!:writing_hand:
## Activity Context
これは、その名前の通り**Activity**に依存したContextになります。
よってActivityのライフサイクルにより発生、消滅します。
これが重要な観点になります。## Contextの誤用によるメモリリーク
contextの寿命と使用箇所の寿命を考えた時に、
context > 使用箇所の関係になっていると、メモリリークが発生してしまう可能性があります。具体的には、シングルトンなどのインスタンスでActivity Contextを渡した場合などが考えられます。
上記の場合などは、Application Contextを使用するようにしましょう。## Contextの使い分け関する私の考え
基本的に迷ったら、Application Context
ダークモード対応する際の見積もり手法
## 挨拶
こんにちは、ソーシャル経済メディア「NewsPicks」のモバイルアプリチームでAndroidを担当していますsefwgweoです。
この記事は NewsPicks アドベントカレンダー 2023 の4日目の記事です。
## 概要
今年、Android版Newspicksのダークモードを半年がかりでリリースした時にどのようにして見積もったかを実例をまじえて振り返ろうと思います
デザイナチームによるまとめは[こちら](https://note.com/akanyoshi/n/na18930c1808f)
iOSは本プロジェクトでモバイルチームとして陣頭指揮をとってくれた[@_asa08_](https://qiita.com/_asa08_)さんが後日記載予定ですのでお楽しみに!
## 前提
Android版Newspicksは10年以上サービスが続いているため、見積もる際以下な問題をはらんでいました
– 画面数が多い
– 機能数が多い
– 仕様が複雑## 見積もり方法
### 見積もる単位は1画面毎前提にあるように、そもそも対応が必要な画面数がとても多
material3.ModalBottomSheetの使い方とTips・トラブルシューティング
Android Advent Calendar 2023の4日目の記事です。
昨年は、`androidx.compose.material` の `ModalBottomSheetLayout` に関する記事を投稿したのですが、今年は `androidx.compose.material3` でも `ModalBottomSheet` が提供されるようになりました。Material3になり、コンポーネントの使い方自体が `ModalBottomSheetLayout` とは異なる形に変更されています。
昨年の記事: [ModalBottomSheetLayoutの使い方とTips・トラブルシューティング](https://qiita.com/ntsk/items/29d22763dd0234bc9150)
本記事では、昨年の記事の続きとして `material3.ModalBottomSheet` の使い方やTips・トラブルシューティングについて紹介します。
※ 本記事の内容は、`androidx.compose.material3:material3-*:1.2.0-alp
Androidでメディア再生の問題を調べる
xperia5v(Android 13)でYoutubeやYoutube music,Spotifyなど音楽・動画などアプリを問わずメディアの再生が突然一時停止する問題が起きたので状況を調べてみる
メモリ不足によるタスクキルという線も考えていたんですけど発生条件がランダムでフォアグラウンドやバックグラウンド関係なく、ロック中であろうがなかろうが状況を問わず発生するため少し違う感じ。
原因もわからずちまちま聞いてる音楽や動画を止められるのはストレスがたまるのでじっくり調べたところAndroidでは[音声フォーカス](https://source.android.com/docs/devices/automotive/audio/audio-focus)という仕組みで音声の操作を行っている様子。
今回はadbでコマンドでこの音声フォーカスの状況を調べてみて、原因となる情報を探る話です。
# 調査方法
USBデバッグなどで問題の端末にadbを実行できるようにして、以下のコマンドでオーディオ周りのダンプデータを取得します。
“`bash
adb shell dumpsys audio
Next.js Native使ってみた
# Next.js Nativeってなんぞや❓
[Capacitor](https://capacitorjs.jp/docs) と呼ばれるwebアプリをクロスプラットフォーム化するライブラリを使って、
Next.jsをネイティブアプリ化できるようにしたものみたい👀https://nextjs-native.com/
Githubにてスターターキットも用意されてたので、これを試す
https://github.com/RobSchilderr/nextjs-native-starterとりあえず、Githubからクローン
“`bash
$ git clone git@github.com:RobSchilderr/nextjs-native-starter.git
Cloning into ‘nextjs-native-starter’…
remote: Enumerating objects: 3127, done.
remote: Counting objects: 100% (747/747), done.
remote: Compressing objects
Androidエミュレーターの通信をBurp Suiteで取得する
エミュレーターの通信を Burp Suite で取りたかったので、手順を簡単にまとめます。
手順として下記2つの方法があります。
* [ポート転送を利用する方法](#ポート転送を利用する方法)
* [仮想ネットワークのIPを指定する方法](#仮想ネットワークのipを指定する方法)## 検証環境
* macOS Monterey 12.7.1
* Android 12.0 Google APIs (API 31) ※root が使用できるもの
* Burp Suite Professional v2023.10.3.6## ポート転送を利用する方法
複数起動している場合は、適宜 `adb -s [デバイスID]` を指定してください。
### 手順
1. Android エミュレーターを起動する
1. Burpを `Loopback Only (127.0.0.1)`、`8080` ポートで開始する
1. Androidエミュレーターのプロキシ設定をする ( iptables または Wi-Fi の Proxy 設定)
1. エミュレーターからホスト側へポート転送を
[Jetpack Compose] scrollStateに連動したScrollBarの実装
この記事はand factory.inc Advent Calendar 2023 4日目の記事です。
昨日は @ichikawa7ss さんの「既存プロジェクトへのデザインシステム導入の取り組み」でした。## はじめに
Jetpack Composeで、Android ViewのようなScrollBarを表示する標準のComposeは用意されておらず、自分で実装する必要があります。この記事では、scrollStateに連動して表示されるScrollBarの実装を紹介します。
:::note warn
LazyListStateに対応したScrollBarも別途自分で作る必要がありますが、この記事では紹介しません。LazyListのほうが作るのは難しい印象です😅
:::## 動き
![adbeem-20231203194316.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166629/f662a9c2-ca15-3191-5e7e-bd259078f2d6.gif)
## Scroll
[Android] Contextって何者なん?~Application Context編~
## Contextって何者?
Androidではよく引数にcontextを渡すことがあります。(画面遷移のintent作成時など。)
私もAndroidアプリを開発を始めた際に、疑問に思ったことがあります。
ですので、今回はこの**Context**に注目してみようと思います。## 大まかに2種類あるContext
実はAndroidにおけるContextは大きく分けて以下の2種類があります。
1. Application Context
1. Activity Context今回は**Application Context**について考えてみて、明日Activity Contextについて記載したいと思います。
## Contextとは
まず、公式サイトの内容を見てみたいと思います。
https://developer.android.com/reference/android/content/Context
>Interface to global information about an application environment. This is an abs
JetpackComposeのHorizontalPagerを使ってみた。
今回はHorizontalPagerを使用してみました。
今回は下記1.4.0での実装方法です。
“`
“androidx.compose.foundation:foundation:1.4.0”
“`# サンプルコード
“`HorizontalPagerSample.kt
const val PAGE = 3
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun HorizontalPagerSample() {
val pagerState = rememberPagerState(initialPage = 0)
Box(
modifier = Modifier.fillMaxSize()
) {
HorizontalPager(
state = pagerState,
pageCount = PAGE
) { page ->
Column(
複雑なDeepLinkをJetpackComposeで実装するPart4
# はじめに
今回は、複雑なDeepLinkが来たときやDeepLinkの内容によってホーム画面で出しわけないといけない時の実装を紹介していきます### 本文
最後はMainNavGraphの実装です。
“`kotlin:MainNavGraph
@Composable
fun MainNavGraph(
navController: NavHostController,
// sealdClassでどの画面に遷移するのかを引数でもらいます
navigateScreenType: NavigateScreenType,
) {
// 何もNavGraphをセットしてない状態でゲットを呼ぶとExceptionが帰ってくるので、その時は何もリンクがなかったとしてホーム画面を表示するのみにします
val startDestination = try {
// ホーム画面で表示するダイアログ等がDeepLinkにあるときはNavGraph自体を更新しないとホーム画面に変更が通知されないので強制的にNavGraphを変更します
if
【Android】Bluetoothについてのメモ
#
Android Bluetooth API を介した Bluetooth 機能へのアクセスが可能で、
Androidでは他のBluetooth端末とワイヤレスでデータの交換ができます。
具体的にできることは以下です。* 他の Bluetooth 端末をスキャンする
* ペア設定された Bluetooth 端末のローカル Bluetooth アダプタを問い合わせる
* RFCOMM チャンネルを確立する
* Service Discovery を使用して他の端末に接続する
* 他の端末とデータを送受信する
* 複数の接続を管理する# Permission
開発の中でBluetoothを使用するには パーミッションの許可が必要で
AndroidManifestに“`
AndroidStudioのlogcatを見やすくする方法
# 概要
AndroidStuioを最新版にアップグレードしたところ、logcatが見にくくなった。
![スクリーンショット 2023-12-03 10.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183689/bd1c86e5-152c-bece-09c9-5fcf652b195b.png)
「com…ew.rebuildingsagaanotherstory」の表示などが出るようになり、元々表示したいログが改行されてしまう。(元々のlogcat設定が消えてしまったからかも)
# 解決方法
Logcatの以下のアイコンをクリックする。![スクリーンショット 2023-12-03 11.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183689/e4c35a19-c107-5917-5c36-fede4a9d6547.png)
デフォルトで「StandardView」にチェックが入って
無関心な ViewModel
この記事は [Android Advent Calendar 2023](https://qiita.com/advent-calendar/2023/android) 3日目の記事です。
Android Developers ガイドの下記の図で示されるように UI Layer である ViewModel から直接 Data Layer への関心をなくしたいです。 ViewModel から Data Layer へのアクセスは Domain Layer に任せます。
https://developer.android.com/topic/architec
【体験記】私がモバイルエンジニアを続ける理由
こちらはアドベントカレンダーの2日目です。
まだ1日目の内容を見てない方はこちらを先にご確認いただけると幸いです!
https://qiita.com/minomusi/items/2e256e441654889bbbbdそれでは始めます:smiley:
## エンジニアを続けるか悩んだ数年とそこから
1日目の記事の最後に記載しましたが、私が新人の時は全く役に立たない新人だったなぁ〜と今考えると思います。そんなこんなで1年、2年とエンジニアの仕事をし続けていた毎日ですが、常に「自分はエンジニアでずっと食べていくのだろうか?」、「向いてないのではないか?」ということを考えていた日々でした。
しかし、面白いことに最初は全くわからなかったモバイルアプリの開発ですが、2年もほぼ毎日してると少しずつですがわかるようになり思っていることを実現もできるようになって行きました。
(上司、先輩、同期などの支えが多くあったのは事実です。私一人の力では絶対に無理でした。)そして3年目で初めて、携わっていたAndroidアプリの技術責任者をすることになります。
## モバイルアプリ超楽し〜
3
スマホアプリ開発を始めたい自分がMacBook Pro 14インチ(M3 PRO)を選んだ理由
初投稿です。
これまで組み込みやWindows開発を経験してきましたが、ふと副業でスマホアプリ開発をやってみたい!と思い立ち開発用にMacを購入することになりました。
この記事では
* なぜMacなのか?
* なぜBookなのか?
* なぜM3 PROなのか?について私なりに考えたことをご紹介します。
ベンチマークやレビューは既にたくさん記事があると思うので、この記事では初心者の視点で選ぶ際に考えたことを書いてみます。似たような境遇の方がいらっしゃれば少しでも参考になれば幸いです。
## 購入したモデル
私が購入したのはMacBook Pro 14インチ(Late 2023, M3 PRO)です。* プロセッサ: M3 PRO(11コアCPU, 14コアGPU)
* RAM: 18GB
* SSD: 1TBプロセッサ、RAMはM3 PROとしては最低構成、SSDは最低構成の512GBからアップグレードしました。
M2世代と比べるとM3とM3 MAXの進化が目覚ましかったため、やや影の薄い感のあるM3 PROですが、個人的にはコスパは決して悪くないように思っていま
恥ずかしがり屋の ViewModel
この記事は [Android Advent Calendar 2023](https://qiita.com/advent-calendar/2023/android) 2日目の記事です。
恥ずかしがり屋の ViewModel ということで property を公開しすぎないようにしたいです。
[1日目](https://qiita.com/ykws/items/a418572adffc8192ef30)に続き Android Developers でガイドで示されているサンプルからコードを抜粋して紹介します。
https://developer.android.com/topic/architecture/ui-layer#samples
## Good
`StateFlow` を公開するのがシンプルでわかりやすいです。
“`kotlin
private val _state = MutableStateFlow(HomeViewState())val state: StateFlow
g