Android関連のことを調べてみた2021年08月27日

Android関連のことを調べてみた2021年08月27日
目次

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を動的に変更することでダイスロールを表現しています。その際に結構迷ったので備忘録的にメモします。
Google Play で手に入れよう

元記事を表示

【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) にはリワード広告を実装しているのですが、その実装の際に詰まった点を備忘録的にメモしてみます。
Google Play で手に入れよう

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) の場合。
</p

元記事を表示

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? = null

fun 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

元記事を表示

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. アップロード対象ファイルを指定し、HUAWEI Driveのファイルアップロードリクエストを実行する

注意点
1. ファイルサイズが20MB以下の場合、isDirectUploadEnabledをtrueにして、ダイレクトダウンロードが選べます。
2. ダイレクトダウンロードのサポート上限サイズは20MBですが、5MB

元記事を表示

Drive KitでHUAWEI Driveのファイルとフォルダを削除する方法

# HUAWEI Driveのファイルとフォルダの削除手順
1. [HUAWEI Driveに接続する](https://qiita.com/Rei_2020/items/bb17a8fedb4849eaaa95)
2. [ファイルまたはフォルダを検索し、対象のcom.huawei.cloud.services.drive.model.Fileを取得する](https://qiita.com/Rei_2020/items/15f6bbc9f5d48c471a03)
3. HUAWEI DriveにオブジェクトのIDを渡し、削除命令を実行する

サンプル

“`kotlin
private var drive: Drive? = null

fun deleteFile(target: com.huawei.cloud.services.drive.model.File) {
drive?.let { drive ->
val deleteFile = drive.files().delete(target.id)
deleteFi

元記事を表示

OTHERカテゴリの最新記事