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

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

targetSdkVersionを31にするときの3つの注意点

2022年11月から、GooglePlayストアにアプリのアップデートを公開する場合、targetSdkVersionを31にしないと公開できなくなりました。

機能を追加したし、あとはtargetSdkVersionを上げるだけ・・・
ってビルドできない!動かない!

という事に今回遭遇したので、targetSdkVersionを31にした時の注意点3選を書いていきたいと思います。

# 1.Android 12端末でアプリ起動時のIllegalArgumentExceptionに対応する
Android 12端末で起動しようとすると以下のエラーが吐かれてアプリ落ちします。
Android 11以前であれば普通に起動します。
“`
Fatal Exception: java.lang.IllegalArgumentException: com.highcom.todolog: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified whe

元記事を表示

新機能開発時に役立つ!エラーなく新しいフィールドをFirestoreのドキュメントに追加する方法

# はじめに

アプリのアップデートを行う際に、新しいバージョンでは特定のドキュメントに新しいフィールドを追加したい場合があります。

例えば、古いバージョンのアプリで想定している`users`ドキュメントが次のようなスキーマだったとします。

“`ts
{
“name”: string;
“createdAt”: Timestamp;
}
“`

そして、新しいバージョンのアプリでは、このドキュメントに`address`フィールドを追加したいと考えます。

“`ts
{
“name”: string;
“createdAt”: Timestamp;
// 新しいフィールド
“address”: {
postcode: string;
country: string;
state: string;
city: string;
address1: string;
address2: string;
}
}
“`

このとき、新しい

元記事を表示

AndroidでSharedPreferenceのxmlファイルはインストール直後にはできていない

# SharedPreferenceのxmlファイルができるタイミング

[Androidで設定画面を作ってみる](https://qiita.com/cozyk100/items/540ba3c9575d4955e014)でAndroidX Preference Libraryを使って設定画面のサンプルを作りました。業務でHTTPで通信するようなアプリを開発していて、HTTPの送信先のURLをAndroidX Preference Libraryを使って作りました。

ここで、気がついたのですが、

**SharedPreferenceのxmlファイルはインストールした直後はできていない**。設定画面(PreferenceFragmentCompatのFragment)が呼ばれたタイミングで作られます。(もしくは、SharedPreferenceに初めて、putXxxxしたタイミング。ま、言われてみれば当たり前と言えば当たり前)

標準では、ここにできているはずです。
“`
/data/data/{パッケージ名}/shared_prefs/{パッケージ名}_preferences.

元記事を表示

[C++]タッチで3Dオブジェクトを移動させる計算方法

# 概要
スマホに3Dの空間が描かれているとして、オブジェクトをタッチして移動させる計算方法を考えてみた。
移動は、cameraのある平面に対して平行に移動させる。

# 前提
文法はC++で記載しているが、計算方法のアイデアが主な目的なので、コードはあまり気にしなくてよいかも。
OpenGLやVulkanの座標系を想定し、cameraはこちら向きを正とする。
https://learnopengl.com/Getting-started/Camera

# 結論
忙しい人向け。
“` c++
glm::vec4 Camera2TouchScreen(glm::vec2* touchPos)
{
//screen space
float x = touchPos[0].x / width;
float y = touchPos[0].y / height;
//screen space to clip space
x = x * 2.0f – 1.0f;
y = y * 2.0f – 1.0f;
//clip space to view space
g

元記事を表示

Android 非公開APIの見分け方

# 非公開APIとは
AndroidにはAPIの種類があります。
殆どの方が使用するのは、publicAPI(AndroidStudioで開発する際誰もが使用できるAPI)だと思います。
[Android Code Serarch UserHandle#myUserId()](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/os/UserHandle.java;l=551?q=UserHandle.java)を見てみるとMethodの上に@SystemApiや@hideやらついています。

これらのAPIは普段3rdParty(GooglePlayからインストールするようなApp)では使用できないAPIになります。
じゃなぜこれの説明をするのって??
日々の業務の中でPre-inAppを作成しており、そのAppを配信化する事になりました。

しかし!!先ほど説明した非公開API(@SysteApiや@hideがついているMethod)は使用しな

元記事を表示

実機&Androidエミュレータ上のサーバへの接続確認

PCのローカルで立てているサーバに対して接続確認したい場合の Local IPアドレスの指定について
ちょっと苦しんだので調査した結果をメモしておく。
以下、xxxx = port番号 を示す。

– PC の Web上(Chrome, Edgeなど) => PCのローカルサーバ のケース
– “http://localhost:xxxx” でOK
– Androidエミュレータ => PCのローカルサーバ のケース
– “http://10.0.2.2:xxxx” 
– https://developer.android.com/studio/run/emulator-networking.html
に記載がある
– Android実機 => PCのローカルサーバ のケース
– Windows のコマンドプロンプトで ipconfig コマンドを打って出てきたIPv4アドレス(ex. http://192.168.0.1:xxxx)

元記事を表示

AndroidアプリでOpenCVを利用しようとした際のGradle Syncエラー対策

# はじめに
Android Application(Java)上でOpenCVを取り込んで動かそうとした際に引っかかったこととその対処のメモです。
ほとんど自分用に備忘録になります。
OpenCV SDKのバージョン:4.7.0

# OpenCVの取り込み
Android StudioへのOpenCVの取り込みはすでに分かりやすくい記載されている方がいるので以下を参照

https://qiita.com/tifa2chan/items/a2ec4f5d90eeb9cf1802

# GradleのSync error
参考ページのOpenCVの取り込みを実施し、openCVでモジュール名を設定しFinishしたところGradleのsyncで以下のエラーが発生
“`
Plugin with id ‘kotlin-android’ not found
“`

# 対応策
対処方法について調べていたところ以下に対策の記載があった

https://coskxlabsite.stars.ne.jp/html/android/OpenCVpreview/OpenCVpreview_A.

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事