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

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

monkeyrunnerでAndroidの自動化テスト作成

# Androidの操作を自動化してテストを自動化する

## 開発環境
Mac 10.14.6

## やったこと
* Mac でmonkeyrunnerを動かすためにopenjdk8のインストール
* monkeyrunner で操作を記録
* 記録した操作で実行

## 参考にしたサイト
https://qiita.com/ikota/items/ef6bdb4dad6ab9ba912a
https://developer.android.com/studio/test/monkeyrunner/MonkeyDevice?hl=ja

##手順
### monkeyrunnerの実行環境の構築
すでにAndroid StudioがDownloadされている環境ではmonkeyrunnerが以下にある。
/Users/xxx/Library/Android/sdk/tools/bin/monkeyrunner

ターミナルからmonkeyrunnerを実行すると、以下のエラーが出て実行できない。

~~~
./monkeyrunner
-Djava.ext.dirs=/User

元記事を表示

React Native BLEペリフェラルをスキャンする

# はじめに
React Nativeアプリケーションで、BLEペリフェラルデバイスのスキャンを行います。Androidでのみ動作確認していますが、Androidのみで動作可能なAPIは利用していないので、iOSでも動作可能かと思います。OSSはBLE Managerを利用します。

https://github.com/innoveit/react-native-ble-manager

# 初期セットアップ
まず通常通りアプリケーションの雛形を作り、それからyarn addでBLE Managerをインストールします。

“`bash
$ react-native init BLESample
$ cd BLESample
$ yarn add react-native-ble-manager
“`

Androidのマニフェスト(android/app/src/main/AndroidManifest.xml)に以下の3つのパーミッションを設定する。

“`xml

AndroidからUSB HIDでマイコンを制御してみる

AndroidからUSB HIDでマイコンを制御するまとまった例が見当たらなかったので、試作してみました。

# 概要

Android端末のUSB端子にマイコンをつなぎ、マイコン上に搭載されたLEDの点灯をAndroidアプリから制御します。
マイコンには[ARM mbed](https://os.mbed.com/)を用い、Androidとマイコン間はUSB HIDで通信します。

![概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67657/37edfc67-ef5a-180a-a52b-91cb09c59037.png)

# ソースコード

https://github.com/yhirano/android_usb_hid_sample/

# mbedとは

mbedはARM社のプロトタイピング用マイコンボードとそれの開発環境です。
mbedに似たプロトタイピング環境としてはArduinoがありますが、Arduinoに比較すると、ブラウザ上で動くオンライン開発環境で開発ができるためにコンパイ

元記事を表示

【ReactNative】Androidでbase64画像の保存とPOST送信

AndroidのReactNativeアプリでbase64画像の保存とPOST送信をします。

# 画像の保存
## iOSでの保存、もしくはAndroidでhttp or httpsリソースの画像の保存(base64だとエラー)の場合
まずはbase64でない場合。
以下で画像のダウンロードができます。
一度FileSystemに画像をダウンロードして、そのURIを使っています。

“`jsx:DowloadImage.jsx

import * as FileSystem from ‘expo-file-system’;
import * as MediaLibrary from ‘expo-media-library’;
import * as Permissions from ‘expo-permissions’;

const downloadImage=( file )=>{
FileSystem.downloadAsync(
file.uri,
FileSystem.documentDirectory + ‘image.jpeg’

元記事を表示

MergeAdapterを試してみた

これまでRecyclerViewで異なるレイアウトのコンポーネントを組み合わせる場合、共通のAdapter内でViewHolderを複数作成し、`viewType`で処理を分けるのが一般的だったと思います。

その結果、Adapterが肥大化して可読性が悪くなってしまう経験をした方は多いのではないでしょうか。

そんなあなたへの朗報、**MergeAdapter**を使うことでAdapterを分離し、**スッキリ**と書くことができるようになりました。

この記事では、このMergeAdapterについて簡単な実装からちょっとした疑問点へのお答えまでできればと思います。

– 実装方法
– 1つのAdapterのみ更新したらどうなるのか
– viewTypeは指定しなくて良いのか

# MergeAdapterとは

ドキュメントは[こちら](https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/MergeAdapter)。

>An Adapter implementation that

元記事を表示

[Joke] God Activity Architectureの奨め

God Activity Architecture(GAA)は、Activity内に全てのコードを配置するアーキテクチャです。MVPと比べてみましょう。

# MVP
![mvp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/4b217037-7aa8-34b0-6f7d-6e80b34e4612.png)

# GAA
![gaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/ee15af0a-8ba1-7b90-9ae6-3de77c4ab187.png)

# 長所

ファイルを探したり、あちこちのファイルを行き来しなくてよくなります。パッケージやプロジェクト構成、命名などで悩む必要もありません。

学習コストも最低です。Hello Worldができたらもう習得済みです。たぶんAndroid開発者なら誰でも一番最初に採用するアーキテクチャでしょう。

# 短所と対策

GAAを使うとUn

元記事を表示

SharedPreferencesはprocess間共有できない

#発生事象
SharedPreferencesで古い値を取得してしまうことがあった。(毎回ではないところがバグに気付きにくかった・・・)

#原因
今回、AlarmManagerを使用してBroadcastReceiver内でSharedPreferencesの値を使用しており、AlarmManagerのサンプルでは以下のようになっていることが多く、それを深く考えずそのまま使用してしまっていたので別プロセスでのアクセスになってしまっていた。

SharedPreferencesはドキュメントにもあるように、マルチプロセスでの動作を保証していない。
`Note: This class does not support use across multiple processes.`
[SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences.html)

“`xml

元記事を表示

[Kotlin]Roomを用いたデータベース操作

# はじめに
– [公式はこちら](https://developer.android.com/training/data-storage/room?hl=ja)
– Roomを用いて追加及び取得を行います

# 画面
データ追加ボタンでデータを追加
データー表示でデータを表示します

File.jpg

“`actvity_main.xml

Delphi 10 AndroidでSoapクライアント

#はじめに
Delphi 10.3.3 Community Edition を入手したのでモバイルアプリを作ってみたいと思います。
まずはSoapクライアントができるのか試してみました。(Restはまだお勉強中)
SoapができればDB接続などのめんどくさい動作は全部サーバー側に持たせることができるので
作りなれないモバイルアプリでも色々出来るのではと期待しています。
AndroidでもIOSでも同じことができると思いますが、現状は手元にMacが無いので
手持ちのAndroid機で試してみることにしました。(それも超古いやつですが…)
作り方は基本Windowsアプリと同じです。FireMonkeyの本領発揮ですね。

#評価環境
開発マシン: Windows10 professional (Core i5-3337U 1.8GHzで重いですT_T)
Delphi : Delphi 10.3.3 Community Edition
Androidマシン:Nexus7 (32bit)
Androidバージョン:6.0.1

#Android側の準備
開発マシンとNexus7をUSB

元記事を表示

要素の高さがバラバラのRecyclerViewを使う(Pinterest的レイアウト)

#某有名画像サイトのように要素を表示したい!

>
>Pinterestアンドロイドアプリより

こういう高さがそれぞれの要素のwrapになってるやつをやってみたかった。

#今回作るもの
これ↓

少しわかりづらいがimageの高さに合わせて要素が積み重なっている。
画像はLolem Picsumのものを表示

#結論
先に結論からいくと、**RecyclerViewのレイアウトマネージャーをStaggeredGridLayoutManager**にするだけ

元記事を表示

Android公式のOSS表示ライブラリ

はじめに
===
Androidアプリを作成していると様々なライブラリを使用する中で、
ライブラリを表示する必要があるかと思います。
今回はAndroid公式のライブラリを使用して表示する方法を記載していきます。

公式
[Including Open Source Notices](https://developers.google.com/android/guides/opensource)

環境
===
OS:Windows 10
Android Studio:3.5
言語:Kotlin

導入
===
1.build.gradle (Project)

“`gradle
buildscript {

repositories {
// なければ追加
google()
jcenter()

}
dependencies {
// 追加
classpath ‘com.google.android.gms:oss-licenses-plugin:0.

元記事を表示

ReactNativeアプリをAppDistributionにfastlaneでデプロイする方法

## はじめに
今回はfastlane公式ドキュメントにReactNativeでfastlaneを導入する方法が書いていなかったので、その方法について、AppDistributionでのiOSアプリのベータ配布をする方法と共に書いていきたいと思います!!

## fastlaneとは
[fastlane](https://fastlane.tools)とはiOS, Android, flutter, ReactNative等で使用できるツールです。テスト実行, iOSの証明書発行, Beta配布, リリース等のあらゆるタスクを半自動化してくれるツールです。詳しくはfastlaneの[公式ドキュメント](https://fastlane.tools)をご覧ください!!

## AppDistributionとは
AppDistributionとはfirebaseが提供するベータ配布用のツールです。TestFlightとは違い、審査というものが一切ないので開発チーム内でのベータ配布に便利です。[公式ドキュメントはこちら](https://firebase.google.com/docs/a

元記事を表示

Androidアプリ開発に於ける備忘録

#記事概要
本記事では、初めてのAndroid開発に於いて、私が「そんな仕様なのね」と、逐一詰まった部分を纏めようと思う。
強いてこのページの対象読者を示すなら、初のAndroid開発で、何か知ってた方が良いことはあるか?と考えている人。
基本的には自分向けの備忘録である。そのため、今回の開発をスムーズに行えるようになった時点での解釈を記載する。
#本題
それでは、以下に詰まった箇所と、解決後のそれらに対する解釈について記載していく。
##Activity
PC向けアプリ開発でよく言われる「画面」に相当すると解釈。
アプリを起動したら出てくる奴らで、ユーザインタフェースに相当し、以下の特徴がある。

###Activityのライフサイクル
Activityが呼び出されてから居なくなるまで、大まかに説明すると以下のようになる。
####Activityの作成
onCreateメソッドが呼び出されてActivityが作成される。
アプリを作るにあたっては、このメソッドをオーバーライドして処理を記載した。
今回はPC向けのアプリ開発に於けるメインメソッドの感覚で扱った。
####Activi

元記事を表示

[Android]Google Map 表示

# [Android]Google Map 表示

以下の手順となります。
・Google Maps Activity 作成
・Google Map API key 作る
・Google Map API key をプロジェクトに設定

## Google Maps Activity 作成
1.png
2.png
3.png[Kotlin]ホワイトリストに特定のpathを含む文字列がある場合の対応

ホワイトリストにURLのhost部分だけじゃなく、pathも含めたい時の対処方法です。

# 前提条件
URLを開く際、以下のようなことをするAndroidアプリがあると仮定します。

– ↓の処理でホワイトリストとuriのhost部分を比較し、ホワイトリストに登録されている文字列がuriに含まれていたらアプリ内のWebViewで、含まれてなければ外部ブラウザで開く

“`WhiteListRepository.kt
fun compareWhiteList(uri: Uri): Boolean {
return uri.host in whiteList
}
“`

– ホワイトリストはサーバー上で管理しており、アプリ起動時にFetchしてくる(上記の`whiteList`に格納)
– ホワイトリストは以下の文字列が登録されている

“`
hogehoge.com
hugahuga.co.jp
“`

# 突然の仕様変更
ある日、「ホワイトリストに`piyopoyo.com/system/menu`を追加したい」という要望が上から降ってきました。
現在の実装では、ho

元記事を表示

YouTube Android Player APIのYouTubePlayerはYouTube公式アプリをキルすると道連れにされる(追記版)

# この記事は
[YouTube Android Player API](https://developers.google.com/youtube/android/player?hl=ja)の謎挙動に振り回されて得た知見を共有する記事です。諸事情で作り直しました。

# 問題内容
以下のようなYouTube動画を全画面で流すシンプルなアプリを用意します。

“`SamplePlayerActivity.kt
class SamplePlayerActivity : YouTubeBaseActivity() {
private val apiKey = “hogehoge” // 実際には公式で発行されたAPIkeyが必要です
private val youtubeId = “H_oGi8uuDpA” // 流したい動画ID

private val videoListener = object : YouTubePlayer.OnInitializedListener { // 初期化リスナーを定義
override fun onIniti

元記事を表示

Android, iOSでダイアログが表示されているか確認する方法

# Android

アプリがフォアグランドにいる時にActivityのフォーカスが失われたら、ダイアログが表示されたと判断する

“`kotlin
class MainActivity : AppCompatActivity() {

var isDialogVisible = false

override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) {
isDialogVisible = false
} else {
if (lifecycle.currentState == Lifecycle.State.RESUMED) {
// アプリがフォアグランドにいる時にフォーカスが失われたら、ダイアログが表示されたと判断する
isDialogVisible =

元記事を表示

【Android】FragmentでBackボタンを押した際のイベントを簡単に制御する

# 概要
– とあるアプリを作成しているときにバックボタンを無効化する処理を入れたかったので、その備忘録
– ActivityだったらOnBackPressedをオーバーライドするだけでOKだが、fragmentではそうもいかない

“`MyActivity.java
@Override
public void onBackPressed() {
// バックボタンが押された際の処理を入れる
}
“`
– Interface経由で値を渡すこともできるけど、IDとかタグの指定をするのも面倒。。。
– もっと簡単な方法を探っていたところ、OnBackPressedDispatcherを使えばFragment内だけで実装可能のようです
(最初からドキュメント見てれば一番早かった。。。)
– https://developer.android.com/guide/navigation/navigation-custom-back

# 方法

“`MyFragment.java
public class MyFragment extends Fragment

元記事を表示

非SDK APIのテストについて

### はじめに
SDKが提供するAPIは`whitelist`,`greylist`, `blacklist`に分類され、
タイトルの非SDK APIとは`greylist`, `blacklist`のことを指します。
下記はそれぞれの意味を説明したものです。(公式から[引用](https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#list-names))

* ブラックリスト
アプリの対象 API レベルに関係なく使用できない非 SDK インターフェース。アプリがこのインターフェースのいずれかにアクセスしようとすると、システムによってエラーがスローされます。

* グレーリスト
アプリの対象 API レベルで制限されていなければ使用できる非 SDK インターフェース。
Android 9(API レベル 28)から、各 API レベルで使用できる非 SDK インターフェースが制限されています。制限付きグレーリストの API へのアクセスは、API

元記事を表示

[LiveData] 更新されたときだけ値を受けとる

二通りの方法を示します。

### 1. LiveData を BroadcastChannel に変換する

いきなりテストです。

“`kotlin
class MyTest {
private val dispatcher = TestCoroutineDispatcher()

@[Rule JvmField]
val rule = InstantTaskExecutorRule()

@Before
fun before() {
Dispatchers.setMain(dispatcher)
}

@After
fun after() {
Dispatchers.resetMain()
dispatcher.cleanupTestCoroutines()
}

@Test
fun test() = dispatcher.runBlockingTest {
// ソースとなる LiveData
val sour

元記事を表示

OTHERカテゴリの最新記事