- 1. TimePickerDialog
- 2. AndroidでDiscord Botを動かす
- 3. Jetpack Composeの`@Stable`や`@Immutable`のバイトコード上の挙動を確かめてみる
- 4. 現役AndroidエンジニアがAndroid Kotlin Fundamentalsコードラボに挑戦!その3
- 5. 標準の戻るボタンが押されたときにandroidのホーム画面に遷移
- 6. [Android]Android Gradle Plugin 7+へ更新後にビルドしたアプリを起動して ClassNotFoundException が発生した時の対処法
- 7. ディープリンクの種類を調べてみた
- 8. [UE4] Android Build-tool 31.0.0 でパッケージが出来ない件
- 9. Data Bindingのセットアップ&使い方(Kotlin)
- 10. Codemagic vs Bitrise: 詳細な比較
- 11. View Bindingのセットアップ&使い方(Kotlin)
- 12. TextViewの内容を動的に変更する方法
- 13. 【Jetpack Compose】TabRowの背景色がWhiteにならない場合
- 14. AdMob リワード広告設定時に詰まった点
- 15. Android: ActivityResultContract を使って画像選択アプリで画像を複数選択する (EXTRA_ALLOW_MULTIPLE)
- 16. Flutterで個人アプリリリースをして、約1年間で得た知見をまとめる
- 17. Android Room における隣接リストから閉包テーブルへのMigration
- 18. botton,textviewなどのスタイルの変え方
- 19. Drive KitでHUAWEI Driveからファイルをダウンロードする方法
- 20. Drive KitでデータをファイルとしてHUAWEI Driveにアップロードする方法
TimePickerDialog
##はじめに
本日はTimePickerDialogについて話していきたいと思います
##環境
⚫︎OS : macOS Catalina 10.15.7
⚫︎Androidsutdio : 4.2.1
⚫︎Kotlin : 1.5.21
⚫︎Gradle : 7.0.2##TimePickerDialogとは
TimePickerDialogは、時刻の入力に優れたGUIコンポーネントのこと。
[めちゃくちゃ参考にさせて頂きました](https://qiita.com/fumiyakawauso/items/dbb0517144f2a4400e6a)
##実装
“`Kotlin
AndroidでDiscord Botを動かす 家にAndroid 5とかいう化石を搭載しているタブレットが2台ある。
片方はイヤホンジャックがタヒんでてYouTube専用機としても使いづらい。
なにか有効活用できないか。探した結果、Discord Botにたどり着いた。#動作環境
* Android 5
* UserLand 2.7.2
* Python 3.6.9
* Discord.py 1.7.3# 本題
**この記事ではBotアカウントの取得方法やBotのコードの書き方は書きません。環境構築の方法を超適当に書きます。**
てことで、AndroidにDiscord Botを構築しよう!
## 1. UserLandのインストール
これが無いとなにも始まりまらない。
ちなみに何故Termuxじゃないのかだが、TermuxはAndroid 5&6のサポートが打ち切られてしまったのと、Discord.pyが入れれなかった。
F-droidかGoogle Play([https://play.google.com/store/apps/details?id=tech.ula](https://play.google.com/
Jetpack Composeの`@Stable`や`@Immutable`のバイトコード上の挙動を確かめてみる
どういうときにComposable関数がキャッシュされる?されない?ってすごく重要だと思っていますがみなさん理解されていますか?
Compose 1.0.1で行っています。
これらのアノテーションについてはこちらで紹介しています。
https://qiita.com/takahirom/items/cc3f8cc6032ca9c28e01#stable-type
また以下のドキュメントで言及されています
https://developer.android.com/jetpack/compose/lifecycle?hl=en#skipping
実際どうなるのみたいなところが気になったので、少し気になるパターンでまとめてみました。
キャッシュされているときはでコンパイルすると以下のようなskipのコードが入ります。
このGradle Pluginを使うと以下のようなJavaコードを簡単に見ることができます。
https://github.com/takahirom/decomposer“`java
if (($dirty & 11 ^ 2) == 0 &
現役AndroidエンジニアがAndroid Kotlin Fundamentalsコードラボに挑戦!その3
## 前回
https://qiita.com/hayashidamoka/items/f527b3fc9c7b854ce2d3## Lesson 3: Navigation
## 03.1: Create a fragment
https://developer.android.com/codelabs/kotlin-android-training-create-and-add-fragment?index=..%2F..android-kotlin-fundamentals#0### 内容
– クイズアプリの作成
– フラグメントの追加
標準の戻るボタンが押されたときにandroidのホーム画面に遷移
##標準の戻るボタンが押されたときにandroidのホーム画面に遷移
###サンプルコード
“`kotlin:back_to_home
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return if (keyCode == KeyEvent.KEYCODE_BACK) {
val homeIntent = Intent(Intent.ACTION_MAIN)
homeIntent.addCategory(CATEGORY_HOME)
homeIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
this@自分のクラスの名前.startActivity(homeIntent)
super.onKeyDown(keyCode, event)
} else {
super.onKeyDo
[Android]Android Gradle Plugin 7+へ更新後にビルドしたアプリを起動して ClassNotFoundException が発生した時の対処法
業務で開発しているプロジェクトで Android Gradle Plugin を 7.0.1 に更新したのですが、ビルドしてアプリを起動するとアプリが強制終了してしまいました。
その際に以下のようなログ(一部抜粋)が出力されていました。
“`
E/LoadedApk: Unable to instantiate appComponentFactory
java.lang.ClassNotFoundException: Didn’t find class “androidx.core.app.CoreComponentFactory” on path: DexPathList[…]
“`Google Issue Tracker で検索してみたところ、どうやら [こちら](https://issuetracker.google.com/issues/196406764) が該当の問題のようでした。
どうやら R8 の問題のようで https://issuetracker.google.com/issues/196406764#comment22 のコメントにあるよ
ディープリンクの種類を調べてみた
モバイルアプリ開発をしているとディープリンクを利用する機会が多いですが、種類やそれぞれの違いをちゃんと認識していなかったのでまとめました。
# ディープリンク(Deep Link)
デフォルトディープリンクと呼ばれることもある。
アプリがインストール済み アプリのエンドポイントに遷移する。 アプリがインストールされていない エラーメッセージ # ディファードディープリンク(Deferred Deep Link)
コンディショナルディープリンクとも呼ばれる。
アプリがインストール済み アプリのエンドポイントに遷移する。 アプリがインストールされていない App Store, Play Storeに遷移する。 #
[UE4] Android Build-tool 31.0.0 でパッケージが出来ない件
公式ドキュメント通りAndroid向けのパッケージ作成のためのセットアップを行って、いざビルドするとこんな感じのエラーがでることがあります。
“`c++
UATHelper: パッケージ化 (Android (ASTC)): Build-tool 31.0.0 is missing DX at C:\Users\wanko\AppData\Local\Android\Sdk\build-tools\31.0.0\dx.bat
UATHelper: パッケージ化 (Android (ASTC)):
UATHelper: パッケージ化 (Android (ASTC)): FAILURE: Build failed with an exception.
UATHelper: パッケージ化 (Android (ASTC)):
UATHelper: パッケージ化 (Android (ASTC)): * What went wrong:
UATHelper: パッケージ化 (Android (ASTC)): Could not determine the depen
Data Bindingのセットアップ&使い方(Kotlin)
## はじめに
Data Bindingのセットアップ方法と使い方を紹介します。
## 「Data Binding」とは?
Googleが提供しているJetpackのコンポーネントです。
UIコンポーネントとデータソースを、コードでなく宣言的にバインドできるようになります。## 環境
– OS:macOS Big Sur 11.5.2
– Android Studio:Arctic Fox | 2020.3.1 Patch 1
– Kotlin:1.5.21
– Gradle:7.0.2
– Gradle plugin:7.0.1## セットアップ
### Data Bindingの有効化
appフォルダ配下の「build.gradle」でData Bindingを有効化します。
“`diff_groovy:/app/build.gradle
android {
+ buildFeatures {
+ dataBinding true
+ }
}
“`これでData Bindingのセットアップは完了です。
## 使い方
### フ
Codemagic vs Bitrise: 詳細な比較
CodemagicとBitriseはどちらも、モバイルアプリを構築するためのクラウドベースの継続的インテグレーションおよび継続的デリバリーツールです。 Android、iOS、Flutter、React Native、Cordova、Ionicなどの一般的なモバイルフレームワークのほとんどをサポートします。
これら2つのプラットフォームのどちらかを選択するのは難しいかもしれませんが、ご心配なく。私たちは、個々のニーズまたはチームのニーズに最適なCI/CDサービスを決定するお手伝いをします。
この記事では、CodemagicとBitriseを直接比較し、各サービスの長所と短所について説明します。## オンボーディング
### Codemagicのオンボーディング
GitHub、BitbucketまたはGitLabアカウントを使用して、CodemagicとBitriseの両方にログインできます。![](https://blog.codemagic.io/uploads/2021/08/codemagic_login.png)
CodemagicはGitHubアプリ統合を使
View Bindingのセットアップ&使い方(Kotlin)
## はじめに
View Bindingのセットアップ方法と使い方を紹介します。
## 「View Binding」とは?
ビューを操作するコードをかんたんに記述できる機能です。
XMLレイアウトファイルごとにバインディングクラスが自動生成され、対象レイアウト内でIDを持つすべてのビューの参照を持ちます。
## findViewByIdとの違い
View Bindingは `findViewById` の上位互換といえます。
### Null安全
View Bindingはビューを参照するコードを自動生成するため、無効なビューIDを指定することによるNullPointerExceptionが発生しません。
### 型安全
バインディングクラス内のフィールドは、レイアウトファイルと同じ型を持つため、ClassCastExceptionが発生しません。
## 環境
– OS:macOS Big Sur 11.5.2
– Android Studio:Arctic Fox | 2020.3.1 Patch 1
– Kotlin:1.5.21
– Gradle:7.0.
TextViewの内容を動的に変更する方法
自作androidアプリ [Flexible Dice](https://play.google.com/store/apps/details?id=com.chelak.dice)
では、TextViewを動的に変更することでダイスロールを表現しています。その際に結構迷ったので備忘録的にメモします。
【Jetpack Compose】TabRowの背景色がWhiteにならない場合
## 問題点
Jetpack ComposeのTabRowのbackgroundにwhiteを指定しているのになぜかグレーになってしまったり、正常に白色にならない場合があります。
例えばこんな感じです。“`kotlin
@Composable
fun TabPage() {
var selectedTabIndex by remember { mutableStateOf(0) }TabRow(
selectedTabIndex = selectedTabIndex,
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
backgroundColor = Color.White
) {
Tab(
selected = selectedTabIndex == 0,
onClick = { selectedTabIndex = 0 },
AdMob リワード広告設定時に詰まった点
自作androidアプリ [Flexible Dice](https://play.google.com/store/apps/details?id=com.chelak.dice) にはリワード広告を実装しているのですが、その実装の際に詰まった点を備忘録的にメモしてみます。
AndroidKotlinAndroidStudioadMobアプリ開発Android: ActivityResultContract を使って画像選択アプリで画像を複数選択する (EXTRA_ALLOW_MULTIPLE)
ActivityResultContract を使って外部の画像選択アプリを起動し、ユーザーに複数の画像を選択させます。
単一の画像選択で構わない場合は以下の記事も参照してください。
https://qiita.com/irgaly/items/b9bbef4de73669113ddf
Android 標準の画像選択アプリではなく、Google Photos を起動して複数画像選択をしたい場合は以下の記事を参照してください。
https://qiita.com/irgaly/items/a1967f0fa4b505ab83e8
## 必要な権限
外部の画像選択アプリによって画像を選択し、その画像を読み取るためには **READ_EXTERNAL_STORAGE 権限は不要** です。
画像選択アプリが端末に保存されている画像を読み取る権限を取得しており、ユーザーが選択した画像は Intent 発行元のアプリが読み取れるパスとして返却されるためです。
## 前提
AndroidX や AndroidX Fragment が導入されている前提です。
## 実装
複数画
Flutterで個人アプリリリースをして、約1年間で得た知見をまとめる
# 目次
2020年10月に個人開発でFlutterを使ったスマホアプリをリリースしました。
そろそろリリースしてから1年経つので得た知見を簡単に纏めておきます。
誰かの役に立てば嬉しいです。## リリースしたアプリ
![スクリーンショット 2021-08-23 22.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410187/8004d861-c243-612b-839a-5837e82aa05d.png)アプリ名:**グルメマップ**
機能:**近くの飲食店をMap表示するアプリ**
利用技術:**Flutter**
リリース日:**2020年10月**
作ったきっかけ:**3秒くらいで近くのランチやディナー検索できるアプリが欲しかった**
利用API:
[Google Maps API](https://developers.google.com/maps/?hl=ja)
[Google Places API](https://developers.google.com/m
Android Room における隣接リストから閉包テーブルへのMigration
隣接リストにて作成してしまった木構造のデータを、深さ付きの閉包テーブルにマイグレーションしたのでそのときの備忘録です。
そもそもの木構造の表現方法には触れず、あくまでMigrationの手順についてのみ記載しています。
# モチベーション
AndroidでTwitterAPI(Twitter4J)を利用したアプリを作っており、要件としてツイートとそれに連なるリプライをローカルに保持する必要がありました。
当初はあまり深く考えず、`Tweet`オブジェクトに[`Status#inReplyToStatusId`](https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/tweet)プロパティが含まれていることから、ローカルに`previousId`としてこのIdを保持していました(後々めんどうになる予感はしていたが、当初は閉包テーブルを知らなかった)。隣接リストでは、任意のツイートを含む、任意の深さの根~葉までの経路を取得することが困難であることが分かり、閉包テーブル
botton,textviewなどのスタイルの変え方
## 方法
`drawable.xml`ファイルに使いたいスタイルを新規作成し、xmlの`android:background`に設定するだけ## 例
自作androidアプリ [Flexible Dice](https://play.google.com/store/apps/details?id=com.chelak.dice) の場合。
Drive KitでHUAWEI Driveからファイルをダウンロードする方法
# HUAWEI Driveからのダウンロード手順
1. [HUAWEI Driveに接続する](https://qiita.com/Rei_2020/items/bb17a8fedb4849eaaa95)
2. [ファイルオブジェクトを取得する](https://qiita.com/Rei_2020/items/15f6bbc9f5d48c471a03)
3. HUAWEI Driveのダウンロードリクエストを実行する注意点
1. ファイルサイズが20MB以下の場合、isDirectDownloadEnabledをtrueに設定できます。サンプル
“`kotlin
private var drive: Drive? = nullfun load(filename: String, dest: File, isApplicationData: Boolean) {
getFile(filename, false, isApplicationData)?.let { file ->
download(file, dest
Drive KitでデータをファイルとしてHUAWEI Driveにアップロードする方法
# HUAWEI Driveへのファイルアップロード手順
1. [HUAWEI Driveに接続する](https://qiita.com/Rei_2020/items/bb17a8fedb4849eaaa95)
2. 親フォルダのオブジェクトを[取得](https://qiita.com/Rei_2020/items/15f6bbc9f5d48c471a03)/[生成](https://qiita.com/Rei_2020/items/c2dde3245c8659d16047)する
3. com.huawei.cloud.services.drive.model.Fileオブジェクトを作る
4. ファイル名、mimeType、親フォルダを設定する
5. InputStreamを指定し、HUAWEI Driveのファイルアップロードリクエストを実行する注意点
1. アップロード先にすでに同じファイル名のファイルが存在する場合、アップロード先のファイル名が勝手に{ファイル名}(次の番号).{拡張子}に置き換わります。サンプル
“`kotlin
pr