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

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

【Android】ストレージ系を簡単にまとめる

株式会社パーソンリンクアドベントカレンダー14日目です!?
本日12/14は、南極の日だそうです。
> 1911(明治44)年のこの日、ノルウェーの探検家・アムンゼンと4人の隊員が人類で初めて南極点に到達した。
よろしくお願いします。

## はじめに
Anroidアプリでファイルや画像を保存する時に、
保存ディレクトリを取得することがあるのですが、どこに保存すれば良いのか、どんな違いがあるのか、すごくややこしいので簡潔にまとめます。

## その前に
Androidはメジャーバージョンが年に1回上がるらしいです。
Android9.0からAndroid10.0へ みたいな
バージョンが上がると非推奨になるメソッドや処理が当然ながら出てきますが、
今回は非推奨になっているものも含んで紹介します。
スマホ業界は、プライバシーを守るため、セキュリティの向上のために、バージョンを上げて対応していきますが、アプリ開発者はその対応に必死です。
→場合によってはこれに対応しないとリリースできないよーってなるみたいです。

## 内部ストレージ系
端末ストレージに保存する内部ストレージ系
Andr

元記事を表示

NrealLightアプリ実行中にログを確認する

# NrealLightとは

NrealLightとはARグラスの一種です。

https://au5g.jp/smartglasses/

このデバイスのログを、アプリ実行中に取得したいというのが、今回のお話です。

# NrealLightアプリ実行中にログを確認する

NrealLightアプリのOSはAndroidなので、ログを確認するにはlogcatが必要です。
ただし、スマートフォンのUSBポートはグラスに接続されており、PCにつなげることはできません。
そこで、PCと無線でつなげてみることにしました。

# 検証環境

– グラスデバイス: NrealLight
– スマートフォンOS: Android 11

# スマートフォンのワイヤレスデバッグを有効にする

開発者向けオプションを有効にした状態で、図のように `ワイヤレスデバッグ` のトグルを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/85bca8c7-8150-144d-9d

元記事を表示

[Android] 警告を0件にするまでの道程

みなさん、警告ってきちんと対応してますか?
この記事では私が色々なプロジェクトで警告を0件にしていった経験を踏まえた警告の修正方針などについてまとめてみました。

# 警告の確認方法
Android Studioでは、Analyze → Inspect CodeからInspectionを実行することができます。
![スクリーンショット 2021-11-15 12.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/cb163960-ac36-56e6-1b07-719143213ba3.png)

Whole projectでInspectionを実行してみると、警告対応をきちんとやれてないプロジェクトでは物凄い数の警告が発生していることでしょう。

# 警告対応方針
「これだけ警告が出てても問題なく動くのなら、対応しなくてもいいのでは?」という意見が聞こえてくるかもしれません。
特に企画やPMあたりには警告対応の重要性を理解してもらえないこともあると思います。
警告を対応していくに

元記事を表示

Cordovaアプリの技術的負債を頑張って解消した話

## はじめに

この記事は[ラクス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/rakus)の14日目の記事です。
なんだかんだで4年連続4回目の参加になりました。感慨深い。

今年は、cordovaを利用したAndroidアプリの技術的負債を解消した話をしようと思います。

## 技術的負債を解消しよう

現在私は主に、以下3つのプロダクトの開発に携わっています。

* Androidアプリ(Kotlin)
* Androidアプリ(Apache Cordova)
* APIサーバー(Spring Boot)

で、まあどのプロダクトもそれなりにフレームワークやライブラリを使用しているのですが、
今まではそれらに脆弱性が見つかるなどがない限り、中々バージョンアップの機会がありませんでした。

今のところはまだなんとかなっていますが、今後重大な脆弱性が発見されてから急いでアップデートしようとしても
色々変わりすぎてて中々対応できない!ということになりかねないので、これを機に各プロダクトをさっぱり最新化して技

元記事を表示

負債を Redash で可視化する

## はじめに

本記事は [with Advent Calendar 2021](https://qiita.com/advent-calendar/2021/with) 14日目の記事です。

こんにちは [with](https://with.is/welcome) でAndroid エンジニアをしている石田です。with の Androidチームでは新規機能開発に加え **負債解消にも積極的に取り組んでおり、常に健康なコードベース維持を心がけています**。

本記事では [Redashというダッシュボードツール](https://redash.io/) を使用してコードベースの負債を可視化した話をします。 ツールの使い方などの詳細な説明は割愛し アイデアの説明にフォーカスします。

## モチベーション

数年以上歴史のあるプロダクトには必ず負債があります。負債の種類は設計、依存ライブラリ、命名、モジュール、言語などなど プロダクトによって様々だと思います。しかしながら 「負債は解消しないといけないんだけど、新しい機能も入れないといけないし…」 という風に **負債があるこ

元記事を表示

[Android] 実行時アノテーションによる処理例

本記事は エムティーアイ [Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mti) の 13 日目の記事です。

## はじめに

独自のアノテーションクラスを作成し、アノテーションに応じた処理を実行する例を紹介します。
あまり実用性はないので、こんなこともできるんだくらいの感覚で読んでいただけると幸いです。

記事中で説明するサンプルアプリはこちら。

https://github.com/pps5/annotation-sample

## 実行時のアノテーション取得方法

アノテーションは Retention が定められています。

– Kotlin: [AnnotationRetention](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.annotation/-annotation-retention/)
– Java: [RetentionPolicy](https://docs.oracle.com/javase/jp/8/docs/ap

元記事を表示

Galaxy Z Fold3が気になったので調べてみた

# はじめに
こんにちは、運動通信社でiOSアプリを担当している松川です。
今回は気になっていたガジェットの `Galaxy Z Fold3` について調べてみました!

# 調べてみた
まず、皆さんGalazy Z Foldって端末についてご存知でしょうか!

https://www.galaxymobile.jp/galaxy-z-fold3-5g/?cid=jp_pd_ppc_google_galaxy-z-fold3_text—1000530-210901_hot-galaxy-z-fold&gclid=CjwKCAiA-9uNBhBTEiwAN3IlNC3E1AoSyQO-X8C-Ba7_mPQ3WjuTW-zWsVzD0KcgXJiIAN7rpI7A2hoCxFgQAvD_BwE

Galaxyから出ているAndroid端末なんですが、なんと折りたたみスマホなんです!
2019年にGalaxy Foldが発売して、現在の最新機種はGalaxy Z Fold3みたいです。
Galaxyのホームページを見るのはいつぶりか分からないくらい久しぶりですが、さっそく閲覧。

ふむ

元記事を表示

Pigeonで安全なFlutter画面-ネイティブ画面のコミュニケーションを実装する

この記事は[Makuake Advent Calendar 2021](https://adventar.org/calendars/6822)の6日目の記事です。

# 概要

Flutter-Native間の通信は受け渡しできるデータ型がStringやprimitive型に限られたり、ネイティブメソッドを呼び出す際にメソッド名を文字列で取り扱う場面があるなど保守性に多少不安を感じてしまうところがある。

Pigeonを使うと、事前に定義したschemeをもとにFlutter/Java/Objective-Cのコードを自動生成しFlutter-ネイティブ間の通信をより安全に実装することができる。

例えば既存アプリにFlutterを部分的に導入したいがどうしてもFlutter-ネイティブのやりとりが発生してしまうケースにおいて、Pigeonを活用することでその障壁を下げられるかもしれない。

今回はFlutter化したログイン画面でのログイン成功時にネイティブ側にコールバックするケースを想定して実装してみる。

“`
[ネイティブ画面] -> [ログイン画面(Flutter)]

元記事を表示

技術選定を疎かにしたツケを払ったお話し

この記事は,フラー株式会社 Advent Calendar 2021 の 12 日目の記事です。

11日目の記事は @shogo82148 さんによる [AWS ClockBound で遊んでみた](https://shogo82148.github.io/blog/2021/12/11/aws-cloud-bound/) でした。

フラーに来てAndroidエンジニアとして活動を始めてから3年、マネージャーになってからも会社でも個人でもちょこちょこ開発に携わっているのですが、今回は個人アプリの開発をするときに技術選定を疎かにして、その結果どんなツケが回ってきたかのお話でもしようと思います。

##技術選定の経緯

もう2年も前のことになりますが、SUZURIさんのAPIを使ってアプリの開発をしていました。
https://qiita.com/seto_inugami/items/952a41e63c403b7e8fb2

そのときにアプリではよく見る`ViewPager + PageIndicator`のレイアウトを組みたくなってPageIndicatorのライブラリを導入するこ

元記事を表示

【Flutter & Android】インタースティシャル広告を実装する方法

# 1. Flutter でインタースティシャル広告を実装する

– [1. Flutter でインタースティシャル広告を実装する](#1-flutter-でインタースティシャル広告を実装する)
– [1.1. 概要](#11-概要)
– [1.2. 詳細](#12-詳細)
– [1.2.1. Flutter の新規プロジェクトを作成](#121-flutter-の新規プロジェクトを作成)
– [1.2.2. AdMob 実装のためのライブラリをインストール](#122-admob-実装のためのライブラリをインストール)
– [1.2.3. AndroidManifest.xml を編集](#123-androidmanifestxml-を編集)
– [1.2.4. SDK のバージョンを修正](#124-sdk-のバージョンを修正)
– [1.2.5. Kotlin のバージョンを修正](#125-kotlin-のバージョンを修正)
– [1.2.6. インタースティシャル広告を実装](#126-イン

元記事を表示

[flutter]freezedでdataクラスを生成する

flutterでapiリクエスト(json形式)する際のdataを、freezedを使用して生成することにしたので、メモ書きとして残します。

今回、freezedで生成する対象は前回のログインアプリのリクエスト/レスポンスに使っていたデータクラスになります。
https://qiita.com/yufuku/items/a7ddcb13ede86df6459a

# 環境
“`shell
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.5.3, on macOS 11.2.3 20D91 darwin-x64, locale ja-JP)
[✓] Android toolchain – develop for Android devices (Android SDK version 31.0.0)
[✓] Xcode – develop for iOS and macOS
[✓] Chrome – develop f

元記事を表示

Jetpack Composeの内部でIndex should be non-negativeが発生する原因の一つ

“`
java.lang.IllegalArgumentException: Index should be non-negative (-1)
at androidx.compose.foundation.lazy.LazyListScrollPosition.update-AhXoVpI(LazyListScrollPosition.kt:98)
at androidx.compose.foundation.lazy.LazyListScrollPosition.updateScrollPositionIfTheFirstItemWasMoved(LazyListScrollPosition.kt:94)
at androidx.compose.foundation.lazy.LazyListState.updateScrollPositionIfTheFirstItemWasMoved$foundation_release(LazyListState.kt:301)
“`

`rememberLazyListState(initialFirstVisi

元記事を表示

Android Javaアプリケーション開発に、NoSQLドキュメント指向モバイルデータベースCouchbase Liteを使ってみる

## はじめに

本稿では、Android Javaアプリケーション開発に、NoSQLドキュメント指向モバイルデータベース Couchbase Liteを使うための具体的な方法について解説します。

本稿では、Couchbase Lite 3.0.0ベータ版をAndroid Javaアプリケーションで利用する際の動作確認までを行います。

Couchbaseをモバイルアプリケーションで利用する意義については、以下の記事をご参考ください。

https://qiita.com/yoshiyuki_kono/items/3abd5e32801060a449d2

### 確認環境

– macOS Catalina Version 10.15.7
– Android Studio 4.1.3

## 実行手順

### プロジェクト作成・Couchbase Liteインストール

Android Studioで新しい「Empty Activity(空のアクティビティ)」プロジェクトを作成します。

「Language」として「Java」を選択します。

また、「Minimum SDK」と

元記事を表示

flutter_riverpodでアプリをMVVMにする

# はじめに
前回のログインアプリをflutter_riverpodを使用して、MVVM風にリファクタしてみました。
前回作成したアプリ(https://qiita.com/yufuku/items/24dac97e6052b2571386)
設計方針については下記を参考にさせていただきました。
https://github.com/wasabeef/flutter-architecture-blueprints

今回のゴールはview(ui)側で実装していた処理をviewModelに移行して、view側ではstateを持たないようにすることです。

最初のフォルダ構成とコードは下記になります。

“`shell
└──lib
   ├── main.dart
   ├── requester
   │   └── requester.dart
   └── ui
   ├── hello.dart
   └── login.dart
“`

“`dart:lib/main.dart
import ‘package:flutter/material.dart’;

元記事を表示

android メモ

# Android メモ

## よく忘れるコマンド

“`
C:\Users\th-yano\AppData\Local\Android\Sdk\emulator\emulator -avd Pixel_5_API_30 -netdelay none -netspeed full -no-snapshot -show-kernel

adb exec-out screencap -p > display.png
“`

“`shell
ps -eo user,pid,ppid,cpu,pcpu,virt,rss,args –sort -pcpu | head -5
ps -aT `ps -ef |grep kot | awk ‘{print $2}’`
“`

## スタックトレース

gdbで見た場合

“`
(gdb) thread apply all bt

Thread 19 (Thread 4398.4422):
#0 0xec9f1b99 in ?? ()
Backtrace stopped:

元記事を表示

ImageView に画像データをいい感じに渡すカッコいいコード

with で Android エンジニアをしている @t2low です。

かなり前の話です。
自分では**カッコいい感じ**のコードが書けたと思ったのですが、その後活用されずに眠っているので供養のつもりで記事にします。
(※ 実際のコードとは異なる部分があります)

## コードを書いたきっかけ

ある画面で API から返された画像データ(URL)があれば読み込んで表示し、なければアプリ内の画像(drawable)を表示するという処理が必要になりました。
愚直に書くと次のようなコードになるかと思います。
(※ `fun ImageView.loadImage(url: URL)` という URL を渡すと画像を読み込む ImageView の拡張関数が生えてると思ってください)

“`kotlin
if (iconUrl != null)
iconImageView.loadImage(iconUrl)
else
iconImageView.setImageResource(R.drawable.something)
“`

この画像データの種類に応じて処理を分

元記事を表示

[Flutter] Android端末で、Bluetoothペアリング済みの端末の情報を取得する方法

# はじめに
Flutterアプリで、Android端末とペアリング済みの端末の情報(端末名、macアドレス)を取得する方法について調べていたのですが、
MethodChannelを利用して、Kotlin側から取得する方法が楽に実装できそうだったので、その際の手順を残そうと思います。

※iOSでの実装は今回触れません。

# 実装
まずはDart側から実装していきます。
MethodChannelを使い任意のタイミングでKotlin側のプログラムを呼び出します。

“`main.dart
Future getPairingDeviceInfo() {
var res = MethodChannel(‘com.sample_project/bluetooth’)
.invokeMethod(‘get_pairing_device_info’, {});
return res;
}
“`

続いてKotlin側で、Dart側から呼び出されるMethodChannelを作成していきます。
Bluetoothペアリング済みの端

元記事を表示

スマホの充電を騙くらかすアプリを作ったらAppleに怒られた話

本記事はクソアプリAdvent Calendar 13日目の記事です。

私は6月からモバイルアプリ開発の道に飛び込んだ新参者です。
普段は個人開発でFlutterでのアプリをひたすら作成しています。

「クソアプリAdvent Calendarとは、なんて素敵な試みだろう、これは参加するしかない!」
そう思い今回初参加させていただきます。

 

本記事では、作成したクソアプリの紹介ののち、
余談としてAppleに怒られた話を致します。
「こんなアプリを作ると、こういうリジェクト理由で割とガチ目に怒られる」
という一つの事例として捉えていただければと思います。

##作成したアプリ##

ちょっと気まずい相手からLINEの連絡先を聞かれ、

「スマホの充電が切れていたらいいのに、、、」

こう思ったことありませんか?

そんな時のために、いつでもどこでも充電切れ画面を表示するアプリを作成しました!

![Android_FeatureGraphic_ja.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c

元記事を表示

GraphQLのPOSTをするときに馬鹿をやらかした話

#はじめに
Heroku Postgreに対して外部から(Herokuアプリ外のサービスから)データを挿入したいという状況の時、
Hasuraはとても役に立ちます。
今回は、そのPOST操作(SQLのINSERT操作)を行おうとしたときに出会った魑魅魍魎を紹介しようと思います。

##Hasuraってなに?
この記事に丸投げします。私はここから学びました。
https://qiita.com/maaz118/items/9e198ea91ad8fc624491

また、HasuraはHerokuに対して強力なサポートをしており、
ワンクリックでHeroku Postgreを利用したGraphQLサーバーを立ち上げてくれます。
https://hasura.io/learn/ja/graphql/hasura/setup/

##今回実装したかった事
AndroidアプリケーションからHeroku Postgreに対してデータの挿入を行いたい
それなら、GraphQLのmutationを利用して挿入しようじゃないか

##おっと
今回発行するGraphQL Queryは以下のような感じだ

元記事を表示

SharedPreferencesがUIスレッドをブロックするってマジ!?

SharedPreferencesって変更差分はメモリ上で保持していて、最初の読み出しはどうしようもないだろうけど、そのあとはapplyとか使っていれば安全だと思っていた時期が俺にもありました。しかしDataStoreの説明で

https://developer.android.com/codelabs/android-preferences-datastore?hl=ja#3

> SharedPreferences には、UI スレッドで呼び出しても安全に見える同期 API がありますが、これは実際にはディスク I/O オペレーションを行います。さらに、apply() は fsync() で UI スレッドをブロックします。fsync() 呼び出しの保留は、サービスの開始と停止、およびアプリケーションの任意の場所でアクティビティが開始または停止するたびにトリガーされます。UI スレッドは、apply() によってスケジュールされた保留中の fsync() 呼び出しによってブロックされます。多くの場合、ANR の発生元になります。

**な、なんだってー**

マジかよ!?`app

元記事を表示

OTHERカテゴリの最新記事