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

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

【Kotlin Coroutine】コルーチンのキャンセルと再開処理

# この記事について
今回は、Android開発におけるメジャーな非同期処理方法である「**Kotlin Coroutine**」を用いて、ライフサイクルに応じたキャンセル処理と、非同期処理の再開方法を記事にしていきたいと思います。

# Coroutineのキャンセル
まずは、Coroutineのキャンセル方法について見ていきましょう。
API通信におけるCoroutineの使用を例にとって解説します。
ちなみに、本記事ではMVVMを採用し、ViewModelから非同期処理を開始するケースで話を進めていきます。

“`MyViewModel.kt
/**
* API通信結果を取得
*/
fun getApiResult() {
viewModelScope.launch {
withContext(Dispatchers.IO) {
repository.accessApi()
}
}
}
“`

`viewModelScope.la

元記事を表示

AndroidのプロジェックトをGitHubにあげる時のテンプレート(gitignoreとかcommitテンプレートなど)

# Android studio templates
Android studioのプロジェクトファイルをGithubにあげる時によく使用するファイルを備忘録的にあげておきます
もともとGitHubのREAD.mdに書いてたのでこっちにも上げときます
https://github.com/blue928sky/AndroidStudioTemplates

# テンプレート

## READ.md
[README.md](https://github.com/blue928sky/AndroidStudioTemplates/blob/master/templates/README.md)
README.mdのテンプレート
Google play storeのURLとアプリ名、簡単な説明、詳細説明を記入

“` markdown:READ.md
## Google Play Store
https://play.google.com/store/apps/details?id={package id}

## アプリ名

## 簡単な説明

## 詳しい説明
“`

## READ

元記事を表示

Google Play StoreとAppGallery両方にアプリをリリースした場合、アプリのアップデート方法について考案しました

Google Play StoreとAppGallery両方にアプリをリリースした場合、アプリのアップデートロジックもそれに合わせてカスタマイズしなければなりません。

もし、アップデートのリンクをGoogle Play Storeに固定させてしまったら、Google Play Storeが入っていないHMS端末ではアプリがアップデートできないことが生じてしまいます。

# Google Play StoreとAppGallery両方にアプリをリリースした場合のアップデートのソリューション

### ソリューション1
GMSとHMSがあるかないかでアップデートリンクを分けます。

“`kotlin
private fun updateAppByCheckingService() {
// GMSの存在確認
val googleResult = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this)

// HMSの存在確認
val huaweiResult = Hu

元記事を表示

Flutterで、通信処理を行う

前回の記事で、[Flutterで、JSONを処理する](https://qiita.com/shimizu-you/items/f9197719557b258839b2)を記事にしたのですが、それをベースに通信処理を行いたいと思います。

### JSONサーバーの準備

[My JSON Server](https://my-json-server.typicode.com/)を使用します。
こちらは、自分のGithubにjsonを用意することで、jsonのレスポンスを取得出来るサービスです。
特にサーバを用意することなくJSONのレスポンスを受け取れるので、非常に便利です。

まず、自分のGithubにpublicなリポジトリを用意します。
そこにdb.jsonファイルを作成します。Github上では、[Add file -> Create new file]で作成出来ます。

“`json:db.json
{
“gets”: [
{
“userId”: 1,
“id”: 1,
“title”: “user 1”,

元記事を表示

Flutterで、JSONを処理する

Android Studioで、Flutterを使ってJSONを扱う方法。
色々なサイトで、記載されているのですが、記載している内容にばらつきがあり、ビルド出来ないものがあったりと大変だったので、記事にしました。

### 必要なものを定義

JSONを扱うプラグインは、色々あるのですが、今回は“`json_annotation“`と“`json_serializable“`を使用します。

“`yaml:pubspec.yml
dependencies:
json_annotation: ^4.1.0

dev_dependencies:
build_runner: ^2.1.2
json_serializable: ^5.0.2
“`

### モデルを定義

“`dart:user.dart
import ‘package:json_annotation/json_annotation.dart’;

part ‘user.g.dart’;

@JsonSerializable()
class User {
int userId;
int id;

元記事を表示

2021年に Android 2.3.3 (API 10) のアプリを作ろうとしてハマったところのメモ


————————————————–
* 一度、最新や新しめの AndroidStudio を入れると、ライブラリのバージョンが上がってしまう。そのため、後から古い AndroidStudio を入れても、最新のライブラリを使おうとして動かないプロジェクトを作成してしまう。
* 古い AndroidStudio で新規作成したプロジェクトでなければならない(という結論に私は至りました)
* `Suggestion: use tools:overrideLibrary=”android.support.v7.appcompat” to force usage` とエラーメッセージに出るのですが、それを入れていっても最終的にクラスが定義されていないエラーが出てしまう。

関連エラー等メモ
————————————————–
### FragmentManagerImpl が見つからないエラー
`java.lang.NoClassDefFoundError:

元記事を表示

[android]DataBindingでcouldn’t make a guess forが出て困った話

こんにちは。
皆さんは[DataBinding](https://developer.android.com/topic/libraries/data-binding?hl=ja)、使っていますでしょうか。
とても便利で、僕は使っています。
まだ新米エンジニアなものですから、まだ覚えたてなのでこれからcomposeに置き換わって使う機会がなくなっていくと思うと寂しさが募るあまりです。


そんなこんなでこの間出会ったエラーを紹介します。

__Cause: couldn’t make a guess for 〜〜.entity.item__

xmlファイルにdataclassやviewmodelの変数を用意してそこに丸ごとつっこむやり方で起きたエラーです。
何やら記述されているクラスに対して推測ができないといったことが書いてあります。
パッケージを辿ってこれがどんなクラスなのかstudio は理解している(item.○○ といったプロパティアクセスができる)のに、このようなエラーが吐かれてしまいます。

調べてみたところ、これは[kotlinの命名規則](https://kot

元記事を表示

retrofit2とmoshiとenum

若干詰まったので、備忘録

# やりたかったこと
retrofit+moshiで、APIのレスポンス(json)をenumとしてデシリアライズして返してほしい

# 例:月の和名を返すAPI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472695/47105826-7204-616e-7013-0e6268685e6f.png)

アプリ側から月(1~12)をサーバにリクエストすると、レスポンスとして月の和名が返却されるような連携があり、
アプリ側とサーバ側の双方で、返却値としてのEnumが定義されている前提。

|定数|値|
|—|—|
|MUTSUKI|0|
|KISARAGI|1|
|YAYOI|2|
|UDUKI|3|
|SATSUKI|4|
|MINADUKI|5|
|FUMIDUKI|6|
|HADUKI|7|
|NAGATUKI|8|
|KANNADUKI|9|
|SHIMOTUKI|10|
|SHIWASU|11|
|UNKNOWN|12|

#### フォ

元記事を表示

Flutter 検索バー作成

#背景

以前書いた記事
[flappy_search_barの使い方](https://qiita.com/mkurom/items/e94b60eea15d4239ac43)
で使用したライブラリーがDISCONTINUEDになったことと、やりたかったことができない部分があったので、自作してみた。

#環境

PC : macOS Big Sur(インテルCPU)
エディター : Visual Studio Code
Flutter : 2.2.1

#状態管理
provider + changenotifier

#コード

“`main.dart
import ‘package:flutter/material.dart’;
import ‘package:provider/provider.dart’;

import ‘search_bar/my_app.dart’;
import ‘search_bar/search_controller.dart’;

void main() {
runApp(
MultiProvider(
provide

元記事を表示

【備忘録】bundletool を使った Play Asset Delivery 対応の Android App Bundle の検証手順まとめ

# 略称

– PAD:Play Asset Delivery
– AAB:Android App Bundle

# ■ はじめに

CIやデプロイのツール上で走らせたかったので bundle ツールを使った検証手順を調べていましたが、情報が少なく自分が困ったので情報としてまとめておこうと思いました。

# 前提条件

PAD のシステムについては詳しく記載しません。
予めご了承ください。

# ■ 配信方法のおさらい
PAD には3種類の配信方法がある。

– install-time 配信
アプリ起動時に既にインストールされていることが保証されている配信方法。
APK の assets フォルダに該当する。

– fast-follow 配信
ストアからアプリをダウンロード後にダウンロードが開始される配信方法。
アプリ起動時にダウンロードが終わっている保証が無いため、ダウンロードが完了しているか確認する必要がある。

– on-demand 配信
アプリ起動後からダウンロードが開始される配信方法。
fast-follow 配信同様にダウンロードが完了しているか確認する必要がある。

元記事を表示

Hilt + Retrofit2 + Moshi + Kotlin を使って通信するまで

以前、[Dagger2 + Retrofit2 + Moshi + Kotlin を使って通信するまで](https://qiita.com/shimizu-you/items/216d875b49742f73eb86)を記事にしましたが、DaggerにHiltが追加されたので、Hiltで実装した内容を記載します。

### 導入

“`gradle:/build.gradle.kts
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath “com.android.tools.build:gradle:7.0.2”
classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31”
classpath “com.google.dagger:hilt-android-gradle-plugin:2.38.1”
}
}

元記事を表示

[Unity] Unityビルド時エラーExecution failed for task ‘:app:lintVitalRelease’の対処 [gradle]

# 概要
Unityビルド時以下のエラーがでた時の対処を記述しています。

“`
Execution failed for task ‘:app:lintVitalRelease’
“`

## 対応策1
プロジェクトルートファルダにある「temp」フォルダ削除、Unity再起動

## 対応策2
以下の設定を行う。
2019だと
File → 「Builde Setting」→ 「Project Setting」 → 「Pulishing Settings」 → 「Custom Main Gradle Template」 のチェック入れるとandroidフォルダ以下に「maintemplate.gradle」ファイルが生成されるのでそれを修正する。

“`maintemplate.gradle
android {
lintOptions {
abortOnError false
disable ‘InvalidPackage’
checkReleaseBuilds false
}
}
“`

元記事を表示

Pepper SDK入門(31) AnimateとAnimationでPepperのanima(魂)を疑似体験する

#はじめに
今回はQiChat MANIAXではなく、Pepper SDK入門の続きです!
腕や頭部、腰、ひざの他、ホイールを使った動きや事前に定義した軌道上を移動するような動作を作るAnimate、及びAnimationについて書いていきます✏️
アニメーションはタブレットにもスマートスピーカーにもないもので、PepperをPepperたらしめるものすごーーーーく大事な機能です!!!!
基本的な実装はこちらになります↓

“`java
//アニメーションのオブジェクトを作成
Animation myAnimation = AnimationBuilder.with(qiContext)
.withResources(R.raw.dog_a001)
.build();

//アクションをビルド
Animate animate = AnimateBuilder.with(qiContext)

元記事を表示

XiaomiADBFastbootToolsが文字化けしていたときの対処法

私の使っているスマホ、RedmiNote9Tで充電ケーブルを挿すたびに画面が暗転しめっちゃ早く充電してまっせ〜!感を出すだけのこの表示を消したいと思いXiaomiADBFastbootToolsをインストールしてみました。

XiaomiADBFastbootTools

https://smartasw.com/archives/8039

サイトの通りにJava SE v17をMacにインストールし再起動してからXiaomiADBFastbootToolsを起動すると以下のように文字化けをしてしまいました。
AlertDialogのカスタマイズその2:戻り値を受け取ろう

[前の記事]()では`AlertDialog`に引数を渡す方法を紹介しました。
今回は逆に`AlertDialog`から戻り値を受け取る方法について触れてみたいと思います。

# 作成するサンプル
Dialog上に`EditText`を配置し、そこで入力された値を`MainActivity`で受け取り、`TextView`に表示するアプリを作ります。
![アプリ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073313/13e3b6af-788c-bab9-5ff3-f455c489fee8.gif)

# 実装方法
それでは実装方法を見てみましょう。

## MaterialAlertDialogBuilder()を使う(コードで実装)

`Dialog`を表示するボタンがクリックされた時のサンプルは以下の通りです。
ここでは`コンテンツエリア`に表示するレイアウトは全てコードで実装します。

#### MainActivity.kt

“`kotlin
class MainActivity

元記事を表示

【Android】JUnit5で複数の引数パターンに対しParameterized Testを行う

# 概要

複数の引数を取り、組み合わせに応じて返す結果が何パターンもあるとき、
1つ1つテストを書いているとコード量が多くなってしまいます。
そこでParametrised Testを使います。
引数のパターン数だけ用意すれば、一つのメソッドをそのパターン数分だけテストしてくれる優れものです。

Android-Kotlinの単体テストにはJUnit5を使います。

## JUnit5導入

build.gradle(トップレベル)

“`gradle
dependencies {
classpath “de.mannodermaus.gradle.plugins:android-junit5:1.4.2.0”
}
“`

build.gradle(app)

“`gradle
dependencies {
testImplementation ‘org.junit.jupiter:junit-jupiter:5.5.2’
testImplementation ‘org.junit.jupiter:

元記事を表示

Android12 SplashScreenAPIを触ってみた

Android12のアップデートがそろそろとなっている中、今更ながらにAndroid12(targetSDKVersion31)から利用できるSplashScreenAPIを触ってみました。

SplashScreenとは?

アプリが実行されていない時(コールドスタート)にSplash画面が表示される。
デフォルトではアダプティブアイコンの設定が引き回されるので、何も設定しなくてもアイコンがちゃんと設定されていれば表示はされる。
背景色に関してはandroid:windowBackgroundの属性を設定していればそちらの色設定で表示される。
別Activityを作成してSplashを作成していなければ、特に問題にはならなさそうです。

https://developer.android.com/about/versions/12/features/splash-screen?hl=ja

どんなカスタマイズができるか?

targetSDKVersionを31にすると下記の要素が設定できるようになります。

xmlのテーマで設定できる項目

元記事を表示

UnityアプリにAndroidのシステム権限を持たせる方法

# 概要
Unityで作成したAndroidアプリにサイレントインストール機能やアンインストール機能をはじめとした、「システム権限がないと実行できない機能」を使いたい時があると思います。こちらの設定方法について解説します。

# 設定方法
AndroidManifest.xmlの先頭に以下のコードを入力してください。

“`

“`

利用する端末、目的等では別途追記する項目があるかと思います。

“`
android:sharedUserId=”android.uid.system”
“`

こちらのコードを先頭に追記するだけで、システム権限を要する処理をAndroid上で行える様になります。

以上で設定完了となります。
また、Android端末にインストールするには署名を行う必要があります。

元記事を表示

android:exported=”false” とはどういうことか?

Android 12から「コンポーネントのエクスポートの安全性を改善」ということで、インテントフィルタを持つ、Activity/Service/BroadcastReceiverに対して、`andorid:exported`属性を明示的に宣言する必要があります。

https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja

> Android 12 をターゲットとするアプリに、インテント フィルタを使用するアクティビティ、サービス、またはブロードキャスト レシーバが含まれている場合は、それらのアプリ コンポーネントで android:exported 属性を明示的に宣言する必要があります。
>
> 警告: インテント フィルタを使用するアクティビティ、サービス、またはブロードキャスト レシーバが android:exported の値を明示的に宣言していない場合、Android 12 を実行しているデバイスにアプリをインストールできません。

さて、この`android:exported`ですが

元記事を表示

Jetpack Compose で Firestore のサブスクリプションを利用する

## はじめに

Jetpack Compose には React のフックに似た仕組みがあり、その仕組みを利用することで Firestore のサブスクリプション周りの雑多な処理を関数として抜き出すことができます。

## 実装

次のコードは、`messages` コレクションに何らかの変化があったときにメッセージのリストを再生成する関数です。

“`kotlin
data class Message(
@DocumentId val id: String = “”,
val sender: String = “”,
val receiver: String = “”,
val content: String = “”,
)

@Composable
fun rememberMessages(): List {
val messages = remember { mutableStateListOf() }

DisposableEffect(Unit) {
val registration = Firebase

元記事を表示

OTHERカテゴリの最新記事