Android関連のことを調べてみた2020年08月22日

Android関連のことを調べてみた2020年08月22日

Pixel Buds欲しい、作ってしまえ

Pixel Buds欲しいんですが、高くて手が出ない。
なので、自分で作ってしまいました。

<用意するもの>
 Android 8.0以上スマホ
 M5StickCのような、ESP32でボタンがあるもの
 通話可能なBluetoothイヤホン

<できること>
 スマホをポケットにいれて、イヤホンで音楽を聴きながら、
  ・OK Googleで、イヤホンで質問し、イヤホンで応答を聞ける
  ・目的地までの距離を音声でイヤホンで教えてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/1f0f541d-854b-0a3f-4dcf-fcaf07e17e8e.png)

<実装したこと>
・M5StickCとBLE接続し、ボタン押下を待ち受けます。
・AndroidでGPSの緯度経度を取得し続けます。
・音楽再生を一旦停止し、イヤホンのマイクから音声認識します。
・音楽再生を一旦停止し、TextToSpeech音声を流します。
・サーバとHTTP POST通信します。(

元記事を表示

Termux使ってスマホ(Android)で入力補完やってみた。

`この記事ではPixel 3a XL(Android 10)にインストールしたTermux(0.98)を使っています。`

#はじめに。
こんにちは、タキガワです。初めての記事になります。私は競技プログラミングをやっていて、スマホでできたらいいと思っていたのですが、入力補完とかエラーチェックとかあるといいなと思って調べたらうまく行ったので一通りの手順を記事にしようと思いました。
こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695816/de2f4aaa-3feb-a450-dd80-8369946566cb.png)

#Termuxのインストール
AndroidでLinuxのターミナルっぽいことができるみたいなアプリです。(多分…)
普通のAndroidアプリと同じようにplay storeからインストールできます。
https://play.google.com/store/apps/details?id=com.termux&hl=ja
#Termux

元記事を表示

kotlinとjavaでいろんな機能を実装したい!

# はじめに…

この記事は[6個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の7日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその6個前の記事をご覧ください!

– java版 : https://github.com/sato-na/guruwake_java

– kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語でいろんな機能を実装するには…

–目次–

1. textViewにコード上で文字列を入れる方法

2. editTextの実装と文字列を受け取って消す方法

3. listViewの実装方法

## textViewを実装してコード上で文字列を入れる方法

– javaの場合

“`java
TextView textViewの変数名 = findViewById(R.id.textViewのid);
te

元記事を表示

AnimatorとAnimation

基本的にAnimationの全ての機能はAnimatorが全部実現できます。
AnimatorとAnimationの違いが何点がありますが、
一番重要な違いは以下の2点があります。
①対象ViewはBackgroundの状態になると、
Animationの場合、アニメーションを動かないです。
(もっと詳しい言うと、アニメーションが動きますが、開始と終了のイベントが来ないです。
つまり、アニメーション開始と終了後の処理が実行されない。)
Animatorの場合、対象ViewをBackgroundに移動しても、アニメーション開始と終了のイベントが来られます。

②Animationを実行中、見た目たけを更新されました。対象の本番の状態が更新されないです。
Animatorの場合、アニメーション更新中、対象の状態をアニメーションと一緒に更新されます。

例えば、ViewはAからBに移動、BからCに移動するっというアニメーションが実行しています。
・Animationの場合
アニメーションが終わる後、ViewはまたAの地点に戻る。
アニメーション実行中Viewの本番の地点はずっとAです。見た

元記事を表示

Android Q/API 29以上でViewのキャプチャを保存する

“`kotlin
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, “view.png”)
put(MediaStore.Images.Media.MIME_TYPE, “image/png”)
put(MediaStore.Images.Media.IS_PENDING, “1”)
}

val contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI

contentResolver.run {
insert(contentUri, contentValues)?.let{ uri ->
openOutputStream(uri)?.let{ stream ->
val view = findViewById(R.id.some_view)
view.drawToBitmap().compress(

元記事を表示

Migrate to AndroidXしたら”No tests found”と言われてハマった

Android Studioの“Refactor -> Migrate to AndroidX”を使ってて、何度かハマったパターン。

自動のmigrationが終わって、テスト走らせてみたら

“`
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don’t inherit from TestCase or lack @Test annotations).
“`

とだけ言われて、「@Test annotationちゃんとついてるしなー… `build.gradle`で`androidx.test.runner.AndroidJUnitRunner`も指定してあるし… :frowning2:」としばらくハマる。

結局

“`
androidTestImplementation ‘androidx.test:runner:1.2.0’
“`
の追加忘れ。自動では追加してくれない

元記事を表示

WSL2とAndroidエミュレータの共存

# Windows Home + WSL2 + Androidエミュレータ

この環境で色々ハマったので備忘録として書いておきます。

# WSL2とHyper-VとAndroidエミュレータ
まず、WSL2とHyper-Vの関係
https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce
ここを見てもらうのがいいのですが、WSL2はHyper-Vハイパーバイザーの上で動いています。Windows Pro にある Hyper-V とは別です。また、Windowsハイパーバーザープラットフォームを有効化することで、他の仮想化技術と共存させることができるようです。似た用語で紛らわしいのですが、「Hyper-Vハイパーバイザー」、「Hyper-V」、「Windowsハイパーバーザープラットフォーム」はそれぞれ別物のようです。

で、WSL2をインストールした状態でAndroidエミュレータを起動しようとするとHyper-Vが有効化されているので起動できないので、Hyper-VをOffにするコマンドを実行してね、というメッセージが表示されます。

元記事を表示

/proc/uid_io/statsの情報の出所

# 前提
AOSP タグ:android-10.0.0_r41
kernel/common タグ: [ASB-2020-08-05_4.19-q-release](https://android.googlesource.com/kernel/common/+/refs/tags/ASB-2020-08-05_4.19-q-release)

# はじめに
Android 8以降、I/Oの統計情報をUID毎に出力するstoragedと呼ばれるデーモンが実装されている。
このデーモンはAndroid公式で説明されているように、Android独自procfsである”/proc/uid_io/stats”から取得できる情報がソースとなっている。
本procfsはどのようにしてI/O統計を実現しているかを、備忘録をかねてソースベースで見ていく。

# TL;DR
・task_struct構造体に保持されているI/O統計(/proc/[pid]/io)をUIDと紐づけるためのI/F。
・UID, taskそれぞれのI/O統計情報をhashtableを利用して管理。
・統計情報の更新タイミングは、

元記事を表示

kotlinとjavaで前の画面に戻りたい!

# はじめに…

この記事は[5個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の6日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその5個前の記事をご覧ください!

– java版 : https://github.com/sato-na/guruwake_java

– kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語で前の画面に戻るには…

※これはツールバーの戻るボタンから一つ前の画面に戻るための方法です

## ツールバーの実装方法

– javaの場合

“`java
Toolbar 変数名 = findViewById(R.id.ツールバーのid);
setSupportActionBar(変数);
“`

例)

“`java:WhoActiity.java
Toolbar whoTb = findViewByI

元記事を表示

Github Actions と Firebase App Distribution と Slack で apk を自動でテスターに配布

GitHub Actions を使って Android の CI 環境を整えてみようと思います。
今回は PR が master にマージされたら、ビルドして Firebase App Distribution に apk をデプロイ (+ Slack でデプロイ完了を通知) するまでを目指します。

## Firebase の準備

まずは Firebase のアカウントを準備しましょう。

[ログイン – Google アカウント](https://console.firebase.google.com)

### Firebase のプロジェクトを作成

Firebase にプロジェクトを作成し、Android アプリを追加します。

![add_android_app](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308397/07d1175a-53dc-16c2-93fe-446d79570b75.png)

追加できたら、サイドメニューから 品質 -> App Distibution を選び

元記事を表示

SQLiteOpenHelperを用いたDBのRoom移行〜NonPrimaryKeyの場合を添えて〜

#はじめに
息が長いプロダクトの場合、SQLiteOpenHelperを用いたSQLiteDatabaseがアプリ内にあることがあります。
現在はRoomが主流で、[公式ページ](https://developer.android.com/training/data-storage/room?hl=ja)でも以下のように記載があります。
>SQLite の代わりに Room を使用することを**強くおすすめします**。

メンテナンス性、安定性、モチベーションなど、どれを取ってもRoomの方が良いのですが、既存のSQLiteDatabaseをRoomに置き換えたい場合どうすればよいか?ということで試行錯誤したのでメモします。
Roomのバージョンは`2.2.5`です。

`注意`
※もしかしたら、特定の条件で移行がうまく行かないこともあるかもしれません。
※DBは様々な状態があり、クラッシュの幅も広いので、試す場合は自己責任でお願いいたします。

#移行手順
基本的には、同条件のRoom定義を作成すれば、そのままRoomで既存DBを扱うことが可能です。
しかし、既存テーブルにprima

元記事を表示

macOS Big SurでAndroid Studioの Emulatorが起動した瞬間にクラッシュする問題の回避策

#はじめに
macOS Big Surを使用していると、Parallelsが使えなくなったり、Visual Studio 2019が落ちることが多発する様ですが、Android Studioもその中の1つです。
タイトルの通り、Android StudioからEmulator(バージョンに関わらず)を起動すると、Android Studioもろともクラッシュしてしまいます。

スタックオーバーフローでも同様の問題が確認できます。
https://stackoverflow.com/questions/63148352/emulator-does-not-start-c066d201-unhandled-exit-1d

私の環境では上の解決法では治りませんでしたが、ごちゃごちゃやっているうちに解決法を見つけたので紹介しようと思います。

#環境
macOS Big Sur Beta 11.0 Beta(20A5343i)

Android Studio 4.0.1
Build #AI-193.6911.18.40.6626763, built on June 25, 2020
Runt

元記事を表示

kotlinとjavaで画面遷移したい!

# はじめに…

この記事は[4個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の5日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその4個前の記事をご覧ください!

– java版 : https://github.com/sato-na/guruwake_java

– kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語で画面遷移をするには…

## 画面遷移の基礎

– javaの場合

“`java
Intent intent = new intent(遷移前のアクティビティ.this, 遷移後のアクティビティ.class);
startActivity(intent);
“`

例)

“`java:MainActivity.java
Intent intent = new Intent(MainActivity.thi

元記事を表示

Android,KotlinでRealm

– Android Studio 4.0.1
– Kotlin: 1.3.72
– realm:6.0.2
– Windows 10

## インストール

“`gradle:bundle.gradle(project)

buildscript {
dependencies {
classpath “io.realm:realm-gradle-plugin:6.0.2”
}
}
“`
“`gradle:bundle.gradle(app)
apply plugin: ‘kotlin-kapt’
apply plugin: ‘realm-android’
“`

## 初期化

Applicationクラスを作成し、その中でrealmの初期化をする

“`kotlin:App.kt
package jp.co.sankosc.sample

import android.app.Application
import io.realm.Realm

class App : Application() {
override fun onCr

元記事を表示

【Unity Hub】「モジュールを加える」が表示されない

UnityAndroidでJDKが見つからないくて、HUBから「モジュールを加える」で解決できるとあるが、それが表示されない。
Unity20194.5.1LTS,Unity20194.8LTSで発生

これで⇓解決できそうなのでメモ

【Unity Hub】「モジュールを加える」が表示されない方へ
https://koshishirai.com/unity-add-module/


★ windows10proで確認

Hubから削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/ec966b5e-a3a7-1155-a5c5-b6646547c3ea.png)

次に https://unity3d.com/jp/get-unity/download/archive から使いたいVERのUnityHUB(緑ボタン)を選択する。
そしたら次の画面でる。
![image.png](https://qiita-image-store.s3.ap-nort

元記事を表示

cocos2d-x v4でのプロジェクト作成方法(mac)

#環境
macOS Catalina
cocos2d-x 4.0

#ダウンロード
cocos2d-xをダウンロードする。
https://www.cocos.com/en/cocos2dx/download
ダウンロードしたzipファイルを展開する。

#セットアップ
cocos2d-x-4-1.0というような名前のフォルダができるので、それを任意の場所に移動する。
ターミナルを開き、cdコマンドでフォルダに移動する。
setup.pyを実行する。

“`
$ cd cocos2d-x-4-1.0
$ ./setup.py
“`

setup.pyを実行するとNDK_ROOT等の入力を求められるがとりあえず無視する。
最後に下記のようなメッセージが表示される。

“`
Please execute command: “source /Users/username/.zshrc” to make added system variables take effect
“`

書いてあるコマンドをコピペして実行する。パスは環境によって異なる。

“`
source /Users/

元記事を表示

Androidの実機のみで起こる事象をLogcatで追う

#はじめに
以下の状況になった。
1. エミュレータでは起きずにAndroid実機でのみ起きるバグが発生した。
2. Android StudioのLogcatウインドウでは実機のログが取れなかった。

#Android Studioで実機のログ取得
ログ取得は環境設定をうまくすれば可能となるようだ。しかし面倒だったので、ここでは単純な方法を試した。

1. Android実機をPCに接続する。
2. PC上のAndroid Studioを用いて、対象アプリを実機上で起動する。
3. Android StudioのTerminalウインドウを開き、コマンド「adb Logcat」を入れる。

これで、実機のログがTerminalウインドウ上に表示できる。ただし全てのログを表示するので、制限を加える必要がある。

* タグTagXのみ表示は、「adb Logcat -s TagX:*」とする。
* 任意文字列「search_string」のフィルタは、「adb Logcat | find “search_string”」とする(UNIX系ではgrepでも可)。

#見つかっ

元記事を表示

[Android] logcat の使い方を見直す

# はじめに
この記事では、Android Studio の logcat の使い方を見直して、より快適に開発を進める Tips をいくつか紹介します。
紹介する Tips は、公式ドキュメントや記事を参考しています。

**実行環境**

– Android Studio 4.0.1
– OS: Mac

# 1. Logcat Header を設定する
logcat の左下の[歯車マーク]をクリックすると、[Configure Logcat Header]の画面が表示されます。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215440/1783d3b8-3616-f99a-2580-228291fbd437.png)

[Configure Logcat Header]の画面では、ログの先頭に表示するものを設定できます。
私の環境では、以下の画像のように設定されていました。
チェックを付けたり外したりすると、インタラクティブにログのサンプルが変わります。

![スクリーンショット 202

元記事を表示

Android GitHub Actions Hands-on

## 内容
GitHub Actionsを使って、AndroidのCI環境を構築する。最低限のビルド&デプロイができるところまで。

1. masterの更新時とmasterへのPRを作成したブランチに対して、apkをビルド
2. ビルドしたapkを保存できるようにする
3. masterブランチを更新したとき、アプリをFirebase App Distributionで配布する

## 0. 準備
Android Studioで新規にプロジェクトを作成する。
そのプロジェクトをGitHubのリポジトリにpushする。

完成したサンプルはこちら。
https://github.com/KamikazeZirou/android-github-actions-sample

## 1. とりあえずビルドする
(1) GitHubのリポジトリのページを開く
(2) GitHub Actionsを押す
(3) AndroidでSetupする(下図)
本当にAndroidのFragmentには空のコンストラクタが必要なの?

フラグメントに空のコンストラクタがなぜ必要なのかを、とっさに説明できなかったので、簡単にまとめてみた。

## 空のコンストラクタを作成しないとどうなるか
あなたが複数の引数をとるコンストラクタを持つFragmentを作ったとする。
そのFragmentは正常に動くだろう。
その後あなたはアプリをリリースする。

その後以下のエラーメッセージ付きのクラッシュ報告がたくさん上がってくる。
開発時はエラーなんて吐かなかったのに、古いAndroidを使い続けるユーザーが悪いんだとあなたはは思いつつエラー対応に当たることになる。

“`
Unable to instantiate fragment
make sure class name exists, is public, and has an empty constructor that is public
“`

fuck you android(これは本当にそう)

## 正しい空のコンストラクタの作り方
とにかくFragment内部のコンストラクタをoverrideするのは止める。
常に空のコンストラクタを記述し、Frag

元記事を表示

OTHERカテゴリの最新記事