- 1. コルーチンとチャネル入門#3
- 2. Termux (Android版)にPowerline-Goを導入する
- 3. cordova+android SDKのコンテナ
- 4. Jetpack ComposeのNavigationを使うと遷移先の画面が繰り返し表示される問題
- 5. sealed classってめちゃくちゃ便利じゃない?
- 6. 【Kotlin】複数ボタンの同時タップを制御する
- 7. スマホアプリのコマンドビルドまとめ(Xamarin編)
- 8. FatでjavaなActivityのリファクタの進め方を検討したメモ
- 9. Androidの自動バージョンインクリメントをgradleのタスクで実行
- 10. CameraXでオートフォーカスが停止する
- 11. [Android] JCenter 依存解消でやったことメモ
- 12. Agora.ioを使ったAndroidの音声配信!
- 13. Galaxyのデバイスでspotifyがつかえなくなる問題
- 14. localhostで立ち上げアプリをスマホからアクセスする方法[Android , iPhone]
- 15. [Kotlin][Android] object と Serializable
- 16. Codelab から ViewModel と LiveData の Unit テストを学ぶ1
- 17. Androidアプリを開発する #4(DBの準備)
- 18. 【Android】特定のアプリがインストール済みかチェックする【カスタムURLスキーム】
- 19. Androidのgradle versionを上げたら起動しなくなった
- 20. コルーチンとチャネル入門#2
コルーチンとチャネル入門#3
ソース記事は[こちら](https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/03_UsingCallbacks)
# コールバックの使用
前回のソリューションは動作するが、スレッドをブロックし、そのためUIはフリーズする。これを避ける伝統的なアプローチはコールバックを使用することである。操作が完了した後に呼び出す必要があるコードを一直線に呼ぶ代わりに、それを別のコールバック、多くの場合はラムダであるが、に抜き出し、あとで呼び出すために、呼び出し側にラムダを渡す。
UIを機敏にするため、すべての計算処理をスレッドに分けるか、Retrofit APIに切り替えることができ、ブロッキング呼び出しの代わりにコールバックを使用し始める。
## バックグラウンドスレッドでの`loadContributers`呼び出し
まず初めに、すべての計算処理を異なるスレッドに移動してみよう。新しいスレッドを開始するには、`thread`関数を使う。
“`Kotlin
thread {
Termux (Android版)にPowerline-Goを導入する
初めてのQiita投稿になります。
文才がないのでおかしな文章になる場合がありますが、ご了承ください。
また、Markdown記法に慣れていないのでデザイン的におかしいところもございます。ご了承ください。# 今回行うこと
* AndroidにTermuxを導入する
* Termuxのシェルをzshに変更する
* Powerline-Goを導入する# このような方におすすめ
Androidでシェル使うし普段LinuxとかでPowerline-Go使ってるけど、わざわざQemuとかでLinux仮想立ててするほどでもないなー--と思ってる人# 必要なもの
* Androidスマートフォン or タブレット
※今回はXperia XZ (SO-01J、Android 7.0、root未取得)を使用しました。
* Termux **(Google Play版ではなく必ず公式GitHub or F-Droidのものを使うこと)**
※ 公式GitHub Releases:https://github.com/termux/termux-app/releases※以下root権限
cordova+android SDKのコンテナ
Cordova, Node.js, Android sdkを含んだ開発環境をコンテナで作成してみました。
android-sdkも入っているので、androidの実機動作までできます。# 動作環境準備
WSL2とDocker desktopをインストール(Windows環境です)
vscodeにRemote Developmentを入れおきます。# コンテナの起動
WSL2のシェルから次のコマンドを実行します
“`
$ git clone https://github.com/masahiro-999/cordova-container
$ cd cordova-container
$ code .
“`
VSCODEが開いたら、F1を押し、コマンドパレットで、Build and reopen in containerを実行これでCordovaの開発環境が起動します。
# サンプルアプリを実行してみる
以下は、Cordovaでサンプルアプリを実行する方法です。
## プロジェクトの作成
“`
$ cordova create hello-app
$ cd
Jetpack ComposeのNavigationを使うと遷移先の画面が繰り返し表示される問題
こんにちは。
最近は宣言的UIが流行っていますね。
Flutterでよく書いていてもう見慣れたのですが、初めて見たときはネストの量にギョッとした記憶があります。
最近はJetpack Composeに挑戦中です。
そんな中でログイン機能を実装していてどハマりしたので共有したいなと思い今回の記事を書くに至りました。まず状況として、「ログインしていない場合は上からログイン画面を被せる」という仕様を満たそうとした時に、ログイン画面が繰り返し表示されてしまう不具合にハマりました。
これが起きてしまった原因は、結論から言いますと、「Composable内で画面遷移をしようとしたから」です。
具体的にどんなコードを書いていたかというと、“`kotlin:HomeScreen.kt
@Composable
fun HomeScreen(
viewModel: HomeViewModel,
navController: NavController
) {
val uiState by produceState(
initialValue = Home
sealed classってめちゃくちゃ便利じゃない?
# 初めに
今回は、sealed classについて書いていきます。### sealed class
簡単にいうと***全然違う***`data`の型でもひとまとまりで持っておけるクラスです。
例えばですが、一つの`RecyclerView`で二種類のデータの型を表示したい時などに非常に役立つ機能です。
書き方は、以下の通りです。
“`kotlin
sealed class Example {data class hoge(
val sample: Sample
) : Example()data class huga(
val something: Something
) : Example()
}
“`
`Sample`と`Something`が全く別の`DataClass`でもひとまとまりに管理をすることができるので`RecyclerView`に対して`Example`クラスを渡すようにすればあとは中身を見て判断するように実装すればいいだけです。
もし、片方は何もデータを保持したくないのであれば`ob
【Kotlin】複数ボタンの同時タップを制御する
Androidアプリでユーザーが複数のボタンを同時にタップできないような制御を実装していきます。
下の画像のように`Button1`と`Button2`を同時にタップすると、ダイアログが2つ表示されてしまうことがあるため(ボタン2のダイアログを消したあとにボタン1のダイアログが表示される )、同時に複数のボタンをタップできないような制御が必要となります。また、`TabLayout`のタブに関しても同様に複数のタブを同時にタップできないよう制御が必要なケースもあり、Button時と実装方法が若干異なり、日本語での記事がなさそうだったので記載しておきます。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/037c26d1-73a6-cafa-cac7-860d80116f2b.gif)
## ボタンの同時タップ制御の実装
制御実装前のコード
“`activty_main.xml
<
スマホアプリのコマンドビルドまとめ(Xamarin編)
前回の『[スマホアプリのコマンドビルドまとめ(iOS編)](https://qiita.com/gremito/private/41cf9a0c8d27eccdf165)』に引き続き、今回は**XamarinのCI環境を作る際に溜まった知見**をまとめた記事です。
前提として、Mac mini/Mac Pro(ゴミ箱)などにCI環境を作り、その際にXamarinアプリの.ipa/.apkファイルをビルドする環境も作るときに必要な作業として淡々とまとめています。
## 環境
* macOS
* CI
* Jenkins
* Xamarin
* MyApp.iOS.csproj
* MyApp.Droid.csproj## `msbuild`と`xbuild`について
XamarinのアプリをCLIからビルドしたいと思い、『xamarin mac build command』という感じでググっていると`MSBuild`と`xbuild`についてちょいちょい出てきます。Xamarinなので記事が古いものが多く引っかかり、個人的に参考になった記事の中で[
FatでjavaなActivityのリファクタの進め方を検討したメモ
はじめまして。リファクタ勉強中のAndroidエンジニア5年生です。
テストがないFatなActivityのリファクタを進めるうえで検討した内容を残しておきます。
テストがないようなプロジェクトしか経験しておらずこの辺は勉強し始めたばかりです。いまはまだ小さめのクラスで試しただけのものなので、実際に運用するなかで得た知見があれば追記していきます。
ご意見・ご指摘あればお伝えいただけるととても嬉しいです。
# 背景
– 機能追加にあたってリファクタが必要だった。
– ロジックとかはActivityが持ってしまっている。
– javaで書かれているのでKotlinにしたい。
– テストがないのでテストを書きたい。# リファクタの流れ
1. リファクタ対象のActivityが動くシナリオでUIテストを書く。
2. Activityの子クラスを作り、既存コードからはそちらを参照させる。親クラスは抽象クラスにしておく。
3. ロジックはViewModel以下へ、UIの操作はすこしずつKotlin化して子クラスへ移動させていく。ViewModelにはテストを記述していく。##
Androidの自動バージョンインクリメントをgradleのタスクで実行
CIなどで自動化するときにバージョンもついでに上げたくなるのでこの設定で最近は落ち着いたので備忘録メモ
ktsしたいけど、taskはまとめてgroovyにまだしてる。アプリのbuild.gradleはktsが主流なのでそっちに合わせるってことで。appフォルダの下にversion.propertiesファイルを用意
“`version.properties
VERSION_NAME=1.0.0
VERSION_CODE=1
“`build.gradleに下記のtaskを用意
“`build.gradle
task updateVersion {
doFirst {
def pattern = “^(\\d+).(\\d+).(\\d+)”
def versionPropsFile = file(‘./app/version.properties’)
def Properties versionProps = new Properties()
versionProps.load(new FileIn
CameraXでオートフォーカスが停止する
## CameraXで継続的なオートフォーカスが停止する問題
AndroidのCameraXを利用していて何かをきっかけに継続的に動作しているオートフォーカスが停止してしまうことがありました。特に背面カメラでプレビューしている時にカメラを下に伏せて置いた後、持ち上げるとプレビューがぼやけたまま停止するケースが頻度が高いように感じました。
もしかするとスマホ(GalaxyS9)に依存した問題なのかもしれませんが、問題が解消した方法を共有しておきます。“`kotlin:CameraFragment.kt
@SuppressLint(“UnsafeOptInUsageError”) // ←追記
private fun bindCameraUseCases() {// 以上省略
// A variable number of use-cases can be passed here –
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.
[Android] JCenter 依存解消でやったことメモ
# はじめに
Android アプリではいろいろなライブラリをオープンなリポジトリからダウンロードして利用しています。
そのリポジトリの中に `JCenter` というモノがあり、[2021年5月で閉鎖するという発表](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)がありました。この `JCenter` というリポジトリ、大体の Android アプリで参照されてるんじゃないかってぐらい主要なリポジトリなので Android 界隈がざわつき、閉鎖期限の延長もされたのですが、あまりに影響が大きすぎたため閉鎖はされずに読み取り専用で存続することになりました。
(詳細については [コチラの記事](https://bps-tomoya.hateblo.jp/entry/2021/02/04/184317) がとてもわかりやすかったです。ありがとうございます。)
読み取り専用で存続することになったとは言え、またいつ方針が変わるかわからないので JCenter の依存を解消す
Agora.ioを使ったAndroidの音声配信!
こんにちは、AWAでAndroidアプリ開発をしている佐藤です!
このたび、AWAで音声配信機能がリリースされました :tada:https://www.cyberagent.co.jp/news/detail/id=27670
AWAの音声配信は自前で全て実装しているわけではなく、 [Agora.io](https://www.agora.io/en/) を使って実現しています。
そこで、Agora.ioを使って音声配信機能を実現する上での簡単なサンプルと、いくつかのハマりどころについて記載しようと思います。# 前置き
– 使用するバージョンは `io.agora.rtc:voice-sdk:3.5.0` です
– 音声配信のみです。動画配信はしていません
– Agora.ioへのユーザ登録は既に済ませているものとします# 実装する上で
Agoraはとてもサンプルが充実しており、日々アップデートされています。そのため、まずはサンプルを使って出来ることを把握しつつ、アプリに取り込む作業を行っていくと良いと思います。Androidのサンプルは以下にまとまっているので確
Galaxyのデバイスでspotifyがつかえなくなる問題
Galaxyのスマホ又はタブレットを使おうと考えている方へ。
Galaxyのスマホ又はタブレットではspotifyが正しく動作しません。
Issueについては英語ですが、ここなどを参照してください。
https://community.spotify.com/t5/Ongoing-Issues/Now-Playing-bar-missing-on-Android/idi-p/5364978タブレット購入の際などの参考になれば幸いです。
ちなみに、このバグはアプリを強制終了してもういちどアイコンをタップして起動する事で一時的に解消されます。
localhostで立ち上げアプリをスマホからアクセスする方法[Android , iPhone]
## 概要
開発中のWebサイトの表示確認を実機で手軽にできる方法を紹介いたします!
Android,iPhoneだと若干勝手が違うので詳しく解説いたします。## 今回使用した端末
[PC]
Mac Book Pro (Monterey)[スマホ]
iPhone SE2 (iOS 15)
Galaxy Note 8 (Android 8)## 前提条件
– PCとスマホが同じWifiに接続されていること
– PC上でローカルアプリが立ち上がっていること## 手順 [iphone]
### 準備
– 設定アプリを開く
– [Wi-Fi] -> 接続しているWi-Fiの「iアイコン」押下
– HTTPプロキシの「プロシキを構成」 -> 「手動」を押下
– 画像のようにlocalhostで立ち上がっているアプリの情報を入力
※サーバー、ポートの情報は各自の環境のものを入れてください
![IMG_9A37A159AA9C-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2580122/1
[Kotlin][Android] object と Serializable
## 状況説明
Android アプリ開発をしていて、ちょっと困った状況になりました。
すぐに解決したんですが、こんなことがあるのね、と勉強になったのでこれを書いています。その「ちょっと困ったこと」は Activity 間であるデータをやり取りしようとしていて起こりました。
### 渡すデータ
Activity 間でデータの受け渡しをするために、次のような sealed class を作成したとします。
(実際のコードとは異なります)“`kotlin
sealed class Answer : Serializable {
object Yes : Answer()
object No : Answer()
data class Other(val text: String) : Answer()
}
“`### 呼び出し側
`Answer` クラスは `Serializable` を実装しているので、 Intent の putExtra() に渡せます。
今回は仮に `Yes` を渡すことにします。“`kotlin
val int
Codelab から ViewModel と LiveData の Unit テストを学ぶ1
# はじめに
あまりテストを書いたことがないなぁということで休み中に Unit テストの Codelab をやってみました。
実際に手を動かしてみて自分的に学びになった箇所や途中で詰まった箇所をまとめたいと思います。## Advanced Android in Kotlin 05.1:Testing Basics
https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-basics?hl=ja#0## 気になったところ
### Page6
– `Hamcrest` を導入する場合は[こちら](https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all) を参照する
– 今回は2022/05/29時点で最新の `1.3` を導入
– Hamcrest を使う際に `assertThat` と `Matcher(is)` を使おうとしたらうまく import に引っ掛からなかったので以下を手動で入れ
Androidアプリを開発する #4(DBの準備)
# はじめに
今回はDB関連の部分を進めていきます.前回の記事はこちらからhttps://qiita.com/sekkenn1102/items/536af9f97edf76694c6e
# DBを触る準備をする
* 今回はroomというライブラリを使用していきます.[公式資料](https://developer.android.com/training/data-storage/room?hl=ja#components)があったので、指示に従い、build.gradleを初期状態からdependenciesに追加して最終的に下記に更新してビルドを走らせます.“`build.gradle(app)
dependencies {implementation ‘androidx.core:core-ktx:1.7.0’
implementation ‘androidx.appcompat:appcompat:1.4.1’
implementation ‘com.google.android.material:material:1.4.0’
【Android】特定のアプリがインストール済みかチェックする【カスタムURLスキーム】
# 実現したいこと
あるアプリにおいて、他の特定のアプリが端末にインストールされているかどうかを判別し、その結果によって処理を変えたい。
例)特定のアプリがインストールされているかを判別し、
– されている場合 → そのアプリを起動
– されていない場合 → Google Play Storeに飛ばしてダウンロードを促す## 自分の環境
– macOS BigSur 11.6.6
– Android Studio Arctic Fox | 2020.3.1 Patch 4
– Kotlin version 1.4.20# 前提
**カスタムURLスキーム(Custom URL Scheme)を利用した場合の解説をします。**
そのため、インストール済みかどうかチェックをされる側のアプリがカスタムURLスキームを設定している必要があります。例)
– YouTubeのURLスキーム → `vnd.youtube`
– Google MapのURLスキーム → `geo`自分で作成したアプリであれば自由にURLスキームを以下の方法で設定できます。
## Custom U
Androidのgradle versionを上げたら起動しなくなった
## Gradle versionをポチポチと最新版に変更
### gradle-7.0.2-all.zip -> gradle-7.4.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
-> distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip### gradle:7.0.4 -> gradle:7.2.1
classpath ‘com.android.tools.build:gradle:7.0.4’
-> classpath ‘com.android.tools.build:gradle:7.2.1’## 上げて動かそうとしたら。。。起動せず。
### Non-fatal Exception: java.lang.RuntimeExceptionMissing type parameter.
“`
Non-fatal Excepti
コルーチンとチャネル入門#2
※ソース記事は[こちら](https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/02_BlockingRequest)
# ブロッキング要求
自分のアカウントの下で要求を実行し、自分のパスワードと提供されたトークンを使う、開発者GitHub APIを使っていく。
GitHubへのHTTPリクエストを行うため、[Retrofit](https://square.github.io/retrofit/)を使っていく。それにより、与えられたオーガニゼーションの配下のリポジトリの一覧と、それぞれのリポジトリのコントリビューターの一覧を要求することができる。
“`Kotlin
interface GitHubService {
@GET(“orgs/{org}/repos?per_page=100”)
fun getOrgReposCall(
@Path(“org”) org: String
): Call>