- 1. 直近のUnity開発で困ったことの逆引きメモ
- 2. Android UIテストでActivityとFragmentにコンストラクタインジェクションする
- 3. Kotlin SAM変換(ラムダ式)を元に戻す
- 4. 【Android】APIのレベルによるエラーの対処方法
- 5. Android QのScoped StorageでJPEG/MPEG撮影→外部Storageに保存→EXIF編集
- 6. HiltViewModelでAbstractなViewModelをInjectしてみるチャレンジ
- 7. Dagger 2.31のAssisted Inject
- 8. ハッカソンでOSMを使いたかったので、別の投稿を参考にOSMDroidとMapQuestを使ってみた話
- 9. AAC の ViewModel で View のライフサイクルとリンクさせる時は OnLifecycleEvent でフックするといいよね、と言う話
- 10. AndroidTV9にadbでapkインストールし開くメモ
- 11. ピンあてゲーム「Hit and Blow」をFlutterでリリースした話【個人開発】
- 12. 【Android】AndroidセンサーAPIの種類
- 13. Flutter で仕事したい人のための Widget ツリー入門
- 14. 【Android】Code Reformatに関するメモ
- 15. Android初学者 adbコマンドでターミナルから操作してみた
- 16. Windows10 adbコマンドを実行できるようにする
- 17. kotlinx-coroutines-testのrunBlockingTestについて
- 18. 【Android】Android Studioで使えるショートカット(Windows)
- 19. ViewのonDrawでいくつかアークの円を描く
- 20. 【Android】【初心者】Custom Viewの作り方
直近のUnity開発で困ったことの逆引きメモ
メモ書きですが、どなたかのお役に立てれば幸いです。
##NavMesh
####NavMeshAgentのキャラクターの動きを改善する
こちらを使わせていただくとイイカンジに動きます。感謝!!
[NavMeshAgentでよい感じにキャラクターを歩かせる – tanaka’s Programming Memo](https://am1tanaka.hatenablog.com/entry/2018/08/20/133619)####NavMeshをランタイムで動的に生成(Bake)する
[NavMesh Components](https://github.com/Unity-Technologies/NavMeshComponents)を入れるとNavMesh Surfaceが使える。
これをNavMeshを生成させたいオブジェクトに入れ、任意のタイミングで定期的にNavMeshをBakeさせればよい。
しかし、定期的にBakeすると、その都度Agent(キャラクター)の座標が変わってしまうことがあるので注意。[Unity:動的NavMeshの確認 – simplesta
Android UIテストでActivityとFragmentにコンストラクタインジェクションする
DIの仕組みが導入されていないAndroidプロダクトでのUIテストは、Activity・Fragmentからアクセスされる外部依存の差し替えをどうするかが課題になる場合があります。
テスト実行時にはアクセスしたくない依存がある場合(例:API通信)、これに当てはまります。ここではコンスタラクタとデフォルト引数を駆使しながら、テストコード上で依存を差し替えできるようにする方法について紹介します。
## ActivityとFragmentのコンストラクタインジェクション
ActivityとFragmentは基本的にカスタムのコンストラクタを作成しません。
システムによって引数を持たない空のコンストラクタからインスタンスが生成されるためです。一方、カスタムコンストラクタの引数にすべてデフォルト値をセットした場合は、引数なしのコンストラクタを追加で生成します。そのコンストラクタからインスタンスを生成したときは、プロパティはデフォルト値で設定されています。
これを利用して、プロダクトコードではデフォルト引数の値を参照し、テストではコンストラクタから実装を差し替えるようにすること
Kotlin SAM変換(ラムダ式)を元に戻す
金田著「[はじめてのandroidプログラミング 第5版](https://www.sbcr.jp/product/4815607968/)」を使って、勉強しています。
「第8章タイマーを使ってスライドショーを実装する」で使っているテクニックを解析してみます。
今日のテーマは、「SAM変換を元に戻す」です。初心者にとって、ラムダ式は難しいですよね。javaのインターフェースでメソッドをひとつしか持たないものをSAMインターフェースと呼び、KolinではSAMインターフェースを引数としたメソッドを、ラムダ式で置き換えることができます。これをSAM変換といいます(本書p121から引用)。
そこで、SAM変換しているコード、変換を使わない元のコードに戻してみようと思います。
以下、本書を持っている前提で説明します。本書を使って勉強中の方、一緒に勉強しましょう。##0.前提
p227まで写経が済んでいるとします。##1.原型
p227まで写経が済んでいる状態のコードを示します。説明に不要な部分は、著作権に配慮して省略しています。“`MainActicity.k
【Android】APIのレベルによるエラーの対処方法
#プログラミング勉強日記
2021年1月19日
最近Android開発をしていて、普段と違うAndroid端末を利用したときにエラーが出た。その解決方法を示す。#エラー内容
Android端末のAPIよりもプロジェクトのAPIの方が新しく、このエラーが出た。なので、プロジェクトのAPIをAndroid端末のAPIに合わせることで解決する。“`
Session ‘app’: Installation did not succeed.
The application could not be installed: INSTALL_FAILED_OLDER_SDK
“`#解決方法
##1. 必要なSDKをインストールする
`ツール→SDKマネージャー→Android SDK`から選択して端末と同じSDKをインストールする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/58bc76f9-ac54-3978-1677-97ffa8171e8b.png)
Android QのScoped StorageでJPEG/MPEG撮影→外部Storageに保存→EXIF編集
# TL;DR
Android QからScoped StorageのFeatureによってCameraで撮影したJPEG/MPEGを外部ストレージ直下の任意Directoryに保存することができなくなりました.
`DCIM`や`Picture`/`Video`のような汎用Directoryに保存することになりますが,それでもAndroid PまでのようにExternal StorageのPathに直接ファイルを保存することはできません.
そのため,`MediaStore` (`ContentProvider`/`ContentResolver`)を使ってExternal Storageの汎用Directoryにファイルを保存するようにします.
撮影したJPEGのEXIFを`ExifInterface`で自力で編集している場合も直接External StorageのPathからは読み書きできないので,`MediaStore`経由で読み書きするようにします.
# Permissionについて
Android PまではExternal Storageへの保存のために,↓ の宣
HiltViewModelでAbstractなViewModelをInjectしてみるチャレンジ
ちょっとHiltViewModelで何ができて何ができないのかわからないので調べてみましょう。
HiltViewModelは基本的にはこういう感じで利用できます。
“`kotlin
val viewModelHilt: VideoPlayerHiltViewModel by viewModels()
“`“`kotlin
@HiltViewModel
class VideoPlayerHiltViewModel @Inject constructor(val videoPlayer: VideoPlayer) : ViewModel() {
}
“`https://github.com/takahirom/hilt-sample-app のComponent図です。(arunkumar9t2/scabbardによる生成 )どうやらActivityRetainedComponentの下にViewModelのComponentがいるようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazo
Dagger 2.31のAssisted Inject
例えば、動画を再生しているアプリで、このVideoのIDの動画を再生したい!みたいなときにViewModelにidを渡したくなったりしますよね?そしてそのViewModelに**Repositoryとかのインスタンスをinjectしつつ、videoIdを渡してvideoIdがNullableであるとかlateinitであるとかを意識せずに簡単に使えるようにしたい**ですよね。これができるのがAssited Injectです。
これを使うとコンストラクタに自分で指定した引数を追加することができるのでNullableやlateinitにせずに引数を追加できます。
この用途に、これまでsquare/AssistedInjectを使っていましたが、Dagger 2.31でこの機能が追加されました。# コード
基本的にinterfaceでFactoryを作ってそれに`@AssistedFactory`をつけて、そこに渡したい引数を追加したメソッドを追加し、作りたいクラスのコンストラクタに`@AssistedInject`をつけて、カスタマイズしたい引数に`@Assisted`をつけるだけで
ハッカソンでOSMを使いたかったので、別の投稿を参考にOSMDroidとMapQuestを使ってみた話
ハッカソンで、OSMつかって経路出したいねーなんてメンバーと話をしていて、その為にちょっとやってみたのでメモついでにまとめておく。
#参考にした記事
– [Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d)
– [HowToInclude](https://github.com/MKergall/osmbonuspack/wiki/HowToInclude)参考にした [Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d) はJavaだったので、Kotlinで書きながら実装してみた。
実際の実装は参照元を参考してもらうとして、実際にこの記事でつまづいたことなどを補足していきます。
参考にした記事を投稿してくれた方には感謝!#[Androidで道案内アプリケーションを作る](https://qiita.com/ryein/items/a6a13420f5aadd62978d)の補足
AAC の ViewModel で View のライフサイクルとリンクさせる時は OnLifecycleEvent でフックするといいよね、と言う話
タイトルがここで言いたい事の全てです:innocent:
Android における ViewModel 側で onCreate 等のライフサイクルが走った時に何かしたい、みたいなシーンは結構あると思います。
(例えばユーザ情報を fetch する、とか)そういった時どうやって ViewModel 側にイベントを通知するかと言うと
“`SampleActivity.kt
class SampleActivity: AppCompatActivity() {
private val viewModel: SampleViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
viewModel.onViewCreated()
}
}
“`“`SampleViewModel.kt
class SampleViewModel: ViewModel() {
AndroidTV9にadbでapkインストールし開くメモ
#はじめに
某中国電機メーカーのスティックAndroidTV買った。
自分はお初AndroidTVでは無いが、最近のAndroidTVに野良apkをadbで入れても自動的にAndroidTV HOME Launcherに登録はされないことを思い出した。
検索しても日本語の記事が無かったようなので、今更ではあるがそれの開き方のメモである。#adbでアプリインストール
分からない場合はここを参照。
https://developer.android.com/studio/command-line/adb?hl=ja※AndroidTVは基本的にUSBでadb接続できない機種が多い。そのためTCP/IPで接続を行う。
**インストールしてもadbからの指示で起動はできるが、Launcher自体に登録されない。**
#開き方
今回はその某中国電機メーカーのスティックAndroidTVでやっていく。
サンプルとして今回はCPU-Zを開いてみる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c
ピンあてゲーム「Hit and Blow」をFlutterでリリースした話【個人開発】
## 概要
* アプリの説明
* 作ろうと思ったきっかけ
* Hit and Blowってどんなゲーム?
* Flutterでどう実現するか
* リリース準備について!
* 現状・今後実現していきたいこと、意気込み
* 最後にはじめまして[tomo](https://twitter.com/tomoDev_)と申します。
インターン生として大阪のスタートアップでエンジニアをしながら個人開発をしている大学生です。
Qiita初投稿になります!
自分と同じようにアプリを作る方またこれからアプリを作りたいと思っている方に向けて何かのヒントになれば嬉しいです!## リリースしたアプリについて
[Hit and Blow(ヒット&ブロー)](https://play.google.com/store/apps/details?id=com.tomoyaNakano.HitandBlow)
というピンの色を推測するゲームです。シングルプレーヤーゲームでアプリ自体は3ヶ月ほど前にリリースしました。
Nintendo Switchの世界のアソビ大全51というゲームに搭載されてい
【Android】AndroidセンサーAPIの種類
#プログラミング勉強日記
2021年1月18日
Android端末には様々なセンサーが搭載されている。具体的には温度や方位、方角、明るさ、傾き、加速度センサーなどがある。そういったセンサーを使うために必要なセンサーAPIについてまとめる。#AndroidのセンサーAPI
Androidでは、センサーによって変換された電気信号を取得するためのセンサーAPIが提供されている。このAPIによってセンサーを用いたアプリを簡単に開発できる。
android.hardwareパッケージには、SensorManager、Sensor、SensorEvent、SensorEventListenerの4つのセンサーAPIが提供されている。##SensorManager
センサーにアクセスするためのクラス。各センサーのイベントリスナーの登録や解除、センサーの情報の取得を行う。“`java:SensorManagerクラスのメソッド
// イベントリスナーを登録するメソッド
registerListener(SensorEventListener listener, Sen
Flutter で仕事したい人のための Widget ツリー入門
ご存知の通り、 Flutter は Widget を入れ子の構造で記述することで UI を構築します。
“`dart
Center(
child: Column(
children: const[
Text(‘Hello, Flutter!’),
SizedBox(height: 16),
Text(‘This is my first app.’),
],
),
),
“`Flutter の Widget 同士の関係は、このようなソースコードの形状から「入れ子」の構造をイメージしがちですが、 Flutter の仕組みを理解する上では、このソースコードから Widget の __ツリー構造__ がイメージできるようになっておくと何かと役に立ちます。
この記事では、Flutter の仕組みを説明する上でよく使われる __「Widget ツリー」__ について、初学者向けに基本から解説していきたいと思います。
# なぜ Widget ツリーを理解するのか
例えば「中央寄せしたければ `Center`
【Android】Code Reformatに関するメモ
# XML
– タグの一番初めの行を改行していてもReformatされないようにする:
Code Style→XML→Other→Keep line breaksにチェックを付ける– スラッシュの手前にスペースを入れない:
Code Style→XML→Other→In empty tagのチェックを外す![スクリーンショット 2021-01-18 15.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/3dc51e78-cdae-4fe6-b8c1-fcc19397bf82.png)
# Kotlin
– コメントの前の行を勝手に改行させない:
Code Style→Kotlin→Blank Lines→Before declaration with comment or annoationを0にする![スクリーンショット 2021-01-18 15.41.49.png](https://qiita-image-store.s3.ap
Android初学者 adbコマンドでターミナルから操作してみた
adbコマンドを使ってターミナルからAndroid端末を操作してみた。
## インテント直で投げる
`adb shell am start -n パッケージ名/アクティビティクラス`“`java
adb shell am start -n com.example.bookmanager_android/.MainActivity
“`上記を叩くと端末を触らなくてもbookmanagerアプリのMainActivityが開く。
`Security exception: Permission Denial`が出た場合
AndroidManifestファイルの開きたいアクティビティ部分に`android:exported=”true”`を追加する。## 端末にまかせる
`adb shell am start -a アクション -d URL`“`java
adb shell am start -a android.intent.action.VIEW -d http://www.google.com/
“`
上記を叩くと端末を触らなくてもgoogleサイトが開く。
Windows10 adbコマンドを実行できるようにする
# 目的
– Windows10のPCでadbコマンドを実行できるようにする方法をまとめる
# 方法
1. 下記にアクセスする。
– [https://developer.android.com/studio/index.html](https://developer.android.com/studio/index.html)
1. 「DOWNLOAD ANDROID STUDIO」をクリックする。![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/587d653b-e402-60dc-b1a0-c8dd73e220f0.png)
1. 利用規約に目を通し同意するなら「上記の利用規約を呼んだうえで利用規約に同意します。」にチェックを入れ「ダウンロードする」をクリックする。
![キャプチャ (1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f
kotlinx-coroutines-testのrunBlockingTestについて
前回に引き続きCoroutinesの単体テストの話です。
[https://iwsksky.hatenablog.com/entry/2020/12/09/014603:title]
今回はrunBlockingTest[1]について取り扱いたいと思います。
⚠理解が曖昧な状態で記述している可能性があります、間違いがあれば訂正お願いします。
## 環境
implementation “org.jetbrains.kotlin:kotlin-stdlib:1.4.20”testImplementation “org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.9”
## runBlockingTestとは
kotlinx-coroutines-testに含まれるAPIでrunBlocking同様に現在のスレッドをブロックしてコルーチンを起動することが可能。“`kotlin
@ExperimentalTime
@Test
fun exampleTest() = runBlocking {
val deferred =
【Android】Android Studioで使えるショートカット(Windows)
#プログラミング勉強日記
2021年1月17日
基本的なショートカットしか使っていなかったけど、使って便利だと思ったショートカットをまとめる。#個人的に覚えておきたいショートカット
| 説明 | ショートカットキー |
|:–:|:–:|
| クラス、ファイルなどを全体から検索 | shift +shift |
| タブの移動 | Alt + → / Alt + ← |
| 戻る | Ctrl + Alt + ← |
| 進む | Ctrl + Alt + → |
| 1行削除 | Ctrl + Y |
| アプリをビルドして実行 | shift + F10 |
| 行またはブロックのエラーの修正方法を表示 | Alt + Enter |
| 名前の変更 | shift + F6 |
| プロジェクトのクイック修正 | Alt + Enter |
| 置換 | Ctrl + R |#参考文献
[キーボード ショートカット](https://developer.android.com/studio/intro/keyboard-shortcuts?hl=ja)
ViewのonDrawでいくつかアークの円を描く
onDraw()を通じて、いくつかアークの円を一緒に描きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906922/b6fabf94-e29c-af54-349b-b3371cd9d2cd.png)
###Viewのサブクラスを作る“`
class MyPieView(context: Context?, attrs: AttributeSet?):
View(context,attrs){override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
}
}
“`
###Viewを作る時、普段はdpを使います。
KotlinのExtension Functions/Propertiesでpx→dpに切替“`
val Float.px
get()=TypedValue.applyDimension(
TypedValue.COMPLE
【Android】【初心者】Custom Viewの作り方
#【Android】【初心者】Custom Viewの作り方
## 概要
オセロのアプリを作ってみようという思いで、オセロの初期状態のレイアウトを独自Viewで、作ってみたので、Custom Viewの作りかたのまとめという感じです。
大した内容ではないです、すみません。
基本的には、Android Developerの[カスタムビュー コンポーネント](https://developer.android.com/guide/topics/ui/custom-components)の項目を参照して作成しました。## 作成したレイアウト
## 作成手順
大まかな手順としては、以下の3つでした。
1. Viewを継承した独自Viewのクラスを作成
2. XMLから作成したViewを取得できるように、