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

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

[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

元記事を表示

[SavedStateHandle] やっぱりDaggerとうまく付き合う

以前 SavedStateHandle を DI する方法について[記事を書きました](https://qiita.com/Tsuyoshi_Murakami/items/12678bc77d9a9f2e5813)が、今は正直以下の方法でも良いのではないかと思っています。

“`kotlin
class MyViewModel(handle: SavedStateHandle) : ViewModel() {
@Inject
lateinit var myRepository: MyRepository

val myData: LiveData = liveData {
emitSource(myRepository.getMyData())
}
}
“`

“`kotlin
class MyFragment : Fragment() {
private val viewModel by viewModels()

override fun onCreate(savedIn

元記事を表示

targetSdkVersion を 29 に上げても Robolectric のテストを動くようにする

# 概要
Java 8 の環境で targetSdkVersion を 29 に上げたら RobolectricTestRunner を使うユニットテストが動かなくなったので、対応方法を調べました。

## 問題
テストを実行すると、以下の例外が出てテストが失敗します。

“`
java.lang.IllegalArgumentException: failed to configure jp.toastkid.yobidashi.media.image.preview.RotateMatrixFactoryTest.test: Package targetSdkVersion=29 > maxSdkVersion=28
at org.robolectric.RobolectricTestRunner.getChildren(RobolectricTestRunner.java:240)
at org.junit.runners.ParentRunner.getFilteredChildren(ParentRunner.java:426)

// 中略

at com.inte

元記事を表示

Google認証で ApiException:10 が発生

Google認証をやっていたら、下記の例外が発生

> com.google.android.gms.common.api.ApiException: 10:

下記で解決できるらしい。

**■参考サイト**
https://medium.com/@riscait/apiexception-10-error-in-sign-in-with-google-using-firebase-auth-in-flutter-1be6a44a2086
https://stackoverflow.com/questions/47437678/why-do-i-get-com-google-android-gms-common-api-apiexception-10

元記事を表示

Android studioのemulatorでインターネットに繋がらない現象を解決する

Android studioでemulatorを起動し外部APIへGETリクエストを実行しようとするもレスポンスが取得できずなんでだろうと思っていたらそもそもインターネットにできない状態でした.

# 環境
端末: Nexus5X
API version: 28

# 現象
![cannot_reached.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252857/affe2198-13c5-41b7-f788-c7c6c7ae0de9.png)

# 対応
ホスト側のDNSを8.8.8.8(GoogleのDNS)に変更後,emulatorを再起動することで解決
dns_setting.png

再起動後
![reached.pn

元記事を表示

[Android]GoogleMap上ランドマークのストリートビュー表示

# GoogleMap上ランドマークのストリートビュー表示

以下の手順となります。
・ランドマークからPlaceIDを使ってplace/details API 実行して情報取得
・imageViewに表示するためライブラリ導入
・ストリートビュー表示する

## ランドマークからPlaceIDを使ってplace/details API 実行して情報取得
https://qiita.com/myatthinkyu/items/efc901d88a5f9d031c4f

## imageViewに表示するためライブラリ導入
“`
implementation “com.github.bumptech.glide:glide:4.8.0”
“`

## ストリートビュー表示する

“`
buildingInfo.firstOrNull()?.let {
var location = it.result!!.geometry!!.location
var locationlatlng = location!!.lat.t

元記事を表示

同一のRadioGroupに入っているRadioButtonを画面上の自由な位置に配置したい

#概要
Androidの標準APIで提供されている`RadioButton`と`RadioGroup`。

複数の`RadioButton`を1つの`RadioGroup`の中に入れ子にすれば、その中で同時に一つだけが選択可能になる、とここまではいいのだが、`RadioButton`は自由に配置することが許されない。

#なんでRadioButtonは自由に動かせない?
ドキュメントでもなんでも見ればわかるのだが、`android.widget.RadioGroup`は**`android.widget.LinearLayout`を継承している**ため。

LinearLayoutが何だかはみんな知ってるでしょう。
つまり横1列か縦1列にしか並べられないということ。

なんでやねん!!
#解決策
ということで、作っちゃいました。そういうクラス。

“`java:FreeRadioGroup.java

import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
imp

元記事を表示

Androidエミュレータの日本語化(Android9)

## 設定アプリを起動

## 設定の一番下にあるSystemを開く

## Languages & inputを選択

  • OTHERカテゴリの最新記事