酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

開発-Android

Androidで 背景色に応じた見やすい文字色を求める

ユーザーがタグ色を選択できるプロダクトの場合、ユーザーが決めた色の上にテキストを配置しなければいけない。たとえば、下図の GitHub のタグのような場合である。 背景色に応じて、視認しやすいテキストカラーが利用されていることがわかる。 enhancement…

M1 Macbook ProでAndroid Studioの初期セットアップに失敗する(Android SDKがインストールできない問題)

先週M1 Macbook Pro*1が届いたので、試行錯誤して既存プロジェクトでRosettaを使わずにiOSシミュレータで起動させることができた。その後、1週間が経過したがiOSアプリ開発には特に問題なく使えることがわかった。 今週はM1 Macbook ProをAndroidアプリ開発…

Android エミュレータでCharlesを使いたい (Android 6.0 / Android 7.0 以降の両対応)

アプリからAPIを正しく実行できているのかどうかを検証するため「Charles(チャールズ)」を導入しました。 www.charlesproxy.com Charlesはデスクトップで動くプロキシツールで、リクエストを書き換えてサーバーに送ったり、ステータスコードが400で返ってき…

Androidアプリでバックグラウンド状態で位置情報が取得できるのか調査した

2,3年くらい前にバックグラウンド・サービスで実装されていた位置情報取得処理をフォアグラウンド・サービスに移行(移植)したことがあった。 さくさん自身、位置情報取得の処理は1年に数回書いているような気がするが、いずれもアプリがフォアグラウンドにい…

macOS Big Sur (11.3)にアップデートするとAndroid Studioのエミュレータが起動しなくなった

macOS Big Sur (11.3)にアップデートするとAndroid Studioのエミュレータが起動しなくなった。Android StudioのRunタブには以下のようなメッセージが表示されていた。 04/30 08:46:35: Launching 'app' on No Devices. Error while waiting for device: The …

Androidアプリを実行しているデバイスがAmazonデバイスかどうか判定する

実行しているデバイスがAmazonデバイスであるかどうか判定します。 Amazonデバイスかどうか判定する Amazonデバイスであるかどうかはデバイス名を確認する、または amazon.hardware.fire_tv 機能を持っているかどうかで判断することができます。 object Devi…

AndroidアプリでRSA暗号の公開鍵と秘密鍵を作成する

Androidアプリ内でRSA暗号の公開鍵と秘密鍵を作成して、公開鍵を使って生テキストを暗号化、秘密鍵を使って暗号テキストを復号化する方法を紹介する。 RSA暗号の公開鍵と秘密鍵を作成する RSAで鍵ペアを作成する。 package jp.ch3cooh.common.utility import…

Andriodで 動画ファイルを保存するとギャラリーには表示されるがサムネイルが表示されない/再生できない

FFmpeg for Andriodで書き出した動画ファイルを保存したあと、ギャラリーアプリで確認すると動画のサムネイルが表示されていない不具合があり、再生もできない。静止画を保存した場合は、特に問題なくサムネイルが表示されていた。 下記のデバイスにて検証し…

FFmpeg for Androidを使っている場合、target sdkを29にすると処理に失敗するようになる

Projectレベルの build.gradle のtarget sdkを 29 にすると、Android Q(10)上でFFmpeg for Androidでの処理に失敗することがわかった。 Target SDKが29だとPermission deniedが発生する 生成したコンテンツをギャラリーに保存するためにコードを書いていてAn…

Androidで テキストを縦方向の中央揃えで描画できない

縦方向の中央揃えでテキストを描画できない 期待する動作。 現実。尻尾(descent)の分だけ下方向にズレてします。 問題点 paint.getTextBoundsで、文字の高さは取得できる… 取得した高さを使って、描画領域を求めることはできる。 しかし、drawTextで描画する…

AndroidアプリがTransactionTooLargeExceptionでクラッシュする

Androidアプリで画像ビューア画面を表示するとTransactionTooLargeExceptionが発生してクラッシュする問題に頭を悩ませていた。 発生している状況について MainActivity (ホームFragment) → DetailActivity (詳細Fragment → リストFragment ) → ImageActivit…

Androidで 静止画と動画のピッカーで選択したコンテンツのファイルパスを取得する

Androidで 静止画と動画のピッカーを表示して、単一のコンテンツを選択する方法です。 静止画と動画のピッカーを表示する 選択したコンテンツのURIを取得する 「ファイルパスを取得する権限」を取得する URIからファイルパスを取得する 参考記事 動画確認環…

Androidで 動画編集できるライブラリを探す (2020年5月調査)

iOSアプリで動画編集したい場合には「SwiftでAVFoundationを使って元ある動画から異なる動画を生成する (動画編集の基本編) - 酢ろぐ!」で取り上げたように、標準API(AVFoundation) を使うことで動画編集処理を実装できます。 一方、Androidではこれといっ…

KotlinでBitmapオブジェクトを保存して、ShareCompatで他のアプリへ画像を共有する

過去にAndroidアプリで画像をシェアする実装をしていたけど、ここ最近ご無沙汰で昔のコードを探してみても file://〜を使っていたり、android.support.v4.content.FileProvider を使っていたり と、セキュリティ上の問題やAndroidX対応などで、そのまま使え…

テザリング中のMacを使っているとAndroidエミュレータでネットワーク通信ができなくなる

なにがきっかけかわからないが、突然Androidエミュレータでネットワーク通信ができなくなってしまった。 E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE W/MessengerIpcClient: Timing out request: 1 E/Fabric: Settings request fa…

Androidアプリでアイコンバッジを表示させる

既存のAndroidアプリにアイコンバッジをつけることになりました。いままでAndroidアプリでアイコンバッジ数を厳密に管理して表示させたことがなかったので、いざ実装してみると考えていた以上に大変でした。 Playストアアプリに更新待ちが1件存在しているこ…

SwiftからKotlinへの置き換え

去年はSwiftを書いていて、久しぶりにKotlinに触ったら、Kotlin*1の書き方を忘れていたので、パッと思い出せるようにSwiftからKotlinへの移植時に使える置き換えチートシートを備忘録として残しておきます。 思い出したら追加していく。 範囲 for 文 0から3…

AndroidアプリにOneSignal SDKを導入する

最近「OneSignal」を使ったアプリを開発しています。 OneSignalというのは、iOS/AndroidやさらにWebブラウザといったクロスプラットフォームに対応したプッシュ通知の送信サービスです。ネイティブアプリだけではなくXamarinなどにもSDKを提供しているそうで…

Google Play Consoleでapkファイルをアップロードしたらエラーが発生した

Google Play用のアカウントが2つあって(仮にアカウントAとアカウントBとする)、いつもはアカウントBの方でAndroidアプリを公開していました。諸事情があってアカウントAの方に統合したいということになり、現在開発中のアプリをアカウントAで公開することに…

AndroidでButtonに勝手に影が入ってしまう

SDKレベルを25から27に上げた影響か今まで気付いていなかっただけか、AndroidアプリのButtonに影(shadow)が入ってしまうようになりました。今まで問題なかったのにどうして……

Android Studio 3.0にしてからエミュレータでのアプリ実行ができなくなった[解決済み]

Android Studio 3.0にしてからエミュレータでのアプリ実行ができなる自体に陥りました。過去の設定ファイル等が悪影響を及ぼしているのではないかと疑って試行錯誤していました。 本件は既に解決しております。 結論から書くと、プロジェクトの設定の「Deplo…

AndroidでSensorManagerを使って磁気センサー(コンパス)の方位を取得する

コンパスのように磁気センサーを使って磁北を指したい。 SensorManagerを使って磁気センサー(コンパス)の方位を取得する LocationServiceはユーザーの利用許諾が必要だったけれど、磁気センサーは特にユーザーに許可を得なくても利用できるようです。 sensor…

AndroidでLocationManagerを使って位置情報を取得する

AndroidでLocationManagerを使って位置情報を取得する方法を紹介します。現在、minSdkVersionが19で開発しています。 事前情報 API 19ではFragment#requestPermissionsとFragment#onRequestPermissionsResultが使えない*1ので、一旦パーミッションの許可をFr…

Realm Javaを使って複数の条件でソート(並べ替え)する

本記事ではRealm Javaを使って複数条件でソートする方法を紹介します。 Realm Swiftでの複数条件のソートしたい場合、「Realm Swiftを使って複数の条件でソート(並べ替え)する - 酢ろぐ!」の記事をご覧ください。 並び替えをする String[] names = { "onlin…

Realm JavaでnullableなInt配列のjsonファイルを読み込む

メモ。あとで書き足す(予定)。 問題 Realm Javaではjsonファイルを読み込んでそのままRealmのオブジェクトをすることができます。しかし、intやstringといったプリミティブ型配列の場合にはそのままダイレクトにRealmに格納することができません。 JSON API…

AndroidでObjectAnimatorを使ってViewをアニメーションさせる

久しぶりにAndroidアプリでアニメーションしています。 説明はあとで書きます。 アニメーションさせる imageViewのアルファ値を1秒(1,000ミリ秒)かけて0(透明)するアニメーションです。 ObjectAnimator.ofFloat(imageView, "alpha", 0).setDuration(1000).st…

AndroidアプリをJava 8に対応した

あとで書き足すかもしれない。メモ代わり。 projectの方のbuild.gradle buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath 'me.tatarka:gradle-retrolambda:2.5.0' } } appの方のbuild.…

Androidで公式YouTubeアプリを起動させる

AndroidアプリからYouTubeアプリを起動さてみましょう。自分のアプリからアオリちゃんの「トキメキ☆ボムラッシュ」のソロPVを起動させます。ブラウザで見る場合は下記のURLから見られます。 www.youtube.com この動画の場合、URLのhttps://www.youtube.com/w…

Androidアプリのビルドで「Unsupported major.minor version 52.0」のビルドエラーが発生する

弊社ではJenkinsを使ってアプリのCIをおこなっています。ここ2ヶ月間は、少し毛色の違うプロジェクトをやっていたこともあって、ビルドサーバーのジョブは増えていませんでした。……というか Androidアプリのビルド時に謎のエラーが発生した! 久しぶりにAndr…

Androidデバイスに入っている楽曲データを取得する

Androidデバイスに入っている楽曲データ一覧からアーティスト情報やタイトル情報を取得します。 private static final String[] projection = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE, MediaStore.Audio.…