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

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

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

元記事を表示

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 に保存することはできません}

元記事を表示

Googleアシスタントを無効にする方法(Android 10版)

自分は普段音声入力なんて使わない人なので、なにかの拍子にGoogleアシスタントが立ち上がって、たとえば音楽聴いている時に中断されたりするのが鬱陶しいので、Googleアシスタントを無効にしてます。ところでこの「Googleアシスタントの無効化」の方法ってAndroidのバージョンが上がる毎に複雑怪奇になってませんか?
ということで、とりあえずAndroid10での設定方法をまとめておきます。

※この記事は京セラ「TORQUE G04」を基に記載していますが、機種によって表示が異なる可能性がありますのでご容赦ください。

# 概要
* [設定]
* [Google]
* [Googleアプリの設定]
* [検索、アシスタントと音声]
* [Googleアシスタント]
* [全般]
* [Googleアシスタント]をオフに変更(「Googleアシスタントをオフにしますか?」と表示されるので[オフにする]をタップ)

# 詳細
## [設定]画面→[Google]
Androidの[設定]画面から[Google]を選択します。
GoogleMap風のBottomSheetを実装する

こんにちは。今回はGoogleMap風の、全画面地図 + BottomSheetを実装してみます
簡単そうに見えて結構苦戦したので、他の人にもお役に立てばと思います

# 最終形
![BottomSheet3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924658/ca42181d-b816-abc4-349c-6a6fa27e720d.gif)

# 作り方
## 準備
![スクリーンショット 2021-07-17 16.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924658/ef8db57d-2920-3f09-348d-ef0316455979.png)

今回はお手軽にAndroidStudioのCreateNewProjectから、GoogleMapsActivityを選択して作成します
あらかじめ用意しておいた、GoogleMapsApi Keyをgoogle_maps_api.xmlに

元記事を表示

Google Playに新規アプリをリリースするときのメモ

# 初めに
新規アプリをリリースするときに少し躓いた点をメモ。

# Key Store
新しくKey Storeを作成する際、エラーが出た。
![スクリーンショット 2021-07-17 15.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/baa70b1f-d03b-a5dd-013d-4562a9821ef2.png)

## 解決策1
私の場合、Key storeのパスワードとAliasのパスワードを同じにしたらエラーが出なくなった。

## 解決策2
ターミナルからKey Storeを作成したらエラーは出なかった。

“`
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
“`

(validityは余裕を持って100000に変更)
参考:https://developer.android.com/stud

元記事を表示

Apps Up 2021の申し込み期間が延長されました

Apps Up 2021の申し込み期間が2021年8月20日から2021年9月5日に延長されました。賞金総額はUS$1,000,000もあるので、まだ参加していない方はぜひお見逃しなく!

詳しい情報はこちらをご参照ください!

https://qiita.com/Rei_2020/items/55bac1aa83ea0cfd7132

元記事を表示

[Android]RoomのDaoのメソッドでBooleanを返す

Android の Room において、Dao のメソッドで Boolean を返したい場合のメモです。

手順としては以下のようになります。

1. Dao のメソッドで戻り値を Boolean に設定する
2. `@Query` 内に SELECT 文を記述する。この際に戻り値で false として返したい場合は0、true として返したい場合は0以外の数値を返すような SELECT 文を記述する

上記の 2 で記述する SELECT 文ではクエリの内容にもよりますが `EXISTS` をよく使うかと思います。

## ケース1

例えば以下の例では `books` という本の情報を保存するテーブルから `bookId` に一致するレコードがあるかどうかを検証し、あれば戻り値で true が返され、そうでなければ false が返されます。

“`kotlin
@Dao
interface BookDao {
// bookId で指定された本が保存されているかどうかチェック
@Query(“SELECT EXISTS(SELECT 1 FROM books W

元記事を表示

AppDistributionでAPKの代わりにAABを使う

# TL;DR

– 既にfirebase-appdistribution-gradleでAppDistributionに対してAPKをアップロードしている人の変更点です
– いまからプロジェクトを作るなら[CodeLabo](https://firebase.google.com/codelabs/appdistribution-app-bundles)やったほうが良いと思います

## artifactTypeにABBを指定する

artifactType には AAB と APK が指定できます。AABを指定しましょう。
詳しくは[ここ](https://firebase.google.com/docs/app-distribution/android/distribute-gradle?apptype=aab)を参照してください。

“`gradle
firebaseAppDistribution {
artifactType = “AAB”
}
“`

## Firebase プロジェクトを Google Play アカウントに接続する

元記事を表示

AndroidのWorkManagerでWorkerにデータが渡らない?

Androidはころころ変わるし、ユーザ的にもUpdateはよくない。そこで、Androidの深いところは使わず、なるべくWebに処理を持ちたい。しかし一方で、普及したハードは利用したい。そこで、AndroidのAPIは最低限だけ使おうと思う。で、KotlinのCoroutineでは書けないことがあって、Background処理のため、WorkManagerを使おうとして。

そこで3日以上はまったので、似たようなことで困っている方のために首記Titleで、残しておきます。

Androidの開発者向けの解説Sample通りに書いても、Workerにデータが渡せない。
何度コードを見直して、ドキュメントを見て、同じことをやるいろいろな書き方を試しても、うまくデータが渡らない。
WorkerにわたったデータをPrintして、ようやく気付いた。
昔書きかけで実行したみたWorkerプロセスが、延々と再試行されていて、その時の結果をDumpさせていた。
今起動した処理は、Queueの後ろにあるのか、まだ実行されていない模様。

新しくQueueにデバッグ済みのWorkerを入れる前に、以前の

元記事を表示

動画サービスをFirestore+CloudFunctionsで勝手に設計してみる ~ NobodySurf編

こんにちは。[もぐめっと](https://mogmet.com)です。
![スクリーンショット 2021-07-15 8.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/d5d9712d-36d5-57f1-c90f-ea530f64fa4b.png)
最近本当に自分の写真のネタがなさすぎるので昔の写真を引っ張り出したりしてます。普通に滑ってるように見えますが、実は浮いてます。目の錯覚ショットですね。

今回は、昨日apple storeをみたらTodayで紹介されていた[NobodySurf](https://nobodysurf.com/)という超イケてるサーフィン動画をたくさん見れる超イケてるアプリが掲載されていたので、こちらのアプリをもしfirestoreでシステム構築したらどんな構成になるのか?という題材で勝手に設計してみたので僕が考えた設計を紹介します。

## アプリ概要

アプリについて紹介します。
トップからは主にカテゴリ別の動画が見れ、動画詳細で動画をチェック

元記事を表示

navigation設定したら真っ白になってしまった(初心者向け)

プログラミング始めて4ヶ月、kotlin始めて1ヶ月の超初心者の投稿です。ちなみに初投稿。(スマホから書いてるので後ほど加筆修正するかもです)

さて、android studioでnavigationを使って実装しようとした時、プレビューでは見れているのにビルドすると真っ白になってしまうという現象が発生した。
プレビューで見れているのにエミュレーターで表示されてない時は大体インスタンスを複数作ってるとかのパターンだったが、今回はめちゃくちゃシンプルなことが原因だった。

問題のnavigationをDesignモードで見ると、左側に
no navhostFragments found. This nav graph must be referenced from a NavHostFragment in a layout in order to be accessible
という文字が表示されていた。
これはナビゲーションホストが見つからないと言われているので、ナビゲーションを組み込んでいるxmlファイルを見ると原因がわかるはず。
今回はnavigationをMainActivity

元記事を表示

Unityで「Failed to update Android SDK package list. See the Console for details.」が出てAndroidに書き出せなくなったときの対処法メモ

## 発生した現象

[![Image from Gyazo](https://i.gyazo.com/479dff1a7236009ce9bda62be8956006.png)](https://gyazo.com/479dff1a7236009ce9bda62be8956006)

ビルドボタン押したらすぐこんなポップアップが出てきてビルドできなくなった。

しかも最初から発生したわけでなく、今までできていたのにGitHubからpullしたあとにできなくなった。

そんなプロジェクトの設定みたいなファイルを更新したわけではないんですけどねぇ…

## 対処した方法

検索したら、Android StudioでインストールしたAndroid SDKを指定しているのを辞めるようなことが見つかりましたが、そんなことしてなかった…

もちろんUnityをインストールする際に一緒にインストールしたAndroid SDKで、特に特殊な設定していない。

てか、pullする前はできていたのにというのがつきまとう…

### 解決法
最新のjavaをインストールしたら治りました。

https:/

元記事を表示

OTHERカテゴリの最新記事