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

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

Jetpack Composeで簡単な画面遷移を行う

単純なコンポーザブル関数が用いられている2画面間の遷移(のようなもの)をする方法の一つです。
build.gradle(:app)に以下のような依存関係を追加してください。

“`gradle:build.gradle(:app)
// いろんなやつ

dependencies {
// いろんなやつ
implementation “androidx.navigation:navigation-compose:2.4.0-alpha09”
}
“`

:::note warn
注意
compileSdkVersion が 30以下だと後の処理でエラーが出る可能性があります。
:::

今、以下のような `FirstScreen` と `SecondScreen`を移動する場合を考えます。

“`kotlin
@Composable
fun FirstScreen(navController: NavController){
Column {
Text(text = “1つ目の画面”)
Button(onClick = { navCo

元記事を表示

Android enumではなくIntDefを使ってdata classを組み立てる

# 環境
Android Studio Arctic Fox | 2020.3.1 Patch 2
Kotlin 1.5.31

# 概要

列挙型の値を使うときに、`@IntDef`を生かしてdata classを組み立ててみます。

# なぜenumではなくIntDefを使うのか

Google I/O 19で、`Build apps for the next billion users` という動画があります。

この中の、`Reduce your app size`に挙げている項目で、`

元記事を表示

やらかし:AndroidのNavigationコンポーネントのSafe Argsを使っててnavArgs()がUnresolved referenceになった

# 結論
結果から言うとただの勘違いでした。
実装方法は間違えてないのに解決できない方は[こちら](#実装は正しいのに解決できない場合)

# 起こったこと
“` kotlin:DetailFragment.kt
class DetailFragment : Fragment() {
companion object {
private val args: DetailFragmentArgs by navArgs() // navArgs Unresolved reference.

fun newInstance() {
// …略
}
}
private var _binding: DetailFragmentBinding? = null
private val binding get() = _binding!!

// …略
}
“`
何さがしてもUnresolved referrenceが解決できなかった。

# 解決
ただ単に、`companio

元記事を表示

dronekit-androidをビルドしてみる(2021年10月版)

# はじめに
最近、[Herelink](http://www.japandrones.com/shopdetail/000000000169/)を筆頭にAK82、MK15などMAVLink対応スマートコントローラの国内販売が相次いでいます。これらにはAndroid OSが載っているのでカスタムアプリ開発手段の一つとして[dronekit-android](https://github.com/dronekit/dronekit-android) のニーズが出てくる可能性があります。

そこで、Androidの経験が浅い人向けに2021年10月時点最新のAndroid Studioを使って[dronekit-android](https://github.com/dronekit/dronekit-android)をビルドする手順をまとめました。dronekit-androidは2018年以降更新が止まっていることもあり、作業内容はほぼツールのバージョンの整合性合わせとなります。

* サンプルアプリからの機体(シミュレータ or 実機)への接続確認が取れていないため、そちらの確認が取

元記事を表示

Unityビルドにハマった時に見る備忘録

#最初に
これらは備忘録でざっと書いているので日本語がおかしかったりこの方法で直らない可能性があることをご了承ください

#Unityビルドに失敗する場合
##エラーが100個以上大量に出ている場合
エラーの量で雑に分類します。
エラーメッセージを見る。
### Duplicate class com.google.android.gms.ads.identifie … と言われてる場合

例えばこのエラーメッセージの場合

java.lang.RuntimeException: Duplicate class com.google.android.gms.ads.identifier.AdvertisingIdClient found in modules classes.jar (:com.google.android.gms.play-services-ads-identifier-17.0.0:) and classes.jar (:play-services-ads-identifier-17.0.0:)

元記事を表示

[Kotlin] data class と普通のクラスの違い

# 事の発端
師匠に突っ込まれたので。
まだまだ、思考が浅かったです。

# データクラスとは?
データクラスとは、Kotlin特有の仕様で、データを保持するだけのクラスはdataマークをつけることで定義されます。
データクラスとして成り立たせるには、

– プライマリコンストラクタに引数を一つは持たせること。
– val or var でイミュータブルか否かを明示すること
– 抽象クラス、openクラス,シールドクラス、インナークラスであってはならない

が必要です。

Javaでは、フレームワークに依存していない無添加なオブジェクトによって、(いわゆるPOJO)データを保持するだけのクラスは作れますが、かなりボイラープレート多いです。

# 普通のクラスとの違い
上記3つの縛りはあるものの、確かに違いは何かと言われるとちゃんと考えていなかった。
恐らく、dataマークを付与することでデータを保持するのに特化した仕様になるのだろうが、何が違うの

元記事を表示

汎用デシジョンテーブルIMSが新たに追加になりました。

#はじめに
ifLinkマイクロサービスを開発している八教と申します。
新たにデシジョンテーブルにより判定して結果を送信するフィルターIMS
「汎用デシジョンテーブルIMS」が追加されましたので、紹介させていただきます。

#ifLinkとは
https://iflink.jp/

#汎用デシジョンテーブルIMSについて
IMSのデータがデシジョンテーブルに合致するか判定し、
最初に合致したデシジョンテーブルの結果を返却します。

デシジョンテーブルってなに?という方は以下参照
https://medium-company.com/%E6%B1%BA%E5%AE%9A%E8%A1%A8/

例えば入力に乗車駅、降車駅、支払いを出力するIMSがあった場合、
それらの入力を受け取ってデシジョンテーブルより運賃を算出。
算出結果をトーストに表示することができます。

IF-THEN のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/f5ea05a6-b607-e1ff-

元記事を表示

AmazonアプリストアにAndroidアプリを登録してみた

# 概要

[Amazonアプリストア](https://www.amazon.co.jp/Android%E3%82%A2%E3%83%97%E3%83%AA/b?node=2381130051)に自作アプリ[CIFS Documents Provider](https://f-droid.org/packages/com.wa2c.android.cifsdocumentsprovider/)を登録してみたので、その内容について書きます。

# Fire OSとAmazonアプリストアについて

Amazonでは、[Fire タブレット](https://www.amazon.co.jp/Fire-タブレット-ファイア-Amazon/b?ie=UTF8&node=3933931051)という、電子書籍リーダ向けのタブレット端末が販売されています。これはE-ink画面のKindleとは異なり、Fire OSというAndroidをベースとしたOSが搭載されています。AndodroidとFire OSのバージョンの対応関係は、次のページに書かれています。

[Fire OSの概要 \|

元記事を表示

Action名やExtraのKey名はどうやって定義するのがよいか?

Intentに付与するAction名やExtraのKey名をアプリ独自で定義する場合、どういう値を定義すればいいのか、独自なのでどうとでも定義できてしまうため悩んでしまいますよね。
また、外部に公開する場合、アプリ間プロトコルの定義になりますので、一度適用してしまうと変更不可能という、取り返しのつかない設計要素です。将来を見据えて慎重に決める必要があります。

というわけで、どうやって決めればいいのかを説明しようと思います。

# アプリ外部に公開する場合

Intentを使ったインターフェースをアプリ外部に提供し、独自のActionを定義する場合は、他のAction名と重複しないように、**パッケージ名などをプレフィックスとしてつけた名前を定義する**のが良いでしょう。アプリ外部に提供する場合、それが機能を識別するためのIDになりますので、他のアプリで使用される名前と衝突すると問題が発生してしまいますからね。

プレフィックスの後の名前は自由につけて良いです。アプリ内のシンボル名として、ACTION_HOGEHOGEという名前で定義することが多いと思うので、それをそのままつけても良い

元記事を表示

API31以上をターゲットにした時の変更点をざっくりと(UXについて)

# まもなくAndroid12!
最終beta版がリリースされて、いつリリースなのか推測が色々なされています。
QAエンジニアとのコミュニケーションで必要になってくる場合もあるのでチェックしておこうと思います。
今回はAPI31以上をターゲットにした時のUX変更点に関していくつかピックアップしたいと思います。

# UXの変更点
### ピクチャー イン ピクチャーの動作の改善
ピクチャーインピクチャーとは、Android8から導入された機能で、メイン画面でActivityを操作しながら別のActivityを画面の片隅に表示させられるというものです。

GoogleMapなどで体験したことある人多いと思います。

これに関して、いくつか動作変更が起きました。

例えば、PIPモードに入る時のジェスチャーナビゲーションは、ホームに戻るアクションを検知してからでしたが、新しくできたAPI `PictureInPictureParams` によりコールバックを待たずして `setPictureInPictureParams` を呼び出せるようになりました。

かなりスムーズな遷移が出来そうで

元記事を表示

Flutter 2.5.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)

# なぜこの記事を書いているか?

自分の参画していたプロジェクトで、FlutterおよびXcodeのバージョンの違いに悩まされていたので、違いを吸収する方法は無いかと色々調べていたら以下の方法にたどり着きました。その備忘録です。

# 環境(2021/10/03現在)

– MacBook Pro (Intel Mac)
– macOS Big Sur (11.6)
– Flutter (2.5.2)
– Android Studio (Arctic Fox | 2020.3.1 Patch 2)
– Xcode (13.0)

# インストール

## Homebrew

今回は色々な物をHomebrewでインストールするので、以下を実行します。

“`bash
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`

## Google Chrome

なにはともあれ、Chrome。

“`bash
brew install –ca

元記事を表示

Jetpack ComposeのSlotTableへの変更の適応のコードリーディング

https://qiita.com/takahirom/items/8e978eeb6d85bf48a330

の続きです。

今度まとめた記事を書く予定なので、この記事は読まなくていいです。

前回までで、recomposeの実装を読んでいくことができました。
SlotTableに反映していくところつまり、4を呼んでいきます。

1: recordComposerModificationsLocked() を呼ぶ。Recomposer.snapshotInvalidationsを見て、IdentityScopeMapを使って変更点に対しての影響を受けるスコープを取得し、Recomposer.compositionInvalidationsやComposition.invalidationsというフィールドに変更を入れる。
2: compositionInvalidationsをtoRecomposeに入れる。
3: toRecomposeに対して、performRecompose(composition, modifiedValues)、(内部でdoCompose())することでt

元記事を表示

【Android】Jetpack Composeでwakelock対応(スリープさせない)をする【Tips】

個人的なメモも兼ねて

## 概要

Androidアプリにおいて、何らかの都合で画面をスリープ状態にさせないようにする場合は専用の実装が必要です。
Android公式の推奨方法は`FLAG_KEEP_SCREEN_ON`をActivityから呼ぶ実装です。

https://developer.android.com/training/scheduling/wakelock

“`kotlin
// コードで呼ぶ例
class MainActivity : Activity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

元記事を表示

Activityの起動処理は起動されるActivityで実装すべし

Androidアプリの開発を始めたら、かなり初期に習得するであろう他のActivityを起動する方法ですが、いわゆる入門書とかに書かれているような実装方法はよろしくない。って話をしようと思います。
最近はNavigation Component使っているしSingle Activityだから使う機会が無い?知らんがな。

MainActivityからMainActivity2を起動する例を考えます。

# 入門書の延長

意外とよく見かけるのが以下のように呼び出し元でIntentをつくってstartActivityをコールする方法。入門書に書いてある感じです。ExrtaのKeyをConstantsに定数定義しているのもあるあるですね。

“`kotlin:MainActivity.kt
findViewById(R.id.button).setOnClickListener {
startActivity(Intent(context, MainActivity2::class.java).also {
it.putExtra(Constants.

元記事を表示

【Android】Repositoryの役割・メリットを考えてみる

## はじめに: アーキテクチャに関する一般的な原則について
本題に入る前に、「関心の分離」についておさらい。
認識すべきこと:すべてのコードを 1 つの Activity または Fragment に記述するのはよろしくない。

### すべてのコードを1つのActivityに記述したときに起こりうるデメリット
**①開発コスト高**
コード量が肥大化し、他人(未来の自分を含む)が理解しづらくなり、修正も困難に。。。

**②メモリ不足**
ActivityやFragmentは画面回転したりアプリをバックグラウンドに移したりするだけでLifecycleが終了するため、表示するたびに全ての処理を実行しなければいけなくなる。
高負荷な処理を連続で行うとメモリ不足になってしまうことも。。。

### 解決策: 関心の分離をする
関心の分離とは主にデータの管理(データの取得・保存)に関して、各クラスの関心を分離させるべきと言う考え方。
要するに、各クラスの役割を定め、自らの役割を全うさせることで効率的で、洗練されたアプリを作成しようということ。

本題:今回はViewModelを補佐す

元記事を表示

F-Droidにアプリを登録してみた

# 概要

[F\-Droid](https://www.f-droid.org/)に自作アプリ[CIFS Documents Provider](https://f-droid.org/packages/com.wa2c.android.cifsdocumentsprovider/)を登録してみたので、その内容について書きます。

# F-Droidとは

F-Droidとは、公式サイトによると次のように説明されています。

> F-Droidは、Androidプラットフォーム用のFOSS(Free and Open Source Software=フリーオープンソースソフトウェア)アプリケーションのインストール可能なカタログです。お使いの端末で簡単にブラウジング、インストール、およびアップデートの追跡ができます。

要するに、オープンソースのアプリに限定されたAndroidアプリストアです。
F-DroidアプリをAndroid端末にインストールすることで、登録されている各アプリを端末にインストールすることができます。
また、Androidだけでなく、Kindle FireのFir

元記事を表示

古いサンプルコードでSupport Library→AndroidXに変換して読む際に対応表が欲しいと思ったら普通に公式にあった話

## Support Libraryが利用されている古いプロジェクト等を確認する際にAndroidXの対応表が欲しいなと思ってGoogle先生に尋ねたら普通に公式にあった…

* AndroidX への移行
* https://developer.android.com/jetpack/androidx/migrate?hl=JA

上記に「アーティファクトのマッピング」と「クラスのマッピング」と言う項目が用意されているのでそこから確認できる…

* アーティファクトのマッピング
* https://developer.android.com/jetpack/androidx/migrate/artifact-mappings?hl=JA

* クラスのマッピング
* https://developer.android.com/jetpack/androidx/migrate/class-mappings?hl=JA

## 結論
ちゃんと公式を確認しようと思う…

元記事を表示

Cocos2d-x v4移行 Android編

前回に引き続きCocos2d-xのv4への移行を行なっていきます

### [4.Androidのビルド](#Migration-4)

Androidは3.17でCMakeが導入されているので3.17から
することは64bit対応とAndroidX対応程度ですが
今回はCMakeに習熟していない方のためにCMakeList.txtを
再起的参照でソースを読み込むように変更したいと思います

それ以前のバージョンから移行する場合にはCMake対応する必要があります
CMakeList.txt,build.gradleをそれぞれv4から取得してきて
dependanciesを移せば移行できると思います

#### [確認環境](#Migration-4.0)
あくまで動作確認環境なので
必須のものもそうでないものも混ざっています

– Android Studio 4.1.2
– Android SDK 9.0 Pie (API Level 28)
– Android SDK Build-tools 28.0.3
– NDK 21.1.6352462
– CMake 3.18.1

元記事を表示

【Androidアプリリリース】パワポでフィーチャーグラフィックを作成する方法

#背景
先日初めてAndroidアプリをリリースしようとしたときに、**フィーチャーグラフィック**が用意できていませんでした。本来であればデザイナーさんに依頼するのが一番だと思うのですが、趣味程度のアプリリリースだったのでパワポで作成することにしました。

#Androidアプリリリース時に必要な画像素材
(2021年10月現在)
– アプリのアイコン
– **フィーチャーグラフィック(Google Play ストアページの上部で使用されるんだと思います)**
– スマートフォン版のスクリーンショット
– 7インチタブレット用のスクリーンショット
– 10インチタブレット板のスクリーンショット

##パワポで作成する手順

1) パワポの 表示>スライドマスター を選択

![スライドマスタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875694/bcdba880-407f-cf6e-8f05-d3d7862d6d87.png)

2) スライドのサイズ>ユーザー設定のスライドサイズ を選

元記事を表示

Androidアプリがバックグラウンドの時にDialogFragmentを表示しようとして落ちる時に試したこと

# 概要
– アプリがバックグラウンド時にFragmentを追加・切替をすると落ちる・
– 回避する一つの方法として、
1. 親のFragmentがアタッチされているか判定。
1. `FragmentTransaction#commitAllowingStateLoss()`を使用してFragmentの状態を無視してcommitする。

:::note warn
Fragmentの状態を無視して実行しているのでonSaveInstanceStateを気にしている場合はこの限りではないです。
:::

# 詳細
アプリを使っていると非同期でデータを取得したタイミングで何か事を起こすことがあると思います。
私はよくそのタイミングでDialogFragmentを使っているのですが(これがよくない原因ですが)、DialogFragmentに限らずFragment全般に言えることで、アプリがバックグラウンド時にFragmentを追加や切替などを行うと大体`llegalStateException`が発生します。
原因は後述する[スタックトレース](#起きたエラーのスタックトレース

元記事を表示

OTHERカテゴリの最新記事