Android関連のことを調べてみた2023年01月21日

Android関連のことを調べてみた2023年01月21日
目次

Android Studioでのビルドエラー

# 概要
久しぶりにAndroidの新規プロジェクトを立ち上げたら、いきなりビルドエラーを吐いてしまった。

# エラーメッセージ全文

“`
6 issues were found when checking AAR metadata:

1. Dependency ‘androidx.appcompat:appcompat-resources:1.6.0’ requires libraries and applications that
depend on it to compile against version 33 or later of the
Android APIs.

:app is currently compiled against android-32.

Also, the maximum recommended compile SDK version for Android Gradle
plugin 7.4.0-alpha03 is 32.

Recommended actio

元記事を表示

【Android】不労所得のために入れたAdViewで遭遇したエラーを解決するTips

# はじめに

Jetpack Composeを使って、アプリに広告を配置するために`AndroidView`と`AdView`を使用しました。

その際に発生したエラーの解決方法をコードを交えて紹介したいと思います。

# val cannot be reassigned

`adSize`プロパティに、`AdSize.BANNER`を代入しようとしたらエラーが発生しました。

“`kotlin
val cannot be reassigned
“`

こういう場合は`setAdSize()`を使用しましょう。

“`kotlin
val adView = AdView(context).apply {
setAdSize(AdSize.BANNER)
loadAd(AdRequest.Builder().build())
adUnitId = “ca-app-pub-xxx”
}
“`

# The ad size and ad unit ID must be set before loadAd is called.

`loadAd()`の呼び出し

元記事を表示

AndroidのApp Linksで複数ホストを設定する時の注意点

AndroidのApp Links対応にあたり、AndroidManifest.xmlに対応するスキーム/ホスト/パスなどを設定すると思います。1つのアプリで複数のホストに対応する場合にハマった点があったため、それについてまとめます。

### ?ゴール
アプリの`MainActivity`を次の2つのURLパターンから起動できるようにするのをゴールとします。それぞれのURLは異なるホストになっています。

– `https://foo.example.com/users/.*`
– `https://bar.example.jp/articles/.*`

### ?NGな例
こちらがNGな例です。どこがダメかわかりますでしょうか?

“`xml

元記事を表示

a-3-1-1.Buttonのレイアウト

### a-3-1-1.Buttonのレイアウト

#### 目標設定
[一覧に戻る](https://qiita.com/ryouta33/items/57f5e51a26086151a0da)

#### 課題
3. Buttonの背景色を指定したRGBでXMLから指定することができるか。
3. Buttonの枠線を指定したRGBと太さでXMLから指定することができるか。
3. Buttonを制約配置(ConstraintLayout)で指定することができるか。
3. Buttonを列配置(LinearLayout)で指定することができるか。

#### Github

https://github.com/rwakizaka7/AndroidTest

#### テスト実装

“`kotlin:ButtonTestActivity.kt
package com.example.androidtest

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.examp

元記事を表示

結局、kotlinx.coroutinesって何がうれしいんだっけ?

いかがでしたか?(先手必勝)

先日ふと、普段使っているkotlinx.coroutines、どういうところに利点があるんだっけ? :thinking: と思い、自分が知っていることを軽くまとめようとしたところ軽くない量になったので、まとめたものを自ら公開処刑にします。

そもそもsuspend funって何?
==================================================================================
suspendポイントで一度ライブラリ側(kotlinx.coroutinesとかComposeとか)に制御を戻し、然るべきタイミングで再度suspendポイントから続きの処理を再開できる関数。

### 例
“`kotlin
val seq = iterator {
yield(1)
yield(1)
yield(2)
yield(3)
}

seq.take(3).joinToString() // “1, 1, 2”
“`
このIteratorはnextが呼ばれるたびに次のyie

元記事を表示

IonicとCapacitorを使ったモバイルアプリをCLIによる初期ファイル生成なしで構築する

ウェブの技術を使ってAndroidやiOSなどのモバイルアプリを作成できればコードの共通化ができ、OSごとに個別のアプリ開発の知識を要求されることがなくなります。このようなことを実現するためのフレームワークに[Ionic](https://ionicframework.com)と[Capacitor](https://capacitorjs.com/)があります。

本稿ではIonicとCapacitorとVueを使ったモバイルアプリをIonicの公式ドキュメントにあるCLIによる初期ファイル生成を使わずに一から作成することで、構成を深く理解することを目指します。特にIonicとCapacitorの関係性は明確な説明が無いせいでわかりづらいのですが、そこを理解し実際に最低限のアプリを作成することで確認します。

作成したコードは以下から見られます。コードを早くみたい人はどうぞ。

https://github.com/silane/capacitor-ionic-vue-sample

# Scaffold(CLIによる初期ファイル生成)すると中身が理解できない
Ionicでのモバイル

元記事を表示

AlertDialogのデザインや色を変更する | Kotlin

前の記事でAlertDialogとNumberPickerの実装方法について書いたけど、
今回はAlertDialogのデザインや色の変更方法について残しておく:raised_hands:

AlertDialogの
テキストカラー、メッセージカラー、背景色、ボタン背景色、ボタン位置
とかを変更していきたい!!!

前回記事(AlertDialog+NumberPickerの実装)はこれ↓

https://qiita.com/hanaaaa/items/f02fedc7fd6b85b0b153

## 完成図
前回の記事で出来上がったダイアログがBeforeで、
今回色々いじった結果がAfterとなってる。
でも前回の記事見なくても、AlertDialogのデザインや色を変更する分には問題ない。

Before
![シンプルダイアログ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499099/3da8ed96-0cf0-dda5-a9f8-e281ba3038d8.jpeg)
After
![

元記事を表示

年月選択可能なダイアログ(Numberpicker+AlertDialog) | Kotlin

はじめに、
DatePickerで”年月”選択可能なダイアログを実装しようと
思っていたのに、全然できず。どうしても”年月日”になってしまう。
年度選択に使いたかったのに!!!日!!!日は入ってほしくない!!

結局、DatePikerでは日を除くことは出来ないんだ…:frowning2:
ってことで、NumberpickerをAlertDialogにのせた。

これからもAlertDialogを使う機会は全然あるので、全部残しておく。

## 完成図

①「年月表示」のボタンを押す
![ボタン表示.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499099/07f8f32b-e67e-bab0-25db-1a976b3ee712.jpeg)
②年と月を選択できるダイアログが表示される
![シンプルダイアログ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499099/81092a78-787b-1c07

元記事を表示

サブスク始めてみませんか?Google Play Billing Libraryの簡単なまとめ

# はじめに

自分が開発しているAndroidアプリに、アプリ内購入機能を実装したい衝動に駆られました。
Androidアプリにアプリ内購入機能を実装するためには、Google Play Billing Libraryを使ってロジックを実装していく必要があります。

しかし、これがなかなか複雑で難しい。

サンプルコードをみてみても、どこが出発点でどこまでが前処理で、どこからが実際の購入フローなのかよくわからない箇所が多くありました。

そこで今回は、自分のためにGoogle Play Billing Libraryを使って課金機能を実装するのに必要な各クラスの意味やインターフェースについての解説を簡単にまとめてみようと思います。

Google Play Billing Libraryを用いた具体的な実装方法については、以下のコードラボとリポジトリを参照してください。この記事と照らし合わせながら読んでいくと理解が深まると思います。

https://codelabs.developers.google.com/play-billing-codelab#0

https://gith

元記事を表示

【Android】assetsフォルダにあるテキストファイルを読み込む方法

“` Kotlin
fun readFile(fileName: String): String {
var text = “”

try {
val inputStream = context.assets.open(fileName)
text = inputStream.bufferedReader().use {
it.readText()
}
} catch (e: Exception) {
// エラー処理
}
return text
}
“`

`val inputStream = context.assets.open(fileName)`でassetsフォルダにある`fileName`ファイルを読み込みます。
`fileName`には拡張子を含んだ名前を渡します。
`text`には読み込んだテキストファイルの中身(改行も含む)が入ります。

元記事を表示

@Immutableと@Stableの使い分け

# 初めに
今回は、JetpackComposeで実装する上で割と重要な@Immutableと@Stableアノテーションについて書いていこうと思います
### 本文
自分がどういうふうに使い分けてるかというと下記のようになります
利用するクラスが、絶対不変である場合は@Immutableアノテーションを付与。
内部にState等を保持していて絶対不変とは言えない場合は@Stableアノテーションを付与。

こうすることで、@Immutableアノテーションの場合はcompose compilerが変更はないということを理解してrecomposeがスキップされるようになります。
逆に、@Stableアノテーションをつけていると値の更新をcomposeに通知しながら、recomposeを減らしてUIの更新を行うことができます。

### 最後に
最近Jetpack Composeで実装している際にアノテーションのレビューをいただき自分が調べたものを備忘録的に残しておこうと思い書きました。
どなたかのお役に立てれば幸いです

元記事を表示

[Android] [Kotlin] Spinnerの初期値項目を文字列で選択する方法

### はじめに
spinnerの初期値項目を設定するときにsetSelectionを使いますが、この引数は(position: Int)となっていて
ちょっとめんどくさいと思いました。
setTextみたいに入れて自動的にリストにある同名の項目を初期値設定にしたい方におすすめです。
javaでの方法があったので、kotlinにしてあげたものです。

###
“`.kt
val spinner: Spinner = findViewById(R.id.spinner)
spinner.setSelection(setSelection(spinner, “文字列”))

private fun setSelection(spinner: Spinner, item: String): Int {
val adapter = spinner.adapter
var index = 0
for (i in 0 ≦ until < adapter.count) { if (adapter.getItem(i) ==

元記事を表示

Jetpack Compose副作用 関数整理

### 副作用
[副作用(プログラム)Wikipedia](https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0))
>プログラミングにおいて、式の評価による作用には、主たる作用とそれ以外の副作用(side effect)とがある。 式は、評価値を得ること(※関数では「引数を受け取り値を返す」と表現する)が主たる作用とされ、それ以外のコンピュータの論理的状態(ローカル環境以外の状態変数の値)を変化させる作用を副作用という。

“` Kotlin
fun sideEffect(){
anyGlobalValue++ // 副作用
}

fun getValue(): Int {
return anyGlobalValue
}
“`
こういうの。
getValueをいつ呼び出しても同じ値が返ってくる状態にしておくのが副作用がないプログラム。いつ呼び出しても同じ値が返ってくる=>参照透過ともいう。

[Co

元記事を表示

【Android】別アプリのAARを回避して、起動中のアプリでNFCのインテントを処理する方法

# はじめに

この記事は、Android端末がNFCを読み取った際にAndroid Application Record、通称AARが記録されていれば、その値に基づいて紐づくアプリを起動またはGoogle Play Storeに移動することを防ぐための方法をまとめたものです。

経緯として、NFCの読み取りと書き込みを行うアプリを開発していたところから話は始まります。
ビルドバリアントごとにパッケージ名を変更するよう**build.gradle**で設定していたため、ビルドバリアントを変更した際に、別のパッケージ名でAARを書き込んだNFCを読み取るとそのアプリをインストールするためにGoogle Play Storeを開いてしまうという問題に直面していました。

LogCatを確認すると、次のようなインテントが発行されていました。

“`
ActivityTaskManager system_server I START u0 {act=android.intent.action.VIEW dat=market://details?id=com.takagimeow.examp

元記事を表示

Quick share / internal app sharing / 内部アプリ共有でaab、apkをURLで共有する

今まであった内部テストとは別に、internal app sharing upload pageというのがあるので共有しておきます。
aab/apkの突発的な共有が楽になるという感じだと思います

* 基本的にはinternal app sharingにアップロードする感じっぽい。
* そのaab apkのパッケージ名の権限があるアカウントからしかアップロードできない
* Release > Setup > Internal app sharingからUploaders and testers tabがあり、アップロードできるアカウントを追加できる。
* バージョンコードが重複しても大丈夫
* app bundle explorerなどに入らない
* なんの鍵で署名されていてもOK
* アップロードしたファイルのリンクを作ってくれる
* リンクは60日で失効

Quick share / internal app sharing upload pageのページ

https://play.google.com/console/internal-app-sharing

元記事を表示

【Android】onCreate()の外側でViewModelを使いたい場合の初期化方法

# はじめに

公式のドキュメントでは、`onCreate()`内で`ViewModel`をリクエストすることが推奨されています。

> 通常は、アクティビティ オブジェクトの onCreate() メソッドが最初に呼び出されたときに、ViewModel をリクエストします。

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja#lifecycle

`onCreate()`で`ViewModel`を初期化する場合は次のようになるでしょうか。

“`kotlin
import androidx.activity.ComponentActivity
import androidx.activity.viewModels

class ExampleActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(saved

元記事を表示

kotlinのラムダいろいろ(メモ)

## 記事が参考になりそうな人
– ラムダがよくわからんくなる人


### 変数に関数を格納する
“`
fun foo(){
println(“Hello”)
}
“`
を変数に格納したいときは(関数を呼び出すんではない)

“`
val aaa = ::foo
“`
で格納できる
![スクリーンショット 2023-01-17 21.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/aefb08d9-2ae9-628e-2a82-786527d9ea06.png)


### funを使わず関数をつくる
“fun”を使わずに関数を定義するには
“`
val foo = { println(“Hello”)}
“`

![スクリーンショット 2023-01-17 21.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/f07cdfcf-7049-

元記事を表示

AffinityDesignerでエクスポートしたsvgファイルをAndroid Studioでインポートしたときに崩れてしまった場合の対処法

# はじめに

僕は普段Androidアプリのアイコンを作成するときは、Affinity Designerを使用します。

https://affinity.serif.com/ja-jp/designer/

しかし、Affinity DesignerでエクスポートしたSVGをAndroid Studioでインポートしたときに度々デザインが崩れてしまう現象が発生していました。

今回は、次のアイコンを作成したときに発生した問題について解決方法が見つかったのでまとめていきたいと思います。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/61c39c57-3548-10c0-1f00-1eaec75390f7.png)

# Affinity Designerの問題

まずは、エクスポートした上記のSVGファイルをAndroid Studioで読み込んだときの画面をご覧ください。

![1.png](https://qiita-image-store.s3.ap-northeast

元記事を表示

Androidの通知アイコンが指定通りの色にならない問題

# Androidの通知アイコンが指定通りの色にならない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/9613993b-acc4-6ed9-b275-1dbd51cf9ab2.png)

Androidの通知アイコン(①)が指定した通りの色にならず、なぜか黒ずんでしまうので原因を調べたら、Androidの仕様によるものでした。

“`kotlin
val builder = Notification.Builder(context, id)
.setColor(ContextCompat.getColor(context, R.color.colorAccent)) // ←この色が正しく出ない
“`

## Androidの仕様が原因?
どうやら、背景色とコンテンツ色の**コントラスト比が一定以下だと自動的に補正される**というAndroidの仕様があるらしい。
公式ドキュメントの記述を見つけられなかったが、ソースを見たところでは **4.5** がしきい値のよう

元記事を表示

GitHub ActionsでBaseline Profilesを生成する

[android-emulator-runner](https://github.com/ReactiveCircus/android-emulator-runner) のような Android Emulator の Actions を使うパターンもあるのですが、今回は Gradle Managed Device を使っての Baseline Profiles を生成する Actions を作ってみます。

## 実装

“`build.gradle
dependencies {
implementation ‘androidx.benchmark:benchmark-macro-junit4:1.2.0-alpha09’

}
“`

`benchmark-macro-junit4` は 1.2.0 の alpha 版を使用します。
これは benchmark モジュールのテスト実行時に Baseline Profiles の生成以外のテストが走ってしまうのを防ぐ機能が 1.2.0 以降に入っているためです。

“`benchmark/build.g

元記事を表示

OTHERカテゴリの最新記事