酢ろぐ!

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

開発-Android

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対応などで、そのまま使え…

突然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.…

Androidでセルの並び替えをおこなえるライブラリ「ListViewAnimations」を導入する

iOSのUITableViewのスワイプやセルの並び替えみたいな挙動をAndroidで実現するための「ListViewAnimations」というライブラリがあります。 下記のリポジトリに、ListViewAnimationsのDynamicListViewを実装したものを公開しておきました。GitHubの実装がその…

AndroidでNumberPickerの表示項目数を変更する前にはsetDisplayedValues(null)で初期化する

ここ最近Androidアプリネタが続いていますが、この土日悩んだアプリがクラッシュしてしまう件についてメモしておきます。 やりたいこと 日付ごとに異なった時刻を設定できるNumberPickerがありました。イメージがわきにくいと思うので、別の例で……都道府県が…

Realm Javaのv0.80.3からv0.90.0にアップデートしたらビルドが通らなくなった

久しぶりにRealm Javaを使ったアプリをアップデートすることになり色々と手を入れている最中なのですが、使用しているライブラリのひとつの「Realm Java」も古いバージョンのものを使っていたのでこの機会にアップデートさせようとしました。 この記事ではv0…

Android StudioでKotlinを使ってボタンをタップするたびにカウントが増えていくコードを書く

前回作成したスケルトンプロジェクトを少しだけ弄って、よくあるボタンを押す度にカウントが上がっていくようにしましょう。 content_main.xmlより変更点を抜粋。 layout.xmlにボタンを配置します。ベースがreLayoutなのでViewが被ってしまうのでInearLayout…

Android StudioでKotlinのプロジェクトを作成する

kotlinのスケルトンプロジェクトを作るのは、一旦Javaのプロジェクトを作ってからKotlinのコードにコンバートするのが楽なようです。 Android Studioを起動して、[Start a new Android Studio project]を選択します。 アプリケーション名は適当に「Kotlintes…

Android StudioにKotlinプラグインをインストールする

Kotlinのバージョンがv1.0になったみたいですね。 日本語で書かれた記事はこちらが詳しいです。 そういえば、AndroidでSwiftが使える「RemObjects Silver」がありましたが、アンテナが低いのかあまり話を聞きませんね。 最近、仕事でScalaを使っているのでAn…

Macのhostsの設定をGenymotionへ転送して同期させる

Androidの場合、Genymotionを使って開発をしています。本記事では、MacのhostsをGenymotionでも使う方法を紹介します。 data.example.comに接続するIPアドレスを手動で変えたいときがあります。 例えば、サーバーを開発用と本番用で分けていて、それぞれのサ…