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

Android関連のことを調べてみた2021年11月01日
目次

エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるフィルタリング

## はじめに

Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、AndroidやiPhone(Swift, Objective-C)のようなスマートフォンやエッジデバイス用の組込データベースであるCouchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。

先日発表した[エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル](https://qiita.com/yoshiyuki_kono/items/b9eb6ddae93fc98f4f7b)では、データ同期に参加するモバイル端末/ユーザーの観点からみたコントロールについて紹介しました。

本稿では、データ同期されるデータ(ドキュメント)の観点からみたコントロールについて紹介します。

## 設定方法
Sync Gatewayは、同期プロセスをカスタマイズするためのJavaScript関数の使用をサポートし

元記事を表示

Android11でアプリ内の領域に出力したファイルを自分の手元のPCに持ってこようとしたら Permission denied と言われる件

# 概要
掲題について、調べると手順が出てくるのですが、おおよそ

– Android端末内の/sdcard/にファイルを一度コピー
– それをadb pull でPCへコピー

という手順になるのですが /sdcard/(実際には /storage/self/primary へのシンボリックリンク)へのコピーが Permission denied となってしまいました。

# 端末
Android11

# 今回の回避方法
おそらく正しいアプローチがあるのだと思いますが、今回そこまで時間をかけられなかったので、以下でとりあえずの回避が出来ました。

アプリのファイルのパスを確認

“`
TANMATSU:/ $ run-as com.xxx.xxxxxxxxzzz
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz $ cd files
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz/files $ pwd
/data/user/0/com.xxx.xxxxxxxxzzz/files
TANMATSU:/data

元記事を表示

Jetpack Compose ConstraintLayoutの基本的な利用方法

AndroidのJetpack ComposeでConstraintLayoutの基本的な利用方法です。
この記事は以下のバージョンに対応しています。

| | バージョン |
|:———–|:————:|
|Jetpack Compose|1.0.4|
|androidx.constraintlayout:constraintlayout-compose|1.0.0-beta02|
|AndroidStudio|ArcticFox 2020.3.1 Patch 3|

# 基本的な利用方法
Jetpack ComposeでConstraintLayoutを利用するために固有の`androidx.constraintlayout:constraintlayout-compose`というライブラリを導入する必要があります。

`ConstraintLayoutSample`を例に基本的な利用方法を説明します。

“`Kotlin:ConstraintLayoutSample.kt
@Preview(showBackground = true)
@Compo

元記事を表示

Android11対応と2021年対応でやったこと (RSSリーダーアプリ編)

## 前回
https://qiita.com/keidroid/items/7452a6988011664eb8d9

## はじめに
今日はハロウィン?ですが明日11/1は毎年恒例のAndroidアプリの要件変更日となります。

https://android-developers-jp.googleblog.com/2020/12/new-android-app-bundle-and-target-api.html

> 2021 年 11 月より、既存アプリのアップデートでターゲットAPIレベル30以上およびAndroid 11の動作の変更点への対応が必須になります。
> – ターゲットAPIレベル30(Android 11)以上、および動作の変更点に対応する。
> – Android App Bundle 形式で公開する
> – ダウンロードサイズが150MBを超えるアセットや機能は、Play Asset Delivery または Play Feature Delivery を使って配信

今年は課金ライブラリ締め切りも同日です。

[Google Play Billing

元記事を表示

JNIでNullableなint値を受け取り、jobjectからint値に変換する方法

# 概要

JNIを使用したAndroidのアプリをKotlinで作成しているとき、JNIの関数にNullableのKotlinのInt値を渡したいということがあった。
Nullableでない値を渡す場合であればネイティブ側でjintとして受け取るところなのだが、Nullableの場合だとエラーが発生してjintは使用できなかった。
そのため、Nullableな値をネイティブ側でjobjectとして受け取った後にjobjectからint値に変換するということを行ったのでその方法を記載する。

# JNIでjobjectからint値に変換する方法

以下のようにすることでjobjectをint値に変換することができる。

“`cpp

// JNI関数の定義はKotlin側の別の場所で以下のように定義されている
external fun sampleFunc(value: Int?): Int

// ネイティブ側のコード
// サンプルなので関数名は適当かつ、int値を返すだけのコード
JNIEXPORT jint JNICALL
con_example_app_sampleFunc

元記事を表示

Androidでキーボードを閉じられたのを検知する方法

# 概要

AndroidのEditTextを入力時、戻るボタンを押してキーボードを閉じたときに特定の処理を行いたいことがあった。
そのため、Androidで表示されているキーボードが閉じられたのを検知する方法を記載する。
言語はKotlin

# キーボードが閉じられたのを検知する方法

以下のようにすることで、キーボードが戻るボタンで閉じられたのを検知できる。

“`kotlin
// EditTextを継承したクラスで以下を定義
override fun onKeyPreIme(key_code: Int, event: KeyEvent): Boolean {
if(key_code == KeyEvent.KEYCODE_BACK && evnet.action == KeyEvent.ACTION_UP) {
// TODO キーボードを閉じたときに実行したい処理を書く
}
return super.onKeyPreIme(key_code, event)
}
“`

元記事を表示

Androidでアプリ起動時にEditTextにフォーカスがあたらないようにする方法

# 概要

Androidでアプリ作成時にアプリ起動時にEditTextにフォーカスがデフォルトであたっていた。
そのため、特定の端末ではアプリ起動時にキーボードが表示されてしまうという現象が発生した。
この現象を修正するために行った、起動時にEditTextにフォーカスがあたらないようにする方法を記載する。
アプリを作成する際に使用していた言語はKotlin

# アプリ起動時にEditTextにフォーカスがあたらないようにする方法

AndroidのLayoutのxmlでEditTextの親のレイアウトに以下のコードを追加する。
こうすることでアプリ起動時にEditTextにフォーカスはあたらなくなる。

“`xml
android:descendantFocusability=”beforeDescendants”
android:focusableInTouchMode=”true”
“`

元記事を表示

AndroidのEditTextからフォーカスを外す方法

# 概要

AndroidのEditTextで入力を確定したあともフォーカスがそのまま残ることがあった。
入力確定後はEditTextからフォーカスは外れてほしい。
そのためAndroidでEditTextからフォーカスを外す方法を記載する。
言語はKotlin

# フォーカスを外す

以下のコードを入力確定時のイベントで実行するようにすることでフォーカスが外れるようにすることができる。

“` Kotlin
val parent = parent as View
parent.isFocusable = true
parent.isFocusableInTouchMode = true
parent.requestFocus()
“`

元記事を表示

Flutter Flavor対応(パッケージ未使用)

#内容
Flutter開発時にFlavorが導入されたプロジェクトに参画したり、他のメンバーがFlavorを導入した後にFlutterを触ったりすることはあったが、自分でFlavorを導入したことがなかったので、導入までの流れをまとめる。

やり方は様々あるようですが、今回は、main_dev.dartとmain_prod.dartの2ファイルを作成する方法で行います。

#開発環境

PC:macOS Big Sur
エディター:Visual Studio Code, Android Studio, Xcode

Dart:2.13.1
Flutter:2.2.1
Visual Studio Code:1.16.2
Android Studio:4.1.2
Xcode:13.1

その他
 Flavorパッケージは未使用
今回は開発環境と本番環境を作成する。
それぞれの名前は以下のように統一している。(Android, iOS共に同じ名前を使用する。)
開発環境:dev
本番環境:prod

#準備

以下のファイルを作成する。

・main_dev.dart
・main_pro

元記事を表示

onOptionsItemSelected の簡略化

# ■ 概要
[onOptionsItemSelected()](https://developer.android.com/reference/android/app/Activity#onOptionsItemSelected(android.view.MenuItem)) は、もっと簡易な呼び出しがあっても良さそうな気がするので、試しに作ってみたという話。

# ■ 仕様
本家で[こんな感じの説明](https://developer.android.com/guide/topics/ui/menus#RespondingOptionsMenu)がされているので、仕様を以下のようにしてみた:

– 呼び出し方法
– itemId と、それに対応する処理を指定する。
– 実行内容
– 指定された itemId が対象だった場合は、対応する処理を実行し、問答無用で true を返し、super は呼ばない。[^1]
– 指定された itemId が対象でなかった場合は、super を呼び出す。

# ■ 例
## ☆ 従来の書き方
“`kotlin
// For 1 m

元記事を表示

ScrollableなComposableでコンテンツをレイアウトいっぱいに表示させる方法

`verticalScroll` / `horizontalScroll`、`LazyColumn` / `LazyRow` などの Scrollable な Composable の中では、コンテンツのサイズが定まらないため `fillMaxSize` などを使用してレイアウトいっぱいに何かを表示させることができません。

例えばリストで空の表示を画面いっぱいに出したいとして以下のようなコードを実装してもテキストは真ん中に表示されません。

“`kotlin
@Composable
fun Sample() {
LazyColumn(
modifier = Modifier.fillMaxSize()
) {
item {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(t

元記事を表示

【M1 Pro/Max対応】M1 Mac環境構築ベストプラクティス

# はじめに
2021/10/26にM1 Pro/Maxを搭載したMacBook Proが発売され、現在環境構築をされている方も多いかと思います。

一方で、Pro/Maxも含めた**M1 Mac**はIntel Macと同じ方法でセットアップできないツールが多く、また公式未対応時のイレギュラーなセットアップ方法の記事がネット上に多く存在するため、**どのセットアップ方法が正しいのか判断するのが非常に難しい**状況となっています。
![独自インストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a6953011-924a-8d9b-8d63-c1fce4b6bad9.png)
そこで今回、私が調べた範囲で**現時点でのベストプラクティスと思われる方法**をまとめてみました。

方法選択には主観も含まれているため、**「こちらの方が良い!」**という方法をご存じであれば、気軽にコメント頂けるとありがたいです

## 更新情報
本記事は**2021/10/30時点**での内容となります。

元記事を表示

【M1 Pro/Max対応】M1 MacにおけるAndroid開発環境構築

# はじめに
[こちらの記事](https://qiita.com/c60evaporator/items/71a84e198fa078a4f956)でも触れましたが、M1 Macはイレギュラーなインストール方法のツールが多く、Android開発に使用するAndroid Studioもその例外ではなく、公式以外の方法でのインストールが必要な機能がいくつか存在していました。

一方で公式側の対応も進んでおり、2021/10/30現在、ほぼ**公式ツールのみでセットアップが完結する**状況となっております。

そこで今回、**M1 Mac向けAndroid Studioのセットアップ方法**について記事にまとめようと思います。

# Android Studioのダウンロードとインストール
[Android Studioのダウンロードページ](https://developer.android.com/studio#downloads)にアクセスし、「Download options」をクリックします
![スクリーンショット 2021-10-28 22.36.53.png](https:/

元記事を表示

Jetpack Compose 枠線つきの角丸

AndroidのJetpack Composeで大枠のComposeを枠線つきの角丸にする方法です。
この記事は以下のバージョンに対応しています。

| | バージョン |
|:———–|:————:|
|Jetpack Compose|1.0.4|
|AndroidStudio|ArcticFox 2020.3.1 Patch 3|

# Viewの場合
Viewを枠線つきの角丸にする場合、下記のようなxmlファイルを作成し、Viewのbackgroundに定義しました。

“`xml:rounded_corner_bg.xml


元記事を表示

RetrofitでDELETEメソッドに@Bodyつける

# 問題
retrofit使ってたらこんなエラーが出た

“`
android retrofit non-body http method cannot contain @body.
“`

DELETEやGETメソッドで`@Body`を使ったjsonリクエストはできないらしい

# 解決
いやいや、できる

“`kotlin
@DELETE(“https://hogehoge/fugafuga”)

@HTTP(method = “DELETE”, path = “https://hogehoge/fugafuga”, hasBody = true)
“`

`@Body`つけれた

元記事を表示

Jetpack Compose で追加読み込みに対応した LazyColumn を実装する

Jetpack Compose で追加読み込みに対応した LazyColumn を実装しましたので、その方法をまとめます。
具体的には、一番下までスクロールしたときに追加読み込みを行う処理を呼び出すところまでの実装になります。

# はじめに

まず、Jetpack Compose には[Lazy コンポーザブル](https://developer.android.com/jetpack/compose/lists?hl=ja#lazy)という Composable があり、RecyclerView と同様の役割を担います。

Lazy コンポーザブルには`LazyColumn`や`LazyRow`などがあります。本記事では`LazyColumn`を使用します。

# 実装したコード

以下に実装コードを示します。

“`kotlin
@Composable
fun AdditionalReadableItems(items: List, onAppearLastItem: (Int) -> Unit) {
val listState = rememberL

元記事を表示

エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル

## はじめに

Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、Androidをはじめとしたスマートフォンや、エッジデバイス用の組込データベースである、Couchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。

Sync Gatewayによるデータの同期を理解するには、まず、アクセス制御モデルを理解することから始まるといってよいでしょう。

## アクセス制御モデル

### コンセプト
ドキュメントへのアクセスを制御するには、ドキュメントをチャネルにルーティングし、そのタイプのドキュメントにアクセスできるようにするユーザーまたはロールがそのチャネルにアクセスできるようにします。

### モデル
Couchbase Mobileでは、ドキュメントへのアクセスは、ユーザー、ロール、チャネルという、3つのエンティティによって管理されます。

#### アクセス制御モデル
![image.png](https://qiita-image-st

元記事を表示

【React Native】FCMの設定でつまずいたこと(Androidのみ)

##1、FCM(Firebase Cloud Messaging)とは
Firebaseが提供しているアプリにプッシュ通知を送る機能です。
機能自体無料で使えて、アプリ側ではfirebaseから取得したfcmトークンをfcmに設定するだけでプッシュ通知を受け取れるためかなり便利です。
本格的なアプリを作るとなるとプッシュ通知は必要不可欠です。
https://firebase.google.com/docs/cloud-messaging?hl=ja

##2、FCMの簡単な仕組み・設定方法
https://firebase.google.com/?hl=ja
↑Firebaseでプロジェクトを作成し、左のメニュー欄からCloud Messagingを選択します
開始方法からiOS、Android両方の設定をします。
iOSの方はAPNs認証キーの設定も必要なため、Apple Developerの登録も必要です。
今回はAndroidのみですのでそこは割愛します。
 
https://rnfirebase.io/messaging/usage
次にアプリ側でFCMトークンを取得し、その

元記事を表示

【React Native】Androidでダークモードにするとアラートの文字が黒いままになってて見にくい

#Androidでダークモードにするとアラートの文字が黒いままで見にくい現象が起きた
Androidでアラートを出そうとした時、通常はこのようなUIになります。
![スクリーンショット 2021-10-13 14.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/72d37f65-05b7-883e-c6bf-951b45a33671.png)
実装はとても簡単でこんな感じです。

“`javascript
import React from ‘react’;
import {Alert, Button, View} from ‘react-native’;

export const AlertView = () => {
const onAlert = () => {
return Alert.alert(‘こんにちは’)
}
return (

元記事を表示

【React Native】アプリ内でWebViewを表示する時のヘッダータイトルを動的に変更

##アプリ内でWebViewを表示する時、WebView内で画面遷移してもも動的にヘッダータイトルを変更したい
アプリを実装していく中で、ほぼ間違いなくStackNavigationを使って画面遷移の制御をすると思います。
アプリで表示するところは画面ごとにタイトルを決めれますが、webViewは一つタイトルを決めて、そこからwebView内で画面遷移しても同じタイトルが使われてしまいます。
webViewを使うときはタイトルを表示しないという選択肢もありますが、タイトルを動的に変更する方法を見つけたので共有します。

##ライブラリをインストール
`react-native-webview`
`cd ios && pod install`

##実装
WebViewの`onNavigationStateChange`というメソッドを使ってWebViewのタイトルタグを取得します。

“`javascript
import React from ‘react’;
import {WebView} from ‘react-native-webview’;
import { SafeAr

元記事を表示

OTHERカテゴリの最新記事