- 1. AndroidのMediaExtractorで映像・音声のソース確認
- 2. Android Enterpriseを支えるAndroid OSのソースコード解説
- 3. Google mapをJetpack Composeで扱うための環境構築
- 4. AndroidでVolleyを使った送信でcookieを使用する場合
- 5. Cloudflare Tunnelを使ってAndroidに立てたWebサイトを外部公開できるか検証してみた
- 6. 複数のRecyclerView間での移動を含むドラッグドロップ並べ替え機能を実装する
- 7. Composable FunctionからUIと状態を返す WIP
- 8. [Comopse]Coilを使ってString -> Bitmap -> Drawableに型変換する方法
- 9. JetpackComposeを利用して状態に寄らないアニメーションを実装する
- 10. アプリの再表示時に生体認証を求める(Android10以下対応)
- 11. 生体認証か画面ロックどちらかを必須にする時の条件設定
- 12. 【Android】CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`というエラーが発生した時の対処法
- 13. AndroidでNavigationを使ったDeep Linkの実装Part2
- 14. 【断念】Androidの標準機能で音声認識(Oculus)を試す
- 15. Github ActionsでFirebase Test Labを使ってAndroidアプリの自動テストを行う環境の構築
- 16. React Native で OS判定 を実装する方法
- 17. React Native | fastlane コマンド実行時に README.md が自動生成されないようにしたい
- 18. 【Android】Jetpack Compose でThemeを設定する【Kotlin】
- 19. 【Android】複雑怪奇なNFCを、ちょうぜつやさしく読み書きする【Jetpack Compose】
- 20. buildSrcにKoltinで処理を書きGradle Tasksとして実行する
AndroidのMediaExtractorで映像・音声のソース確認
# はじめに
株式会社THIRD IT開発部でモバイル開発チームでアプリ(Android及びiOS)の開発を行なっているエンジニアです。
弊社では不動産の点検や作業報告などをスマートフォンで行うためのアプリとして,管理ロイド等のアプリを開発及びリリースしています。管理ロイドではマンション等の各種点検業務でビデオデータを添付する事があります。
添付したビデオデータがごく稀に壊れている場合があるため`MediaExtractor`を使用しメディアデーター内のソースを確認する事としました。# ビデオ撮影について
ビデオ撮影については[ACTION_VIDEO_CAPTURE](https://developer.android.com/reference/android/provider/MediaStore#ACTION_VIDEO_CAPTURE)を使用してカメラアプリに撮影してもらっています。> カメラアプリ呼び出し例
“`kotlin
val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
startActivity
Android Enterpriseを支えるAndroid OSのソースコード解説
今年のAndroid Enterpriseアドベントカレンダーの締めくくりとして、この過疎っているアドベントカレンダーで紹介してきた機能の裏側(おもにAndroidフレームワークのソースコード)の解説を軽くしてみようと思います!
## まえおき
Android Enterpriseにはいくつかの動作モードがあります。
https://support.google.com/work/android/topic/9563482?hl=ja&ref_topic=9621435
1つのデバイスを仕事専用デバイスとしてMDM管理下に置くFully Managed deviceだけではなく、個人端末の業務利用(いわゆるBYOD)や業務端末の個人利用(BYODの逆)ができるWork Profileと呼ばれるモードがあるのが特徴的です。
1つのデバイスを複数のプロファイルで利用する、それをAndroid OS / Google Playサービスはどのように利用しているのでしょうか?
## Android OSはそもそも複数ユーザで利用ができる
Androidは、もう8年前くらいのバージョ
Google mapをJetpack Composeで扱うための環境構築
公式ドキュメントのインストール手順通りに進めてもうまく行かない箇所があったのでここに調査結果をまとめる。
なお、すでにGoogle mapのAPIキーは取得しているものとする。# プロジェクトを作成する
AndroidStudioのNew ProjectからEmpty Compose Activityを選択し、プロジェクトを作成する。# Google mapをAndroidで扱えるように設定する
Google maps platformの[Set up an Android Studio project](https://developers.google.com/maps/documentation/android-sdk/config)を参考に、以下の設定をしていく。### moduleレベルのbuild.gradleに依存関係を追加
“`gradle
dependencies {
implementation ‘com.google.android.gms:play-services-maps:18.1.0’
// …
}
“`
バージョンは
AndroidでVolleyを使った送信でcookieを使用する場合
# VolleyでCookieって・・・どうすんねん?
[AndroidでVolleyを使ってMultipart/form-data形式で送信してみる](https://qiita.com/cozyk100/items/927da723204f5c54a35b)でAndroidでVolleyを使ってHTTPでMultipart/form-data形式で送信する例を書きましたが、送信する相手がAPI形式で同時に認証もやってくれるならいいのですが、そうではない場合があります。例えば、API形式のI/Fが全く用意されていないく、ブラウザからHTMLで送信する画面しか用意されていない場合があります。この場合、通常
1. ログイン
1. Multipart/form-data形式で送信
1. ログアウトという流れになりますが1.でサーバ側からのレスポンスヘダーのset-cookieで払い出されたcookieをHTTPヘダーに設定して2.で送信しないと「ログインされていません」となります。
Volleyを使って1.、2.、3.で3回通信する場合、1.のレスポンスのset-cookieを2
Cloudflare Tunnelを使ってAndroidに立てたWebサイトを外部公開できるか検証してみた
## はじめに
[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)はローカルに立てたサーバーを外部からアクセスできるようにするトンネリングサービスです。同じようなサービスに[ngrok](https://ngrok.com/)などがあります。今回はAndroidのTermuxに立てた.NETサーバーをCloudflare Tunnelを使って外部に公開できるか検証してみます。
## Cloudflare Tunnelがどのように動作するか
Cloudflare Tunnelは、[cloudflared](https://github.com/cloudflare/cloudflared)をインストールすることで動作します。cloudflaredは、近くのCloudflareデータセンターに対して長期間の接続を作ります。Cloudflareがドメインへのリクエストを受信すると、接続しているデータセンターにリクエストを中継します。中継されたリクエ
複数のRecyclerView間での移動を含むドラッグドロップ並べ替え機能を実装する
一つのRecyclerViewの中でdrag&dropでの並べ替え機能は、ItemTouchHelperを利用すると簡単に実装することができます。
https://qiita.com/ryo_mm2d/items/973b056b52b111bb58d4
ただ、一つのRecyclerViewの中の並べ替えではなく、複数のRecyclerView間での項目移動もしたくなります。候補リストから取捨選択もできるような機能で見られる以下のような動きですね。
実装方法としてはいくつかあると思いますが、AndroidのDrag&Dropフレームワークを利用する方法で説明しようと思います。ドラッグ中の描画や、対象となるViewの判定処理などを実装する手間がいらないというメリットがありますが、本来想定されている使い方は、View間のD
Composable FunctionからUIと状態を返す WIP
どうも、こんにちはあみゅーです。
もうここ数年はずっとReactばかり書いています。# はじめに
みなさん、大体Composable Functionを実装するときは新しいUI Componentを作成する目的で書いているのではないでしょうか。
しかし、 `remember` や `LaunchedEffect` などがComposable Functionとして提供されていることから分かる通り、特にUIに限って実装するものではありません。今回はUIと状態を返すComposable Functionの実装と、適当なSampleを紹介していきます。
# UIと状態を返すComposable Function
“`kotlin
@Composable
fun Content() {
val (UI, 状態) = ComposableFunction()UI()
}
“`## ポイント入力UIの例
[Comopse]Coilを使ってString -> Bitmap -> Drawableに型変換する方法## こんな時
– StringをどうしてもBitmapの形に変換したい時
– BitmapをどうしてもDrawableの形に変換したい時
– StringをどうしてもDrawableの形に変換したい時## 前提
– Composable関数の中で書く
– coilを使うのでgradleに以下追加
“`
implementation(“io.coil-kt:coil-compose:2.1.0”)
“`## コード
コルーチンの中で変換します。
以下は String -> Bitmap -> Drawableの順に変換してます。“`
val myString = “画像URLとか”
val context = LocalContext.currentval coroutineScope = rememberCoroutineScope()
coroutineScope.launch{
val loader = ImageLoader(context)
val request = ImageRequest.Builder(context)
.data(myS
JetpackComposeを利用して状態に寄らないアニメーションを実装する
こんにちは!
Life is Tech! 名古屋土曜日スクールでクラスマネージャーをしているカーキです。
本日、アドベントカレンダーの9日目を担当します。
普段はAndroidエンジニアとして、働いているのでAndroidに関するネタを投稿します。## 概要
2年前にも[Androidでポヨンするアニメーション](https://qiita.com/Takarkiz/items/5af59902b042171d21dd)を実装する紹介をしたのですが、今回はその2022年版として、JetpackComposeだとどう実装をするのかを想定して紹介していきます。
具体的には、以下のプリン画像をタップして、ポヨヨンとアニメーションする動きを実装していきます。
![purin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82263/00665b37-45c1-6e47-e472-6915eb886098.png)## ゴール
今回のゴールとしては、2年前に投稿した[Androidでポヨンするアニメ
アプリの再表示時に生体認証を求める(Android10以下対応)
## はじめに
生体認証、便利に使っていますか?
Androidでは、セキュリティをより強固にしたいプロダクトでは、認証や操作の許可をするために生体認証を使うことが推奨されています。今回はログインセッションの有効期限等によらず、アプリがタスク復帰した際に都度生体認証を求める動きを実装しました。
※生体認証そのものの処理は割愛しています。
## アプリ全体の構成について
私のアプリは1Activityで、その上にFragmentがスタックする形式です。
また、画面遷移にはNavigationComponentを使用しています。## 仕様
– 複数画面があり、それぞれ画面遷移することができる。
– 先頭の画面はログイン画面で、認証が通ったあとはログイン画面に戻れない。戻るボタンやスワイプバックすると、ログイン画面には戻らずアプリが終了する(タスクにしまわれる)。
– 他アプリの割込時やタスクからの復帰時など、メモリ上にアプリが存在していたら(キルされていなければ)生体認証を求めて、認証OKだったら前に閲覧した画面が表示される
– ただしログイン画面だけは、タスク復帰したと
生体認証か画面ロックどちらかを必須にする時の条件設定
## はじめに
Androidアプリでは、よりセキュアにするために生体認証を使うケースが存在します。
現在、AndroidXライブラリを用いた生体認証のダイアログは、ユースケースに応じて2種類設定できます。
– 生体認証ができない場合に、「PIN/password/パターン」といった画面ロック設定で代替可能とするダイアログ
– 生体認証を行うか、キャンセルのいずれかを行うダイアログ(画面ロックは代替手段として使えない)今回は、生体認証・画面ロックのいずれかで認証を可能とする際の書き方についてです。
## 生体認証と画面ロックいずれかを必須とする設定
まず、Android10以下と11以上で以下のように設定を分ける必要があります。
“`kotlin
val biometricPrompt = BiometricPrompt(this, executor, authCallBack)val promptInfo =
//OS11以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
B
【Android】CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`というエラーが発生した時の対処法
# エラーが発生した箇所
`hiltViewModel()`を使ってViewModelにDIを行おうとしました。“`kotlin
@Composable
fun SplashRoute(
viewModel: SplashViewModel = hiltViewModel(),
…
) {
val uiState by viewModel.uiState.collectAsState()
…
“`# エラーの内容
Gradle FileをSyncした際にはエラーは発生しなかったのですが、エミュレーターを使ってアプリを起動しようとすると、次のエラーを発生した後アプリがクラッシュしてしまいました。
“`shell
FATAL EXCEPTION: main
Process: com.takagimeow.xxx, PID: 30XXX
java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTR
AndroidでNavigationを使ったDeep Linkの実装Part2
# 初めに
今回は届いた通知からDeep Linkを取り出す方法を紹介していきます
### 本文
`FirebaseMessagingService`を継承したクラス内部で下記のように実装することでFcmから受け取った通知に入っている`DeepLink`を取得することができます。
ついでに、通知のタイトルやメッセージの取得方法も載せておきます
“`kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) {
val deepLink = Deeplink.from(remoteMessage = remoteMessage)
val title = remoteMessage.notification?.title ?: return
val body = remoteMessage.notification?.body ?: return
}
“`
### 最後に
今回は、届いた通知に入っているDeepLinkの取得方法を紹介しました
次回の記事は
【断念】Androidの標準機能で音声認識(Oculus)を試す
少し気になっていた以下の記事を元に、Android自体の機能で
Oculusの音声認識ができるかを試します。http://fantom1x.blog130.fc2.com/blog-entry-273.html
ダウンロードはこちらから。
https://booth.pm/ja/items/1556439
毎回思うのですが、先達は本当にすごいなと(感謝
早速、Oculus用にカスタマイズを行ってみます。## サンプルのチェックを実施
ボタンがUnityのボタンでしたので、Oculusインテグレーションを導入して試したのですが
上手くボタンが押せず断念。構成を確認したうえで、いったんMRTK3を入れて
動作をチェックすることにしました。
→やはり移動などの画面処理ができない状態に…## コード解読に時間を要するようです…
マニフェストの問題が挙げられるようで、ますはその書き換えが必要とのことです。
http://fantom1x.blog130.fc2.com/blog-entry-284.html#fantomPlugin_SpeechReconize
Github ActionsでFirebase Test Labを使ってAndroidアプリの自動テストを行う環境の構築
Androidアプリの開発において [Github Actionsにて自動的にビルドする環境作成](https://qiita.com/taptappun/items/92ec63b7e89e53b68efa) について紹介しました。
またビルドが完了した後に[Firebase App Distribution](https://firebase.google.com/docs/app-distribution)にアプリを配布する方法については[Github Actionsで自動的にAndroidアプリをビルドした後にFirebase App Distributionに配布する](https://qiita.com/taptappun/items/50555bbe66e4135ece15)にて紹介しています。
今回は[Firebase Test Lab](https://firebase.google.com/products/test-lab) を使用して、開発したAndroidアプリのテストを自動的に行う環境(CI環境)の構築について紹介していきます。
実際に自動テストを行なってい
React Native で OS判定 を実装する方法
## やりたいこと
React Native で OS判定 を行い
iOS と Android で処理を出し分けたい## 使用技術
– react : 18.1.0
– react-native : 0.70.2
– @types/react-native : 0.70.0
– typescript : 4.8.3## 実現方法
[React Native Platform](https://reactnative.dev/docs/platform) を使用すれば
iOS と Android で処理を分けることは実現可能以下に、実際のサンプルコードを記載しておきます。
### iOS判定をしたい場合
`Platform.OS === ‘ios’` で判定を行う
“`tsx
import { Platform } from ‘react-native’;
const isIOS = Platform.OS === ‘ios’
console.log(isIOS)
// expected output : iOSの場合`true`になる。Androidの
React Native | fastlane コマンド実行時に README.md が自動生成されないようにしたい
## やりたいこと
ローカルPCから `fastlane` コマンドを実行したときに
fastlaneディレクトリ配下に `README.md` が自動生成されないようにしたい## なぜ、この作業をやりたいと考えたのか?
fastlaneディレクトリ配下の `README.md` を独自で編集していたので、fastlaneコマンドを実行するたびに `README.md` に Gitの差分が出るのが面倒だったから
## なぜ、毎回 README.md が作成されるのか?
デフォルトの設定では`fastlane`コマンドを実行時に
`fastlane/README.md`が自動で作成される仕様だから## 実現方法
`fastlaneディレクトリ` の Fastfile に `before_each` block を追加する
Android も iOS も追加する処理は同様の処理で問題ない。
### Android の場合
“`ruby
# android / fastlane / Fastfiledefault_platform(:android)
【Android】Jetpack Compose でThemeを設定する【Kotlin】
# はじめに
今回はJetpackCompose について勉強する機会があったので、使わないで忘れてしまう前に記事にしておこうと思います# Themeの要素
Themeではcolors、typography、shapesをそれぞれ設定できます
colorsは テーマに使う色
typographyは 文字のフォント・太さ・サイズなど(スタイル)
shapesは 形(角を切り落としたりできる)それぞれ設定できる
# 使用例
>Codelab より引用
“`
@Composable
fun MaterialTheme(
colors: Colors,
typography: Typography,
shapes: Shapes,
content: @Composable () -> Unit
) {
“`
こうしてテーマを作成しておくことで
“`
@Composable
fun MyTheme(content: @Composable () -> Unit) {
MaterialTheme(content = content)
}
“`
【Android】複雑怪奇なNFCを、ちょうぜつやさしく読み書きする【Jetpack Compose】
# この記事を書こうと思ったきっかけ
最初、NFCタグにデータを書き込んだり読み取ったりしてみたいと思った時、何から手をつけて良いのかわかりませんでした。
公式ドキュメントを読んでも、NDEFやらタグ・ディスパッチシステムやらと用語が全く理解できず、「もう無理〜」という感想しか抱くことができませんでした。そして、色々記事を探したり、サンプルコードを読み込んでも、ほとんどがActivityやFragmentを基準としたコードになっていて、Jetpack Composeで実装する場合はどのようにしたらよいのかを参考にできるソースを見つけることができませんでした。
そこで今回は、NFCタグに関する処理をJetpack Composeを通して行なってみたいけど、NFCもよくわからないし、JetpackComposeでやるとなると尚更よくわからないという方向けに、超絶やさしくわかりやすく、記事としてまとめておこうと思いたち、筆を取りました。
※NFCに関する規格などの詳細については解説を省きますのでご了承ください。あくまでJetpack ComposeでNFCタグにデータを読み書きする
buildSrcにKoltinで処理を書きGradle Tasksとして実行する
この記事は[Android Advent Calendar 2022](https://qiita.com/advent-calendar/2022/android)のカレンダー2の12月25日の記事となります。
私はAndroidアプリのビルド処理の際にassetsファイルなどをapiから自動で取得したりといった処理をbuild.gradle(.kts)にtasksとして直接書いていました。
ただこの方法だと普段KotlinやJavaでやっているようなpackageやファイルの分割などが難しくてコードの整理ができず、ぐちゃぐちゃな状態になっていました。
これを普段KotlinやJavaで書いているようにできると便利だなと思い調べてみました。いろいろ応用が効きそうで便利なため使ってみてください。
# 前準備(任意)
* `settings.gradle`, `projectroot/build.gradle`, `app/build.gradle`をそれぞれkts化(kts化することを何と呼べばいいかわからない)しておく
* 必須ではないですが本記事ではkts化前提