- 1. targetSdkVersion 33 対応でやったこと
- 2. ARサンプルアプリ
- 3. AndroidのOutOfMemoryErrorと出会ったときに試したこと
- 4. 【Flutter】AndroidのAPKビルドがgradleやAndroid 12のエラーがでて出来ない問題の解決策
- 5. 寝坊で信頼を失う前に……400円で買える保険
- 6. DroidKaigi 2022のsettings.gradle.ktsを読んでみて、わからなかったことのメモ
- 7. Flutter M1 Mac环境配置
- 8. AndroidのWebViewで、画面回転した後にフォーカスを当ててもソフトウェアキーボードが表示されない不具合に対する回避策
- 9. MVVM+CoroutineFlowのUnitテストを書く(準備編)
- 10. Jetpack ComposeでOSのアラーム設定を開きたい
- 11. DatePickerDialogで日付選択 + 曜日表示 | Kotlin
- 12. コンポーザブルのテストを爆速にする方法
- 13. androidxで見るMetadataHolderとはなんぞや
- 14. [Android]Jetpack ComposeのComposableのModifierを条件によって切り替えたい
- 15. Android Studio を Electric Eel にアップデートしたときにやったこと
- 16. HTMLのパースにjsoupを使って見た
- 17. Playground 環境を導入して機能開発を爆速にする
- 18. Android Studio Electric Eelで導入された新機能「App Quality Insights」を使ってみよう
- 19. 独学のプログラミングのヒント
- 20. [Android][Jetpack Compose]You cannot access the NavBackStackEntry’s ViewModels after the NavBackStackEntry is destroyed.
targetSdkVersion 33 対応でやったこと
# 概要
[Android Studio を Electric Eel にアップデートしたときにやったこと – Qiita](https://qiita.com/koichi-ozaki/items/79d5cba03eaa3eb14f85)
こちらの対応を行うときに `targetSdkVersion 33` へ上げたので対応した内容を記載する。
# やったこと
– compileSdkVersion 更新
“`diff_gradle:app/build.gradle
– compileSdkVersion 31
+ compileSdkVersion 33
“`– targetSdkVersion 更新
“`diff_gradle:app/build.gradle
– targetSdkVersion 31
+ targetSdkVersion 33
“`– plugin の書き方変更(変更する必要なかったかも)
“`diff_gradle:app/build.gradle
-apply plugin: ‘co
ARサンプルアプリ
https://github.com/iwata-koji/AR_Sample
AndroidのOutOfMemoryErrorと出会ったときに試したこと
メモです
Android7.X系の高齢者向けスマホで
で生成したAnimatableなDrawableResourceをImageViewに設定しようとしたときに出会いました。
特定の画像だけが極端に重い(といっても通常の端末なら耐えうる)といったケースでした。
`android:largeHeap=”true”` は元々指定されていました。# 試したこと1 画像を解放して続行
catchして握り潰す
OutOfMemoryErrorはExceptionを継承したクラスではないのでExceptionでまとめてcatchしようとしてもできない“`kotlin
try {
imageView.setImageResource(animatable)
} catch(e: OutOfMemoryError) {
imageView.setImageDrawable(null)
return
}
“`
重い画像を解放してやって続行。アニメーションは表示させないことになる。
OOMが実際に出るまでに数秒は操作できない時間が発生
【Flutter】AndroidのAPKビルドがgradleやAndroid 12のエラーがでて出来ない問題の解決策
Android StadioでFlutterのAndroidアプリビルドがうまくいかなかった問題を有志の記事などを参考にしたところ解決することが出来ましたので、やり方を紹介したいと思います。
### エラー1
What went wrong:
Execution failed for task ‘:app:lintVitalRelease’.
> Could not resolve all artifacts for configuration ‘:flutter_local_notifications:debugUnitTestRuntimeClasspath’.
> Failed to transform bcprov-jdk15on-1.68.jar (org.bouncycastle:bcprov-jdk15on:1.68) to match attributes {artifactType=processed-jar, org.gradle.category=library, org.gradle.libraryelements=ja
寝坊で信頼を失う前に……400円で買える保険
`※この記事は寝坊を防ぐ対策について言及するものではありません。`
寝坊をする理由は様々で、目覚ましのかけ忘れ・夜更かし・不眠・体調不良・二度寝・飲酒等等……
生活習慣の改善である程度解消できるものもありますが、どうしても意識がない睡眠状態では100%しないと言い切れるものでもありません。そのくせ社会人としての評価に寝坊は大打撃を与えます。
※自分が所属しているSES会社では客先評価と勤怠の比重が50:50程です。体調不良で遅刻するという連絡さえできればそこまで大きなマイナス評価にはならないのですが、
寝坊のどうしようもなさは、連絡ができないところにあります。そこで、設定した時刻までにスマートフォンを操作しなかった場合に、勤怠メールを送信する仕組みを考えました。
以下はAndroidアプリとなるため、iPhoneユーザーは利用できません。**用意するもの**
・[Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&hl=ja&gl=US)・・・Andr
DroidKaigi 2022のsettings.gradle.ktsを読んでみて、わからなかったことのメモ
# はじめに
DroidKaigi 2022のリポジトリの**settings.gradle.kts**を読んでいました。
https://github.com/DroidKaigi/conference-app-2022/blob/main/settings.gradle.kts
普段シングルプロジェクトで開発を行なっている場合には出会わないようなブロックやメソッドが散りばめられていて、gradle初心者にはかなりの圧迫感がありました。
そこで、自分のメモとして**settings.gradle.kts**に登場する各ブロックやメソッドの意味などをまとめてみました。
参考程度にお読みいただけたら幸いです。
# build.gradleとは
**build.gradle**にはビルドの内容がGroovy言語によって記述されています。
ビルドの内容とは、依存関係や依存関係の解決に使われるMavenなどのリポジトリのことを指します。# settings.gradleとは
**settings.gradle**は、Gradleによって自動的に生成されるファイルです。
この
Flutter M1 Mac环境配置
# はじめに
– Flutter 公式からも環境設定の説明を用意していますが、実際に着手してみると、初めてなので色々トラブルが発生しました。
– 本記事では 、私が踏んだ落穴を経験として、M1 Macbook をターゲットに導入中の注意点と導入順番を改善しました。
– M1 Macbook であれば、公式より本記事の方が詳しくてわかりやすいと思っています。# Rosetta 2(SUDO命令)
– Apple Silicon Mac に Flutter を 導入する場合 Rosetta(ロゼッタ)が必要です。
ターミナルを開き、下記のコマンドで Rosetta 2 を導入します。> Rosetta(ロゼッタ)とは ?
>
> Rosetta(ロゼッタ)は、特定のアーキテクチャのプログラムコードを持つバイナリを、別のアーキテクチャに適宜変換 (en:Dynamic recompilation) することでバイナリの互換性を維持する Apple の技術。“`
sudo softwareupdate –install-rosetta –agree-to-licens
AndroidのWebViewで、画面回転した後にフォーカスを当ててもソフトウェアキーボードが表示されない不具合に対する回避策
# 要件
Androidで以下のような要件がありました。– WebView画面
– 縦画面でコメントが入力できる
– WebChromeClientから受け取ったView(動画)を全画面(横画面)で表示する# 不具合
この時特定の端末で
「画面回転をした後に、WebView内の入力欄にフォーカスを当てても、ソフトウェアキーボードが表示されない」
という症状がありました。# 再現手順
– 該当の画面に遷移する
– WebView内の動画を最大化して、横画面で表示する
– 縦画面に戻す
– WebView内のテキスト入力欄にフォーカスしても、ソフトウェアキーボードが表示されない# 修正方法
回避策として、以下の実装を行いました。
“`kotlin WebViewActivity.kt
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
webView.clearFocus()
webView.r
MVVM+CoroutineFlowのUnitテストを書く(準備編)
## はじめに
ついにUnitテストと真面目に向き合う時がやってきたので、採択技術や書き方をメモしておく。## 採択したもの
– JUnit4
– Mockk
– Truth(Googleが出しているアサーションライブラリ)↓kts化してない人は読み替えてください
“`build.gradle.kts(app)
// test
testImplementation(“junit:junit:4.13.2”)
testRuntimeOnly(“org.junit.vintage:junit-vintage-engine:5.8.2”)
androidTestImplementation(“androidx.test.ext:junit:1.1.5”)
androidTestImplementation(“androidx.test.espresso:espresso-core:3.5.1”)
testImplementation(“io.mockk:mockk:1.12.5”)
testImplementation(“co
Jetpack ComposeでOSのアラーム設定を開きたい
参考
==
https://developer.android.com/reference/android/provider/AlarmClock#ACTION_SHOW_ALARMS`AlarmClock.ACTION_SHOW_ALARMS`
というActionでIntentを作成してstartActivityコード
==
“`kotlin
import android.content.Intent
import android.provider.AlarmClock
..
省略
..
val context = LocalContext.current
context.startActivity(Intent(AlarmClock.ACTION_SHOW_ALARMS))“`
DatePickerDialogで日付選択 + 曜日表示 | Kotlin
DatePickerを使って日付選択を行う!ということをしていたところ、
あれ?曜日が表示されない。
曜日出そうと試行錯誤しても、番号だけ表示される….
ということにぶち当たってしまいました:frowning2:結論、
DatePickerDialogで日付表示をさせて、
その日付から曜日を求めている感じで落ち着いた。ただ、DatePickerではCalenderを使用していますが、
曜日表示するところではLocalDateを使用しているので、
良くないとかあるのかな?という疑問は残ってる。ので、これで良いのか悪いのか、もしよろしければ何故良くないのか、普通はこうやってやるんだよ~って教えてくださる方がいたら嬉しいです:pray:
(おかしくないよ!って事もお知らせいただけると安心します..)## 完成図
![DatePicker選択前.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499099/2ec702b5-3b09-51bd-f020-ad89877d3b80.j
コンポーザブルのテストを爆速にする方法
# はじめに
コンポーザブルのテストを行う際に、AndroidTestディレクトリを使ってテストを行うことが多いと思います。その際に、毎回エミュレーターを立ち上げて実行するため一回のテストにかかる時間は通常のユニットテストと比べて多くかかります。
そこで、エミュレーターを使わずにコンポーザブルに対するテストを行うために、`Robolectric`を使ってユニットテストとしてテストを行ってみようと思います。
:::note
この方法は、Droid Kaigi 2022のアプリでも採用されています。
:::
https://github.com/DroidKaigi/conference-app-2022# TL;DR
結果として、Robolectricを使って**unitTest**でコンポーザブルをテストするようにした結果、大幅な時間の短縮につながりました。
|テストの種類|時間|
|—|—|
|unitTest| 3 sec 411 ms|
|androidTest|46 sec|# 依存関係の追加やテストのための設定
一番大事なのが、依存関係の設定です。
androidxで見るMetadataHolderとはなんぞや
# 背景
ちょうど最近ライブラリが更新されたということで、アプリ別言語設定を触っていてAndroidManifestで設定した項目がこちら。“`xml:AndroidManifest.xml
“`あるいはandroidx.credentialsでも見た項目はこちら。 (追記: 実際利用する際にこの記述は不要でした)
“`xml:AndroidManifest.xml
[Android]Jetpack ComposeのComposableのModifierを条件によって切り替えたい
例えば
“`kotlin
val modifier =
if (isMax) {
Modifier.fillMaxWidth()
.fillMaxHeight()
} else {
Modifier.fillMaxWidth()
.wrapContentHeight()
}AnyComposable(modifier = modifier)
“`
というようにheightの部分だけ条件によって変更したい時
以下のコードだと.applyの中身はmodifierとして適用されない
“`kotlin
AnyComposable(modifier =
Modifier.fillMaxWidth()
.apply {
if (isMax) {
fillMaxHeight()
} else {
Android Studio を Electric Eel にアップデートしたときにやったこと
# 概要
業務で開発しているアプリを Android Studio Electric Eel でビルドできるようになるまでに対応したことを記載する。
# Electric Eel 対応
– Android Studio Electric Eel をダウンロード
– ビルドが通らなくなる可能性を考慮し、既存の Android Studio をアップデートするのではなく新規でインストール
![スクリーンショット 2023-01-31 15.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/775277ef-6968-4064-eaef-93b5c45ea1bd.png)– Android Studio Electric Eel でプロジェクトを開くと ↓ のようなバルーンが表示されるので `upgraded`
![スクリーンショット 2023-01-26 17.54.40.png](https://qiita-image-store.s3.ap-northeast-1.
HTMLのパースにjsoupを使って見た
# HTMLをパースするライブラリ
今回あるサイトのHTTPのレスポンスのHTMLをパースする必要がありました。HTMLは基本はXMLなので色々なパーサがありますが、jsoupを使ったら意外とよかったのでそれを紹介したいと思います。## そもそも・・・なんでHTMLをパースする必要があるのか?
今、開発しているアプリがAndroid端末内でCSVファイルを作ってそれをWebサイトにアップロードする仕組みなんですが、そのWebサイトがWEB APIを提供していなくて、(おそらく、10年以上前に作った、そのまま)普通のブラウザからHTMLでのアップロードのインタフェースしか提供していません。
1. ログイン。
1. CSVを添付して送信。この時正常か、エラーになる
1. 送信結果を過去の履歴も含めて取得
1. ログアウトという、一連の流れになっています。こんなの、APIあれば一発なのに・・・と思うのが普通でしょうが。各リクエスト/レスポンスのやり取りで、ブラウザから来る前提なので、結果のレスポンスは全てHTMLです。そのHTMLの中の特定のタグの値を見て正常か、失敗かを判定する必要
Playground 環境を導入して機能開発を爆速にする
## はじめに
こんにちは。with で Android エンジニアをしている [石田(@maxfie1d)](https://github.com/maxfie1d) です。
本記事では 最近導入して機能開発が爆速になった Playground 環境について紹介します。## Playground 環境とは
アプリ全体ではなく、アプリの一部の機能のみをサポートしたアプリのことを with では Playground 環境と呼んでいます。ミニアプリやデモアプリと呼ばれることもあるようです。
アプリが大規模化していくにつれ、アプリ全体をビルドしたり、実際に触って動かしてみたりといったことが徐々にツラくなってきます。
記事執筆時点で with はサービス提供開始より 7 年が経過しており、with Android 版の LOC は 20 万行を越えそこそこの規模のコードベースになりつつあります。フルビルドをしてアプリが起動した上に何回も画面をタップしてやっと動作確認をしたい画面にたどり着く…。これを 1 日に何度も繰り返すのは大変です。
この課題に対応するために 先日 wi
Android Studio Electric Eelで導入された新機能「App Quality Insights」を使ってみよう
# はじめに
現在のAndroid Studioのバージョンである「Electric Eel」において、**Crashlytics**レポートを表示することができる**App Quality Insights**という機能が導入されました。
今回は、Firebaseは導入済みだけれど、**Crashlytics**はまだ使ったことがない開発者の方向けに記事を書きました。
プロジェクトでの**Crashlytics**の導入から、Android Studioで**App Quality Insights**を使ってそのレポート内容を確認する方法までをざっくりとカバーしておりますので、開発の際のご参考にしていただけると幸いです。
:::note warn
Firebase SDK自体の導入については解説しておりませんのでご注意ください。
:::# Crashlytics for Androidを使うメリット
Crashlytics for Androidを使うことによって、次のレポートを取得することができます。
– クラッシュ
– 致命的でないエラー
– アプリケーションが
独学のプログラミングのヒント
今日の洗練された時代では、すべてを簡単に学ぶことができます。たとえば、プログラミングは独学で学ぶことができます。プログラミングとは正確には何ですか?プログラミングは、コンピューター上でプログラムを作成するプロセスです。作成されたプログラムは、ソフトウェア、Web サイト、Android または iOS アプリケーションなどの形をとることができます。
本題に入る前に、重要な情報があります。プログラミングを始めたい方はDicoding Academyで学べます . Android、iOS、クラウドからフロントエンド、バックエンドのWeb開発者まで、さまざまな分野があります。これらの各フィールドには、初心者から上級者までさまざまなレベルもあります。すごいでしょ?すぐにクラスを確認して登録してください。
はい、本題に戻ります。この記事では、プログラミングを独学で学べるように、さまざまなヒントについて説明します。すでに興味がありますよね?さあ、よく見てみよう。
プログラミングとは?
![programming-eunoiamediaID.png](https://qiita-imag
[Android][Jetpack Compose]You cannot access the NavBackStackEntry’s ViewModels after the NavBackStackEntry is destroyed.
NavControllerのpopBackStackを使って前画面に戻るという実装をしたが
実行時にエラーが起きてアプリが落ちた。“`
FATAL EXCEPTION: main
Process: …….., PID: 6785
java.lang.IllegalStateException: You cannot access the NavBackStackEntry’s ViewModels after the NavBackStackEntry is destroyed.
at androidx.navigation.NavBackStackEntry.getViewModelStore(NavBackStackEntry.kt:202)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:104)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:67)
.
.
.
省略
“`解決方法
===
popBackStack(