- 1. JenkinsでGitHubからUnityビルドと結果を通知自動化メモ
- 2. NestedScrollViewの孫要素にandroid:layout_height=”match_parent”が効かずハマった。
- 3. PCでAndroid端末を操作する(画面・音声のミラーリングとPC上での操作)
- 4. Android StudioをIntelliJ公式プラグインで日本語化する
- 5. 【Android / Kotlin】Rx を理解する(ストリーム編)
- 6. Android Studioのログが流れない場合の対応
- 7. Android ビルドは成功するけど「App Name has stopped」となる(Failed resolution of: Lcom/google/firebase/iid/FirebaseInstanceId)
- 8. 【備忘録】Androidで魔法を使っているみたいなタッチエフェクト
- 9. ActivityResultContract を使って外部のカメラアプリで写真を撮影する (アプリ固有ストレージを使う方法)
- 10. Android(kotlin)プログラミングで画像をDrawableからファイル名で取得したい!
- 11. Custom view XxxView overrides onTouchEvent but not performClick って怒られるケースについて
- 12. Android 「No cached version of xxxx available for offline mode.」の解決法
- 13. AndroidのダイアログにEditTextを追加する方法
- 14. Android: アプリ外からアクセスできるように画像を保存する (対象範囲別ストレージ対応)
- 15. IP Webcamを使う
- 16. Android: アプリ外の画像一覧を取得する (対象範囲別ストレージ対応)
- 17. Android: ActivityResultContracts.RequestPermission でパーミッションを要求する
- 18. 【Android】Mockito(Mockito-Kotlin) の基本的な使い方
- 19. Spannableを使ったTextViewでEllipsizeを実現する
- 20. viewModelScope のキャンセルと onSaveInstanceState の順序
JenkinsでGitHubからUnityビルドと結果を通知自動化メモ
ビルド用スクリプト作成
—
**ApplicationBuilder**スクリプト作成し**Editorフォルダー**のしたに置く**注:**個人の場合、仕様の必要で、プロジェクトが**確認用バージョン**と、**本番用バージョン**に分けてるため、バンドルIDを指定しています。
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;public class ApplicationBuilder
{
//ipa出力先
private static string locationPathName;
//バンドルID
private static string bundleIdentifier;
NestedScrollViewの孫要素にandroid:layout_height=”match_parent”が効かずハマった。
NestedScrollViewの孫要素にレイアウトの残りを全て埋めてもらおうとしたら、思いの外ハマってしまったので備忘録として。
##経緯
・NestedScrollViewで要素を囲んでいる既存のViewに、CustomViewを追加し、残っていた隙間を埋めたかった。##スタートとゴール
(あくまでイメージなので適当なViewで構成しています。)こんな感じのViewがあって
![スタート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773816/da7f4c3f-1082-379c-ae3e-fbb6e5cea972.png)こんなソース。
“`sample.xml
PCでAndroid端末を操作する(画面・音声のミラーリングとPC上での操作)
ドハマリしたのでメモ。
## 要件
– Windows10上にAndroid端末の画面を出力(ミラーリング)
– Windows10上にAndroid端末の音声を出力(ミラーリング)
– Windows10上でAndroid端末の画面を操作
– Android端末の対象はFire HD 8 Plus (多分Android9)## 試した手法
| 名称 | 確認事項 |
|:———–|:————|
| [Vysor](https://www.vysor.io/)|
- 無料版だと画質や音声の制限あり
- 有料版なら全てうまくいきそう
|
| [ApowerMirror
スマホをリアルタイムに
ミラーリング/制御する](https://www.apowersoft.jp/phone-mirror)|
- ミラーリング実行時の操作が煩雑
- 無料版だとミラーリング画面にロゴ表示
- 無料版だとAndroidアプリ側の広告表示がエグい
- 有料版なら全てうま
Android StudioをIntelliJ公式プラグインで日本語化する
先ほどAndroid StudioのベースとなっているIntelliJ公式から日本語化プラグインのリリースが発表されました!
IntelliJ IDEA、AppCode、CLion、DataGrip、GoLand、PyCharm、PhpStorm、RubyMine、および WebStorm の UI が完全に日本語にローカライズされました!
日本語言語パック??の公式リリースを記念して、対応する IDE が 30% オフ!
詳細:https://t.co/i22VHk1XUV pic.twitter.com/HAlctKKSj6
— JetBrains Japan (@jetbrainsjp) July 22, 2021
Android Studioもこれで日本語化できるのでは?と思い試してみました。
# 環境
– Android Studio 4.2.2# プラグインのダウンロード
Android Studioのプラグイン画面から検索してみましたがヒットしなかったのでWebページからダウンロードします。https://plugins.jetbrains.com/plugin/13964-japanese-language-pack——/versions
ページのVersionsから対応するバージョンを探します。Android Studio4.2.2のベースとなっているIntelliJ IDEAのバージョンは**2020.2**です。なので、このバージョンが出るまでひたすら過去に遡り続けます。
![Screen Shot 2021-07-
【Android / Kotlin】Rx を理解する(ストリーム編)
# はじめに
今回は今までプロジェクトでなんとなくで読んで使っていたRxを学び直しつつ、理解する。
読んでいただければ、Rx入門者の方でもプロジェクトのコードをある程度読めるレベルになるのではないか、と勝手に思っています。誤った言い回し、解釈、記述などあればコメントいただければ幸いです。
# Rx の概要(主な機能)
Rxの主な機能としてはざっくり以下だと認識している。1. 「値を流して処理する」(ストリーム)
2. 「値の監視 / イベントを検知して処理する」(イベントバス的な)
3. 「スレッド操作(切り替え・使い分け)」今回は
>1. 「値を流して処理する」(ストリーム)のイメージを掴んで、知識を整理しながら理解したいと思う。
#### 参考リンク
– https://qiita.com/disc99/items/1b2e44a1105008ec3ac9#merge
– https://ichi.pro/android-de-rxjava-o-shiyosuru-riyu-139590064902698
– https://tech.ga-tech.co.j
Android Studioのログが流れない場合の対応
Android StudioにてAndroidアプリの開発をしている際に、アプリ起動後のLogCatのログが流れない場合があります。流れない原因については改めて調査しようと思いますが、今回はログを流れるようにする方法をお伝えします。
# ログが止まった場合の対応
* Android StudioにてTerminalのタブを開く
* ターミナルにて以下のコマンドを実行~~~
$ adb kill-server
$ adb kill-server
daemon not running; starting now at tcp:5037
daemon started successfully
~~~* 上記のような表示が出れば成功
Android ビルドは成功するけど「App Name has stopped」となる(Failed resolution of: Lcom/google/firebase/iid/FirebaseInstanceId)
#環境と概要
Ionic + Capacitorのクロスプラットフォームアプリ下記ドキュメントの通りCapacitor 3にアップデートしたら、大惨事に見舞われた。。。。
https://capacitorjs.com/docs/updating/3-0
![Screenshot_1626789186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/66d0a31a-78ff-115d-8803-2db656603d73.png)
ビルドは成功するのだが、、、**エミュレーターでアプリを起動すると、起動した瞬間に落ちるのだ!!**
なぜだーーー。Android Studioでのエラーログはこんな感じ?
“`console
15690-15775/com.sample.app E/Capacitor: Serious error executing plugin
java.lang.reflect.InvocationTargetException
a
【備忘録】Androidで魔法を使っているみたいなタッチエフェクト
##画面に触るたびに散る光の粉っぽいエフェクト
例
![screencast-Genymotion-2021-07-21_17.25.14.665.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391023/d66fba1d-6670-bf46-dd44-8a596ac4be81.gif)こんな感じのエフェクト。
“`MyEffect.kt
@SuppressLint(“ViewConstructor”)
class MyEffect(context: Context, private val eventX: Float, private val eventY: Float): View(context) {
private var paint = Paint()override fun onDraw(canvas: Canvas?) {
canvas?.drawColor(Color.TRANSPARENT)
val color = Col
ActivityResultContract を使って外部のカメラアプリで写真を撮影する (アプリ固有ストレージを使う方法)
ActivityResultContract を使って、外部のカメラアプリを起動し、写真を撮影して画像ファイルを取得します。
この記事の実装では撮影した画像ファイルはアプリ固有ストレージに保存し、他のアプリからはアクセスできないファイルとなります。
https://developer.android.com/training/camera/photobasics#TaskPath
ライフログ系のコンテンツやブログ記事の添付ファイルなど、多くの場合では撮影した写真がコンテンツとしての価値がある場合はなるべく対象範囲別ストレージ (Scoped Storage) のメディア領域へ保存し、アプリをアンインストールしても写真が消えないようにすべきです。
撮影した写真が一時的に使われるだけで、アプリのアンインストールで写真が消えてしまってもユーザーが困らないものである場合はこの記事の方法でアプリ固有ストレージへ保存します。撮影した写真を外部アプリと共有しなくて良いケースは稀なので、慎重に検討してください。
https://developer.android.com/training/d
Android(kotlin)プログラミングで画像をDrawableからファイル名で取得したい!
#したいこと
(RecyclerViewのAdapterで)imageViewにdrawableフォルダに入れている「sample.png」を入れて表示したい
#コード
“`kotlin
// ここは説明がめんどくさいから適当ににインスタンス化してるだけなので
// 適宜findViewById()等でインスタンスを取得しておきましょう
val imageView = ImageView()// ここからがカギ!
// contextに関しても適宜その時のcontextにしましょう
// 引数に関しては「sample」のところだけ変更すれば他は変更する必要はありません
// ファイル名に拡張子は必要ありません
imageView.setImageResource(context.resources.getIdentifier(“sample”,”drawable”,context.packageName))
“`#感想
ImageViewにファイル名から画像を指定するに当たり僕のようなググッテコピペマンでも分かるような文献があまりにも少なかったのでこの度記事を書きま
Custom view XxxView overrides onTouchEvent but not performClick って怒られるケースについて
# 概要
custom view を作成した際に、[onTouchEvent()](https://developer.android.com/reference/android/view/View#onTouchEvent(android.view.MotionEvent)) をオーバーライドしたが [performClick()](https://developer.android.com/reference/android/view/View#performClick())
をオーバーライドしていない場合に、以下のような警告が表示されます。[^1]“`
Custom view XxxView overrides onTouchEvent but not performClick
“`# performClick() について
まずは [performClick()](https://developer.android.com/reference/android/view/View#performClick()) から読み解いてみようと思います。## ◆ jav
Android 「No cached version of xxxx available for offline mode.」の解決法
#No cached version of xxxx available for offline mode
![スクリーンショット 2021-07-20 16.19.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/9e1b6c9b-cc44-6b72-9317-ab2aaaa8599f.jpeg)右側の「Gradle」を押すと、Gradle Toolsの設定?みたいなタブが出ます。
そこで②のアイコンを押すと解決しました:sweat_smile:原因はよくわかりません!!
#参考
https://stackoverflow.com/questions/37409265/no-cached-version-available-for-offline-mode/68418377#68418377
AndroidのダイアログにEditTextを追加する方法
AndroidのAlertDialogにEditTextを追加する方法を解説します。
まずは最も簡単な例をご紹介します。
“`Sample.kt
val editText = AppCompatEditText(this)
AlertDialog.Builder(this)
.setTitle(“名前の変更”)
.setMessage(“名前を入力してください。”)
.setView(editText)
.setPositiveButton(“OK”) { dialog, _ ->
// OKボタンを押したときの処理
dialog.dismiss()
}
.setNegativeButton(“キャンセル”) { dialog, _ ->
// キャンセルボタンを押したときの処理
Android: アプリ外からアクセスできるように画像を保存する (対象範囲別ストレージ対応)
Android 10 以上の対象範囲別ストレージ (Scoped Storage) 環境で、外部のアプリから参照できるように画像ファイルを保存します。
Android 9 以下でも MediaStoreAPI 経由でアクセスすることに変わりはないため、すべての Android で動作するような実装としています。
https://developer.android.com/training/data-storage/use-cases?hl=ja
https://developer.android.com/training/data-storage/shared/media#add-item
## 前提
Android 10 以上ではメディア領域への書き込みに**権限は不要です**。権限の取得なくこの実装が利用できます。
Android 9 以下ではメディア領域への書き込みに WRITE_EXTERNAL_STORAGE 権限が必要です。WRITE_EXTERNAL_STORAGE 権限を取得してから `storeMediaImage()` を実行してください。
## 前提
IP Webcamを使う
世の中に出回っているIPカメラ(ネットワークカメラ)と呼ばれるものを、もう少し機能は限定的で良いので簡単にブラウザで(OS非依存で)使えるようにならないかと以前から考えていたが、スマホでIP Webcamというアプリを使うのが良さそうと最近知った。
https://play.google.com/store/apps/details?id=com.pas.webcam&hl=ja&gl=US
Androidのスマホにインストールして起動するだけ。
IPカメラだとLANの外からアクセスするためのサーバ設定とかもあって、このアプリの場合はivideonというのを経由すればできるらしいが、自分の使い方だと基本的にLAN内の装置の監視に使うので不要。単純にLAN内で使用する場合は、例えばIPを192.168.0.10と仮定して“`http://192.168.0.10:8080/“`にブラウザでアクセスすれば使える。複数のカメラを同時に表示したい場合は、適当なhtmlファイルを作るのが簡単。“`html
Android: アプリ外の画像一覧を取得する (対象範囲別ストレージ対応)Android 10 以上の対象範囲別ストレージ (Scoped Storage) 環境で、メディア領域にある画像一覧を取得します。
アプリ独自の画像選択 UI を実装するときなどは、画像選択 Intent に頼らず、MediaStoreAPI から画像一覧へアクセスする必要があります。
Android 9 以下でも MediaStoreAPI 経由でアクセスすることに変わりはないため、すべての Android で動作するような実装としています。
https://developer.android.com/training/data-storage/use-cases?hl=ja
https://developer.android.com/training/data-storage/shared/media?hl=ja
## 前提
事前に READ_EXTERNAL_STORAGE パーミッションを得ておきます。
ActivityResultContract を使ってパーミッションを要求する方法は以下の記事を参照してください。
https://qiita.com/irg
Android: ActivityResultContracts.RequestPermission でパーミッションを要求する
ActivityResultContract の仕組みを使って、パーミッションを要求することができます。
https://developer.android.com/training/permissions/requesting?hl=ja#request-permission
## 前提
AndroidX や AndroidX Fragment が導入されている前提です。
## 実装
[RequestPermission](https://developer.android.com/reference/kotlin/androidx/activity/result/contract/ActivityResultContracts.RequestPermission) を使います。
“`kotlin
class MyFragment: Fragment() {
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.Requ
【Android】Mockito(Mockito-Kotlin) の基本的な使い方
### はじめに
自分用の備忘録として Mockito-Kotlin を使ったテストダブル(スタブ、モック、スパイ)の基本的な使い方をメモ。
### ライブラリの追加
Kotlin のクラスやメソッドは、明示しない限り継承やオーバーライドが禁止されています。この状態でテストを行うとエラーが発生するため、mockito-inline を使ってエラーを回避します。
“`build.gradle
testImplementation “org.mockito.kotlin:mockito-kotlin:3.2.0”
testImplementation ‘org.mockito:mockito-inline:3.11.2’
“`### `@Mock` `@Spy` アノテーションによる初期化
`mock()` や `spy()` を使わなくても、`@Mock`、`@Spy` アノテーションでモックやスパイの初期化ができます。このとき、以下のような処理が必要となります。
– テスト開始前に `MockitoAnnotations.openMocks(this)` を実行する
Spannableを使ったTextViewでEllipsizeを実現する
デフォルトのTextViewはSpannableを使うとEllipsizeがきかなくなるので、TextViewを継承して以下のような子クラスを作ってあげる。
(android:ellipsize=”end”かつandroid:maxLinesを設定していないとき相当)“`kotlin
/**
* SpannableStringを使用していてもEllipsize==Endの挙動をするTextView
*
* 参考 : https://www.programmersought.com/article/20037202696/
*/
class SpannableEllipsizeTextView : androidx.appcompat.widget.AppCompatTextView {constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constru
viewModelScope のキャンセルと onSaveInstanceState の順序
# 概要
**viewModelScope** にて coroutine 実行中に **process kill** が発生した場合の、**coroutine 実行のキャンセル** と **onSaveInstanceState(Bundle)** の順序に関するメモです。Android の ViewModel 内部で coroutine 実行中に process が kill される場合の、viewModelScope のキャンセルと onSaveInstanceState の順序に関するメモです。
# viewModelScope のキャンセルと onSaveInstanceState の順序
**Activity#onSaveInstanceState()** が先に呼ばれ、続いて **viewModelScope** 内で **kotlinx.coroutines.JobCancellationException** が呼び出されます。
そのため、$\color{red}{\rm Job キャンセル後の情報を instance state に保存することはできません}