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

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

ReactNativeでAndroidのネイティブモジュールを実装する

作りたいアプリがAndroidのネイティブモジュールが必要なものだったので、作ることにしました。
2年前にもちょっとさわりましたが、前回はだいぶ適当だった+忘れていることもあり、自分用のメモも兼ねて書きます。

# はじめに

ReactNativeにはデフォルトである程度のネイティブモジュールが用意されています。例えば、カメラや録音など

通常その用意されたモジュールを使うので、Androidのネイティブモジュールを別段実装する必要はありません。

用意されたモジュールでは対応できない場合に実装する必要があります。

実装はAndroidJavaで行います。

# Androidのネイティブモジュール

ドキュメントは[ここ](https://reactnative.dev/docs/native-modules-android)を読みました。

今回はドキュメントに書かれているToastModule(一瞬表示されるアラートのようなやつ)を参考に勘所が書けたらなと思います。

## モジュールを作る(例.ToastModule.java)
### ①作りたいモジュールのJavaファ

元記事を表示

スクリーンリーダーでのAndroidアプリ開発_使用を見送ったNativeScript編

Flutterをがっつり使ってみようと思う前に少し興味がありNativeScriptを触っていました。
XMLとJavaScriptでネイティブアプリが作れるということでサンプルコードをいじっていました。
また調べていく中でプラグインでスクリーンリーダー(AndroidではTalkBack、iOsではVoiceOver)を制御できる物があることを知りました。
アプリを動かす上で画面表示されている内容を読み上げるだけでなく、強制的にアナウンスをさせたい場面があります。
たとえば画面の遷移中や読み込み中て時間がかかっているときなどはその旨のアナウンスがあるとユーザは状況がわかり安心します。
なのでこのプラグインにも魅力を感じていました。
(Flutterにもいくつか同様のライブラリはあるようです)
ですが、以下の問題がありNativeScriptの使用を止めることにしました。
私の学習が足りなかったところもあると思いますが、記録として残しておきます。

———-

## ボタンに対するテキストラベルの問題
ただのアイコンや画像のボタンではそれがとのような働きをするのかスクリーン

元記事を表示

FlutterでSemanticsクラスを使ってコンテキストメニューを作成

表題の機能を組み込むときに参考情報が少なかったので、メモとして記します。

——

##実現したいこと
アプリにはタップや長押しで呼び出すメニューの他に、スクリーンリーダー(Android→TalkBack、iOS→VoiceOver)向けにコンテキストメニューを提供することができます。
Androidでは
[[ローカルコンテキストメニュー]] → [[操作]]
(ローカルコンテキストメニューは上にスワイプしてから右にスワイプで開きます。)
iOSでは縦のスワイプ
でそれぞれ呼び出すことができます。
これにより素早く機能を呼び出すことが可能です。
作成は対象のウィジェットを[[Semantics()]]で囲い[[customSemanticsActions]]プロパティでメニューを定義します。

また[[onTap]]と[[onLongPress]]プロパティでタップと長押しの動作も定義できます。
これは[[GestureDetector()]]でウィジェットを囲い定義することと同様です。
Semantics()ではそれぞれ[[onTaphint]]と[[onLongPress

元記事を表示

Gradle で依存ライブラリをまるっとダウンロードする方法

以下のサイトの方法で行けました。

https://www.torutk.com/issues/79

## 自分のケース

`com.microsoft.identity.client:msal:1.6.0` の依存ライブラリをまるっとダウンロードしたかったです。
`com.microsoft.device.display` は exclude する必要があったので、最終的には以下の gradle ファイルで行けました。

“`gradle:build.gradle
apply plugin: ‘java’

repositories {
google()
mavenCentral()
}

dependencies {
compile (“com.microsoft.identity.client:msal:1.6.0”) {
exclude group: ‘com.microsoft.device.display’
}
}

task copyDeps(type: Copy) {
from (configuratio

元記事を表示

FlutterFragmentのためにViewPager2を改造する

前回の記事
[FlutterFragmentとViewPagerの組み合わせはonResumeのタイミングで難しかった](https://qiita.com/tfandkusu/items/50a1c4f5d5551aa816a3)
では、[ViewPager2](https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2)はページが完全遷移するまではonResumeが呼ばれないので、初回のonResumeで描画するFlutterFragmentとは相性が悪いという説明をしました。

よってすぐにonResumeが呼ばれるようにViewPager2を書き換えてみようと思います。[setMaxLifecycleメソッドの呼び出しが問題](https://qiita.com/tfandkusu/items/50a1c4f5d5551aa816a3#onresume%E3%81%8C%E5%AE%8C%E5%85%A8%E9%81%B7%E7%A7%BB%E3%81%BE%E3%81%A7%E5%

元記事を表示

Firebase Dynamic Links について

# はじめに

Firebase Dynamic Links で Android の Deeplink を実装することになったので、そのメモとして残しておきます。

# Android プロジェクトに Firebase を追加する

公式に手順がまとめられているの
https://firebase.google.com/docs/android/setup?hl=ja

※ SHA-1 情報は Firebase Dynamic Links で必要になるため忘れないようにする。さらに App Links を利用する場合は、 SHA-256 情報も必要になる。
※ ディープリンク URL は有効な URL でなければならない。

# google-services.json をダウンロードして設定
“`
app
└── src
├── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── res
├── dev
│ └── google-servicesjson.json

元記事を表示

Android: VideoをBitmapに変換する

## はじめに
Android で、Video のデコードは、`MediaCodec`で、簡単に実装できる。
が、`MediaCodec`ではデコード結果は、`Image`か`ByteBuffer`として取得できる。
これをBitmapに変換する方法に苦労したので知見をここに残す。

## 開発環境
Android, Kotlin

## コード
サンプルコードは https://github.com/kenmasumitsu/VideoToImages 参照

## 解説
一言で言うと、
[Android CameraXのドキュメント](https://developer.android.com/training/camerax/take-photo) で言及されている、`YuvToRgbConverter.kt` を使って、 `Image` を `Bitmap` に変換のがポイント。

ググると、

* https://stackoverflow.com/questions/41775968/how-to-convert-android-media-image-to-bitmap

元記事を表示

内部アプリ共有したアプリでGoogleログインができない

# 結論
内部アプリ共有では、ビルド時に指定した署名ファイルのSHA-1フィンガープリントではなく、内部アプリ共有用のフィンガープリントで、OAuthクライアントを指定してやる必要がある。

# 手順
AndroidでGoogleログインする際には、Google Developer ConsoleにてOAuthクライアントの認証情報を設定してやる必要がありますよね。
その際に、アプリの署名のSHA-1フィンガープリントを設定する項目があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102032/8636dbf5-6a80-2662-f82a-a082cb5f1503.png)

内部アプリ共有でテスターにアプリを配信する際、この項目を内部アプリ共有用のSHA-1フィンガープリントにしてやる必要があります。
本番用の設定を変更して本番のアプリが動かなくなっても困るので、「内部アプリ共有用」とでも名前をつけたOAuthクライアント認証情報を新たに作成してやるのがいいかと思います。

元記事を表示

シンボルを見つけられません。import android.support.v4.app.ActivityCompatの読み込みエラー

ReactNativeでAndroidのネイティブモジュールを実装しようとしたところ、前使っていたコードが動かないことがわかりました。

“`bash
/path/project/android/app/src/main/java/com/project/TestModule.java:28: エラー: シンボルを見つけられません
import android.support.v4.app.ActivityCompat;
^
シンボル: クラス ActivityCompat
場所: パッケージ android.support.v4.app
“`

というエラーがでました。

どうやら、**android.v4**はサポートが切れ、
代替えとして、**androidx.**に移行する必要があるようです。

調べたところ、やることは2つで、

① dependencyの追加

build.gradleのdependenciesに

“`gradle
implementation “androidx.core:cor

元記事を表示

新卒プログラマの学習ログ 〜 其の二 〜

#App Architecture
Codelabsをとりあえず一周、手を動かしながら進めてみました。

その中で、書かれているコードのパターンが、MVVM(Model-View-ViewModel)と呼ばれるアーキテクチャです。
Googleより推奨されているライブラリを用いた実装パターンで、これに従うことでメンテナンス性、可読性に優れたプログラムとして開発を行うことができるとされています。
しかし、普及としては割と最近のようで、Androidアプリ開発者用の参考書ではまだまだ異なるパターンの記述が多い印象です。

##MVVMとは?
先述の通りModel-View-ViewModelを表しています。

###Model
データを管理する役割を担います。
APIやデータベースを扱う際のDaoやdataクラスに当たります。

###View
UIコントローラーの役割を担います。
画面表示や遷移、Fragmentの切り替えやユーザーのアクションを検知するリスナーをここで設定します。
Viewの管理はDataBindingのライブラリによって行っています。
下記のコードではフラグメントでの

元記事を表示

ConstraintLayout入門その3 – percent

ConstraintLayoutを使用するための設定については、[ConstraintLayout入門その1](https://qiita.com/yamadacsa/items/a4fcf4de9982111cdb7c)をご覧ください。

## ConstraintLayout自動変換があればFrameLayoutやLinearLayoutを捨てられる?

Android Studioは、レイアウトXMLファイルに書かれた既存のViewを他のViewクラスに自動変換する機能を持っており、これを使ってLinearLayoutなどをConstraintLayoutに変換することができます。しかし、本稿執筆時点の最新安定版のAndroid Studio ver.4.0.1でこの機能を試してみた結果は期待はずれ、とても自動変換だけでそのままアプリに使えるConstraintLayoutになってくれません。LinearLayoutで垂直ないし水平に並んだViewの並びをConstraintLayoutの制約表現に変える機能だけならまだしも、LinearLayoutでよく使われる “`andr

元記事を表示

*Android*ピンチイン・ピンチアウトを検知する

#はじめに
こんにちは.今回は,Androidでピンチ操作を検知しようと思います.ピンチイン・ピンチアウトを判別する方法について解説します.

#前提
開発環境は以下の通りです.
*Android Studio 4.0.1
*targetSdkVersion 28
*Google Nexus 5x

#ピンチイン・ピンチアウトの判別
ピンチ操作の検知には,“`ScaleGestureDetector“`を使用します.第一引数にContext,第二引数には,“`OnScaleGestureListener“`インタフェースを実装したクラスのオブジェクトを指定します.今回は,匿名クラスを使用して,インタフェースを実装します.

“`java
this.scaleGestureDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.OnScaleGestureListener() {
// ピンチ操作中に繰り返し呼ばれる
@Override
public boolean onSca

元記事を表示

android webviewをchromeみたいに使う

#まずは全体のコードはこんなかんじです。

“`kotlin:MainActivity.kt
package com.sample.android.webview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.view.WindowManager
import android.webkit.WebView
import android.webkit.WebViewClient
import com.sample.android.webview.R

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.a

元記事を表示

GitHub Actions で Android アプリを手動ビルドできるようにする

下記のようなyamlファイルをAndroidプロジェクトのリポジトリに置きます。

“`yaml:.github/workflows/manual-build.yml

name: Manual build

on:
workflow_dispatch:
inputs:
variant:
description: ‘Build variant’
required: true
ref:
description: ‘branch name|tag name|commit SHA’
required: true
default: master

jobs:
build:
name: Build
runs-on: ubuntu-18.04
steps:
– name: Check out
uses: actions/checkout@v2
with:
ref: ${{ github.ev

元記事を表示

【個人開発】FlutterとFirebaseでサボり防止アプリを作った

先日、個人開発アプリをリリースしました!やったね!!!

審査も通りまして、現在App StoreとPlay Storeで配信されております。

[App Store](https://apps.apple.com/jp/app/%E7%9B%A3%E8%A6%96%E3%81%97%E5%90%88%E3%81%86%E4%BC%9A/id1507154418)

[Play Store](https://play.google.com/store/apps/details?id=work.oka_ryunoske.procrastinators_watch_mutually)

せっかくなので、利用した技術のメリットと注意点をまとめておこうと思います。

# 作ったアプリ

これです。

広報用ページも作ってみたのでリンクを貼っておきます。

広報用ページはスマホで見る用にレイアウトしてます。

[監視し合う会 〜お互いサボらないようにみんなで作業しよう〜](https://kanshi-shiau-kai-app.web.app/)

英語名: Procrastinators W

元記事を表示

Codemagic でモバイルアプリの CI/CD を始めましょう

この記事は、Codemagic の運営元である Nevercode Ltd の依頼で作成しました。2020/7/6 に公開された [オリジナルの英語記事](https://blog.codemagic.io/getting-started-with-codemagic/)の日本語訳に加え、冒頭に私のコメントを、末尾におすすめの Codemagic 関連の日本語記事へのリンクを列挙しています。

Codomagic は、[今年の2月に発表された Flutter UX 調査チームによる Q4 2019 の調査結果](https://medium.com/flutter/improving-flutter-with-your-opinion-q4-2019-survey-results-ba0e6721bf23)において、開発者が CI/CD で採用しているサービスのトップ3に挙げられており、(Codemagic、 Github Actions、 GitLab)、その中でも満足度が最も高かったことが示されています。

Codomagic は、Google と提携して Flutter

元記事を表示

FlutterFragmentとViewPagerの組み合わせはonResumeのタイミングで難しかった

[ViewPager2](https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2)を使って**2ページ目以降**に[FlutterFragment](https://flutter.dev/docs/development/add-to-app/android/add-flutter-fragment?tab=forward-activity-calls-kotlin-tab)を設定すると、完全にページ遷移するまではFlutterFragmentが描画されず真っ白になります。一度表示すると真っ白になりません。

![device-2020-07-28-223018.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/7026b8a7-1e21-3bd4-af45-4e8b3b41f14f.gif)

このように遷移途中でもFlutterFragmentが描画されて欲しいです。

![device-

元記事を表示

【Android/Kotlin】ViewModel・LiveData基本

#ViewModelとは?
 ViewModelとは、UI関連のデータを保存し管理してくれるクラスです。分かりやすい活用方法でいうと、画面のローテーションをしてもUIを保持してくれたりします。ローテーションに対してUIを保存する方法として、`onSaveInstanceState() `メソッドをアクティビティのライフサイクルに組み込むという手がありますが、複雑なデータは保持できない+ライフサイクルを考えなければならないという点で、リスクがあります。そこで、ViewModelが大活躍します。以下の図を見てください。
![https___qiita-image-store.s3.amazonaws.com_0_88858_68e99b0c-215d-325e-1f75-6875fa580031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658219/7a8f1174-78a6-cbc8-b66a-5b3ea7ab5dec.png)
この図は、ViewModelとActicvityのライフサイクルを表し

元記事を表示

ゲームアプリ制作におけるベジェ曲線の可能性

## はじめに

### アプリの絵がぼやける理由
アプリを遊んでいて「絵がぼやけてる」と感じたことはありませんか?
解像度の大きな端末に乗り変えたら、お気に入りのアプリの表示がボケボケで、切ない気分になった人は少なからずいるのではないでしょうか?

これは、アプリの画像素材のほとんどがペイント形式で作成されているからです。
ペイント形式とは画素を並びで保持する形式なのですが、拡大や回転による品質の劣化が起こります。

例えば、**1280×720** のキャラクタの立ち絵がペイント形式で用意されていて、アプリが画面全体に表示させたとします。
解像度 **1280×720** の端末であればクッキリと表示されますが、**2560×1440** の端末だと画素が引き延ばされて画像がぼやけてしまうことになります。

### アプリの文字がぼやけない理由
さて、こうも思ったことはありませんか?

「文字だけやけにきれいに見える」

これは、文字がドロー形式で表示されているからです。
ドロー形式とは、データとして座標や色情報などを保持しておき、計算で絵を生成する形式のことです。

先の

元記事を表示

Toolbarのメニューの文字の色だけ変える方法

AndroidのToolbarのメニューの文字の色を変える方法でうまくいく方法が見つからなかったのでメモです。

## やりたいこと
こんな感じのことがやりたかった。

## やり方
styles.xmlに以下を記述

“`xml:styles.xml