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

Android関連のことを調べてみた2020年03月24日
目次

どこでもAndroidのリソースファイルを参照する方法

## Androidのリソースファイルが参照できない
Androidのアプリ開発をしていて、変数に文字列を入れる時、なるべくリソースファイルを参照した方が良いと思うけれどもgetStringメソッドが使えたり使えなかったり、

リソースファイルのように@string/textなど色々試してみるけれども、参照できないと思ったことが多かったのでメモ。

## いつリソースがファイルが参照できていないのか

「getStringが使えたり使えなかったりするけれども、いつ使えていつ使えないのか?」と思い試してみたところ、

– ActivityやFragmentではgetStringメソッドを使える。

– ViewModelファイルやActivityやFragment内でもcompanion object内だと参照出来ない

ということが分かりました。Fragmentファイルでも大体companion object内こそリソース参照したいことが多いのに困りました。

### 解決法

解決策として、これで良いのかは分かりませんが、

– ViewModelの場合

ViewModel内からだ

元記事を表示

Kotlinで他のところタップでキーボードを引っ込める

# キーボードがいい感じに引っ込んでくれない
image.png
image.png

これだとログインボタンを押すことができません…

# 他の領域にクリックイベントをつけることで解決する

“`xml

元記事を表示

Flutter:タブの内容に合わせてAppBarを切り替える

# はじめに
最近Flutterを始めました。
その際、tab(見ているページ)に合わせてAppBarを切り替えたくなったので、実装してみました。間違い等ありましたら、ご指摘お願いします。

# 開発環境 (flutter version)
“`
Flutter (Channel master, v1.15.19-pre.8, on Microsoft Windows [Version 10.0.19041.153], locale en-US)
“`

#ソースコード

コピペでも動きます。
tabcontrollerを使用して今どのタブを開いているかを確認し、どのAppBarを出すか決めています。

“`dart:main.dart

import ‘package:flutter/material.dart’;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return

元記事を表示

【エラー】D8: Program type already present: android.support.v4.os.ResultReceiverの解決方法

#はじめに
いつも通りionic5で開発したアプリを`ionic cordova run android`でビルドしてAndroid端末にインストールしようとしたのですが、`D8: Program type already present: android.support.v4.os.ResultReceiver`というエラーが発生しました。
解決方法を記載します。

#解決方法
1. `ionic cordova plugin add cordova-plugin-androidx`を実行
2. `ionic cordova plugin add cordova-plugin-androidx-adapter`を実行

#cordova-plugin-androidxとは
CordovaプロジェクトでAndroidサポートライブラリの後継であるAndroidXを有効にします。
https://github.com/dpa99c/cordova-plugin-androidx

#cordova-plugin-androidx-adapterとは
CordovaプロジェクトにAndro

元記事を表示

Flutter gallery_saver Androidのみ保存でエラーになる問題の解決

[gallery_saver](https://pub.dev/packages/gallery_saver) は、写真・画像をカメラロール、ギャラリーに保存するライブラリ。
※ 使用バージョン gallery_saver 1.0.7

Androidのみ、同一ファイル名で保存をかけた場合、エラーとなる問題がある。

発生するエラー。

“`kotlin
E/AndroidRuntime(21661): FATAL EXCEPTION: DefaultDispatcher-worker-1
E/AndroidRuntime(21661): Process: com.example.myapp, PID: 21661
E/AndroidRuntime(21661): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String android.net.Uri.getLastPathSegment()’ on a null object reference
E/AndroidRunti

元記事を表示

Kotlin Coroutine 入門2: 並列実行と Structured Concurrency と例外

[前回](https://qiita.com/wm3/items/48b5b5c878561ff4761a)は Kotlin の coroutine の基本として、起動と suspend 関数の解説をしました。今回は coroutine を並列で起動する場合に必要になってくる概念を解説していきます。

### シナリオ: 最安値を見つけろ!

今回は「二つの販売店の API を使って商品の価格を比較し、最安値を取得する」というシナリオを考えます。動作を見やすくするために `Store` という抽象クラスを用意しました。

“`kotlin
/** お店の商品情報を提供する抽象クラス */
abstract class Store(private val name: String) {
/** 価格取得の実装。サブクラスが実装する。 */
protected abstract suspend fun doGetPrice(itemCode: String): Int

/** doGetPrice を呼び出し、取得開始と終了、エラーが出た時にログを出力します。

元記事を表示

Androidのカスタムビューに2way-DataBindingを設定する

### BindingAdapterのソースコード
“`
@BindingAdapter(“frame”)
fun Ocha.setFrame(frame: Int) {
setFrame(frame)
}

@InverseBindingAdapter(attribute = “frame”)
fun Ocha.getFrame() = getFrame()

@BindingAdapter(“frameAttrChanged”)
fun Ocha.setListener(listener: InverseBindingListener?) {
findViewById(R.id.seekBar).setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
fi

元記事を表示

【Android】Fragment間で値をやりとりする

# はじめに
あるFragmentで取得した値を、他のFragmentでも使いたい場面は多々あるかと思います。
この記事では、Fragment間で値をやりとりする方法をまとめました。

# 方法一覧
Fragment間で値をやりとりする方法は、ざっくり分けて次のとおりです。

– Bundleを使う
– 【応用】SafeArgsを使う
– ActivityのスコープでViewModelを使う
– navGraphViewModelsを使う

抜けがあったら教えてください。

次に、それぞれのやり方について解説していきます。
※番外編としてViewPagerやBottomNavigationのページ間で値をやりとりする方法についても解説します。

## Bundleを使う
一番オーソドックスなやり方です。遷移先のFragmentを生成する際に値をargumentsとして渡します。

### やり方

以下のようにして遷移先のFragmentに値を渡します。

“`kotlin
val title = “タイトル”
// Bundleインスタンスを作成
val bundle = Bu

元記事を表示

Flutterでflutter_app_badgerを使い、アプリのホームアイコンにバッジを表示する

Flutterでアプリ開発をしている[村松龍之介](https://twitter.com/riscait)と申します。
(仕事ではiOSアプリのネイティブアプリ開発を行っています)

今回は、FlutterアプリにiPhoneやiPadではお馴染みのアイコンバッジを付けるためにパッケージを導入しましたので備忘録です。

## flutter_app_badgerパッケージを導入する
簡単にアイコンバッジを付けられるパッケージがありますので、導入します。
[flutter_app_badger | Flutter Package](https://pub.dev/packages/flutter_app_badger)

### pubspec.yamlを編集
“`yaml
dependencies:
# 〜〜省略〜〜
flutter_app_badger: ^1.1.2 # 導入時点で最新のバージョンを指定でOKだと思います。
“`

## iOS
iOSでバッジを表示するためには権限が必要なので以下を`info.plist`に追記します。
### Android Stud

元記事を表示

ExpoでAPKをビルド後にAndroidManifest.xmlをいじってみる

## やりたいこと
ExpoのデフォルトのAndroidManifest.xmlではapplicationの`android:allowBackup`が`true`で、つまり自動バックアップが有効になっています。
訳あってこれを`false`にしたい。
しかしExpoのManaged WorkflowではiOSのinfoPlistのようにはAndroidManifest.xmlの詳細項目を直接設定することはできないようで、Feature requestsとしてもいくつか挙がっています。
https://expo.canny.io/feature-requests?search=allowbackup

そのため、ビルド後のAPKファイルを展開してAndroidManifest.xmlを編集、再ビルドという手順で無理矢理いじってみることにしました。Javaのソースコードはともかく、マニフェストファイルくらいは簡単に書き換えられるだろうということで。
あまり聞こえのいい感じはしませんが、とりあえずできるかどうか試してみたという感じです。

## まずは`allowBackup=”true”

元記事を表示

AsyncTaskが実行されない不具合の解析

Androidのアプリ開発でAsyncTaskが実行されない不具合があり、解析した際の解析方法をメモします。

## AsyncTaskが実行されない不具合
原因は、AsyncTask(executeOnExecutor(THREAD_POOL_EXECUTOR))で実行した、タスクの処理が想定していたより多くの時間がかかったことで、poolのthreadが全て実行状態となり、新しいタスクが実行されていませんでした。

## 解析方法
再現性の低い不具合だったため、発生時のBugreportで解析を行いました。
※やはり、不具合発生時は[バグレポート](https://developer.android.com/studio/debug/bug-report?hl=ja)を取っておいた方が良いですね。

下記は、不具合が発生したコードを擬似的に再現したものです。
AsyncTaskのexecuteOnExecutor(THREAD_POOL_EXECUTOR)でタスクを実行していますが、sleepを入れて処理に時間がかかるようにしています。

“`kotlin:Sample.kt

元記事を表示

Kotlin coroutine入門 ③~ViewModelの中でcoroutineを扱ってみる~

[Kotlin coroutine入門 ②](https://qiita.com/ymkit/items/71dc7ddcbc6c24c26e83)の続きです。

前回の入門記事から、時間が経っていますが、今回は[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja)の中で、何らかのAPIと通信する体のcoroutineを実装しUIに反映して行きたいと思います!!

## 従来の構成 [MVVM](https://qiita.com/s_emoto/items/08e46b18f72c3b303b12) の[Rx](https://github.com/ReactiveX/RxJava)とcoroutine比較
#### Rx使用時
スクリーンショット 2020-03-22 1.11.50.pngAndroid (Kotlin) でブロードキャスト送受信の仕方を理解する

## きっかけ

最近、Android 開発を仕事で行っていますが、複数のアプリ間連携の方法を今まで知りませんでした。
最近知ったのですが、`Intent`と`BroadcastReceiver`を使用することで簡単にアプリ間連携が可能でした。

しかし、まったくの初心者であった自分にとっては???でした。。
そこで今回は 2 つのアプリを連携させる`Intent`の使い方について学ぶことができたので、共有します。

## 環境

– Android Studio 3.6.1
– Android 7.0 以降

## 概要

1 つの Android 端末に 2 つのアプリケーションをインストールし、その 2 つのアプリ間の連携方法について記述します。
今回作成するアプリは以下になります。

#### IntentBroadcast アプリ
– `Intent`を Android 端末アプリケーション内の全てのアプリにブロードキャストするアプリケーション

#### IntentReceiver アプリ
– ブロードキャストされた`Intent`を受信するアプリケーション

## 1.

元記事を表示

checkSelfPermissionがPERMISSION_DENIEDしか返してくれない罠を踏み抜いた話

すでにリリース済みのアプリに対して某広告系ライブラリを入れた時に突如パーミッション関係が軒並みDENIEDを返すようになりパニックになったので自分のための備忘録として。

# 現象
“`
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
“`
もしくはその後、`requestPermission`をコールした後に`onRequestPermissionsResult`で戻ってきた後の第三引数が全部PERMISSION_DENIEDになる。
ちなみに勿論パーミッションは許可された状態で起きる。
今回の場合はすでにリリース済みのアプリで、このあたりは元々元気に動いていたのに急にスンッ・・・とおかしくなったので事態の把握は楽でした。

# 原因と対応
“`

“`

`AndroidManifest.xml` で定義しているpermissionは上記のよ

元記事を表示

Android で Firebase In-App Messaging が表示されない問題の workaround

# はじめに
Android で Firebase In-App Messaging を表示させてようとしても、アプリの作り次第では、 **表示されない or すぐに消えてしまう問題** が発生することが確認されました。
全てのケースで解決しないかも知れませんが、意図通りに表示できる workaround を見つけたので記しておきます。

Firebase In-App Messaging 導入時の参考になれば幸いです。

※調査した技術内容が多めです
※キャンペーン情報の取得完了のタイミングや、メッセージを表示したい Activity の lifecycle の状態次第では上手く行かないケースが存在するかも知れません
→ 技術的背景を理解した上で、最適な workaround を使うことをオススメします。

## 本記事での用語

| 用語 | 意味 |
| — | — |
| LaunchActivity | `AndroidManifest.xml` で `android.intent.category.LAUNCHER` が指定されている Activity |
| Ma

元記事を表示

GoogleMapsAPI備忘録(2020年3月時点)

# はじめに
今までの案件で使ったGoogleMapsAPIについての備忘録です。
APIの仕様や制限が変わるので、忘れる前に備忘録を残します。

# GoogleMapsAPI
[公式URL](https://developers.google.com/maps/documentation?hl=ja)

## マップ
– **Maps SDK for Android**
地図を Android アプリに追加します。

– **Maps SDK for iOS**
地図を iOS アプリに追加します。

– **Maps Static API**
シンプルで埋め込み可能な地図画像を最小限のコードで追加します。

– **Maps JavaScript API**
ウェブサイトにインタラクティブな地図を追加します。独自のコンテンツと画像でマップをカスタマイズできます。

– **Street View API**
360 度のパノラマ画像を使用して実世界の画像を埋め込みます。

– **マップ URL**
Google マップを起動し、クロスプラットフォームの

元記事を表示

Lapack(clapack)を Android arm64 + cmake + NDK r20 or later でビルドする

## 背景

* Lapack(+ BLAS) を使うアプリを Android でビルドせねばならない.
* CMake + NDK r20 or later(clang)でビルドしたい

## ビルド

https://github.com/syoyo/clapack-cmake-android-arm64

に上げました.

clapack-3.2.1-cmake をベースにしています.

いくらか warning 出ますが, build できます.

aarch64 linux(Jetson AGX)で unit test を走らせたら, `xeigtstz_***` のテストは実行がコケました.

## 変更したところ

### uninit.c

FPU の設定をします.
使っていないようなので取り除きました.
(Android では FPU control できるかな?)

### `__off64_t`

sysdep1.h で, OFF_T を int64_t にしました.

### arith.h

f2clib で, 実行時にシステムの情報を取得して arith.

元記事を表示

OpenBLAS を Android aarch64 + NDK r20 or later でビルドするメモ

## 背景

OpenBLAS(+ Lapack)を Android arm64 で動かしたい.

Lapack(clapack)はこちら

Lapack(clapack)を Android arm64 + cmake + NDK r20 or later でビルドする
https://qiita.com/syoyo/items/09009ca77393cc0bd986

## ビルド方法

How to build OpenBLAS for Android
https://github.com/xianyi/OpenBLAS/wiki/How-to-build-OpenBLAS-for-Android

は情報が古いです.

NDK r20 などでは, gcc 関連がそれなりに消えて clang only になったので, wiki の情報だとビルドがうまくいきません.

Compiling OpenBLAS for Android #2005
https://github.com/xianyi/OpenBLAS/issues/2005

にありました.

“`
cd $OPENBL

元記事を表示

Android/Kotlin + Go で gRPC Bidirectional Streaming するサンプルをゼロから構築

# これは何

サーバが Go 、クライアントが Android/Kotlin という構成で 双方からリアムタイムにメッセージを送り合う仕組みとして、gRPC Bidirectional Streaming を使ったサンプルを作るのに必要な設定やコードをまとめたものです。

いろいろ調べながらやっていると新旧どれが正しい情報かわからず結構手間がかかったり、基本的な所でつまづいていることに気づきにくかったりしたため、この記事もしばらくの間しか使えないと思いつつ、記事にまとめておくことにしました。

Go も Android/Kotlin も普段使いしているわけではないため、色々と内容に不備があると思います。何かあれば指摘いただけるとありがたいです!

# 仕様

– 文字列ひとつだけのメッセージ `Greeting` をサーバとクライアント間で双方向で送り合う
– サーバは数秒ごとに連番付きのメッセージをクライアントに送り続ける
– サーバはクライアントからメッセージを受信したら標準出力に表示
– クライアントはボタンをクリックすると TextEdit の内容をサーバに送

元記事を表示

簡単なゲームを作ってみよう(Win or Lose)

#簡単なゲームを作ってみよう

[ドットインストール](https://dotinstall.com)の[はじめてのJavaScript](https://dotinstall.com/lessons/basic_javascript_v4)で「#11 簡単なゲームを作ってみよう」をやっあと、
ふと思い立ったのでFlutterで作ってみました。

#仕様

1. 5つのマスがあり、5つのうちランダムで1つが「Win」、4つが「Lose」になる。
2. 「Lose」が選択された場合、マスに”Lose!”が表示される。
3. “Lose!”が表示されるのと同時にマスが小さくなる。
4. 「Win」が選択された場合、マスに”Win!”が表示される。
5. “Win!”が表示されるのと同時にマスが青からピンクに変わり、回転しながら四角形から円に変わる。

こんなところでしょうか。

  • OTHERカテゴリの最新記事