Android関連のことを調べてみた2023年02月18日

Android関連のことを調べてみた2023年02月18日
目次

【未解決】MAUIで作ったAndroidアプリでローカルなSQLServerとやりとりしたいけど諦めた。

# 経緯

社内に立てたMicrosoft SQLServer をAndroid端末で利用したかった。でもできなそうだった。
Windowsタブレットなら簡単だろうけど、高価なのでできれば安いAndroidで考えたかった。
こういった使い方は邪道なので、仕方ないのかもしれない。あきらめることにした。

# 環境
Windows10 pro 22H2
visual studio 2022 Community (MAUI)
SQLServer 2022 Express
Unity 2021.3.5f1

# 検討、検証したこと

まず筆頭候補Xamarin。
これはできる。が、来年2024年にサービスが終わるらしいので避けた。
Androidstudio。
試してないが、知り合い曰くできないらしい。
Unity。
試したがうまくいかなかった。AsetStoreにて「SQL for Unity Database」なるものが見受けられたのでやはり普通にはできないのだろう。
$100と高価だし、マイナーなアセットで使い方も理解でき

元記事を表示

Androidアプリ開発入門

# 概要
Androidアプリ開発の始め方について解説。
開発環境の構築から、サンプルアプリのインストールまでの手順を説明する。

# Android Studio のインストール

[こちらのサイト](https://developer.android.com/studio)にアクセス。

https://developer.android.com/studio

`Download Android Studio XXX`をクリックしてダウンロード。
[![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/c9476ac4-07dc-e9f1-4871-a09e1624c7e9.png)](https://developer.android.com/studio)
後は指示に従ってインストール。
詳しくは[こちらの公式サイト](https://developer.android.com/studio/install?hl=ja)に書かれている。

https://develop

元記事を表示

Rubyを使おうとした時のエラー対応

# 初めに
今回は自分がRubyをAndroid Studioで使おうとした時に起こったエラーへの対応を紹介していこうと思います
### 本文
今回は`.bash_profile`がないと言われた時の対応を紹介していきます
まず、必要なフォルダ直下で下記のコマンドを打ちます
“`terminal: bash_profileの作成
vi .bash_profile
“`
そうすると、`.bash_profile`というファイルが作成されるので`I`キーを押して入力モードにし、下記を入力します
“`terminal: bash_profileの中身の設定
eval “$(rbenv init -)”
“`
入力が終わったらエスケープキーを押し入力モードを終了した後に`:wq`を入力して保存して終了します
最後に下記のコマンドを打ち込めば終了です
“`terminal: bash_profileを参照するように設定
source ~/.bash_profile
“`
### 最後に
今回は、自分が詰まってしまっていた部分を備忘録程度に紹介していきました
どなたかのお役に立てれば幸

元記事を表示

API 31までとAPI 32からは、onStartとonActivityResultの実行順序が逆になっている件

Android 12(API 31)までは、`onActivityResult` → `onStart` の順序でしたが
Android 12L(API 32)からは、`onStart` → `onActivityResult` の順序に変わっています

**※`ActivityResultContract`を使っていても影響を受けます。`ActivityResultContract`のコールバックは`ComponentActivity`の`onActivityResult`の中でコールされるためです。**

その順序が変わっても問題が起こるようなことはなかろうなどと思っていたら、問題にぶち当たりました(単に使い方が悪かっただけではありますが)

以下のように、`onActivityResult`(実際には`ActivityResultContract`のコールバック)で、LiveDataの値を2回更新するようなことをしていました。

“`kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, d

元記事を表示

[Android] [Kotlin] TextViewから文字がはみ出しても大丈夫!TextViewの自動スクロール方法

### できたこと
TextViewから文字がはみ出して、2行になったり文字が切れたりすることあると思います。
そんな時にTextViewが自動でスクロールして、はみ出しても全文字表示させる方法です。
XMLのTextViewに
android:singleLine=”true”
android:ellipsize=”marquee”
android:marqueeRepeatLimit=”marquee_forever”
を加え、ソースコードで
isSelected = true
にすると自動スクロールしてくれます。
全TextViewで「isSelected = true」をするのはコードも多くなると思うので、
TextViewが含まれているLayoutで「isSelected = true」しても良いかと思います。
ただその時の注意点の例として、
Buttonで実装した時、「state_selected=”true” or “false”」などで
Buttonの背景色を変えようとしていた場合、isSelectedがずっとtrue状態になってしまうので、気を

元記事を表示

THETA Xのファイルアクセス(SDカード/内蔵メモリ参照、撮影ファイル削除、マニフェスト)

## はじめに

リコーの @KA-2 です。

弊社では[RICOH THETA](https://theta360.com/ja/)という全周囲360度撮れるカメラを出しています。
RICOH THETA V, RICOH THETA Z1, RICOH THETA Xは、OSにAndroidを採用しています。Androidアプリを作る感覚でTHETAをカスタマイズすることもでき、そのカスタマイズ機能を「プラグイン」と呼んでいます(詳細は本記事の末尾を参照)。

今回は、RICOH THETA Xでプラグインを作成する際に注意が必要な、以下3つのポイントについて説明します。
– THETA XのSDカード/内蔵メモリ参照方法
– THETA XはプラグインからのWebAPI : [camera.delete](https://github.com/ricohapi/theta-api-specs/blob/main/theta-web-api-v2.1/commands/camera.delete.md)に対応してないため、そ

元記事を表示

libs.versions.tomlのgroupとname

GradleのVersion Catalogを使うと、依存関係の追加方法が少し変わる。

“`kotlin
dependencies {
compileOnly(libs.android.gradlePlugin)
compileOnly(libs.kotlin.gradlePlugin)
compileOnly(libs.ksp.gradlePlugin)
}
“`

これは、**nowinandroid**の`build-logic:convention`モジュールの**build.gradle.kts**の一部の内容。

この`libs.android.gradlePlugin`や、`libs.ksp.gradlePlugin`の内容はどこで定義されているのかというと、**libs.versions.toml**にて定義されている。

“`toml
[versions]
androidGradlePlugin = “7.4.1”
kotlin = “1.8.0”
ksp = “1.8.0-1.0.9”

[libraries]
# Dependenc

元記事を表示

[Android] Vulkanで描画しているアプリをスリープから復帰させる手順

# 概要
Vulkanで書いたアプリケーションをAndroidで動かした際に、ホームボタンを押してアプリをスリープさせた後再度スタートしようとすると、画面が描画されなかった。
原因を調べるとVulkanのコンポーネントの内、いくつかは再度作成し直す必要があった。

# 環境
* Android 13
* NDK : 25.0

# 原因
Androidではアプリをリスタートするたびにwindowが変わっているようで、andoid_app->ANativeWindowの指すアドレスが毎回変化している。
なので、windowに依存するコンポーネントは毎回再作成する必要がある。

# 対策
windowに依存するコンポーネントは、アプリにもよるが基本的には以下が含まれると思っている。(赤色で表している部分)
![2023vulkan.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446998/8e68af15-a815-00a4-b4af-94bb0d9a1c0e.png)
surfaceがw

元記事を表示

[Android] [Kotlin] TabLayoutと(Horizontal)RecyclerViewを仲良く共存させる方法

![06b26b96-6dd5-4cbd-af52-9db9c5550397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/e3383f52-5f4d-1124-2144-ddde9d688937.png)

### 実現したこと
TabLayoutでの画面切り替えとHorizontalなRecyclerViewでのリストスクロールの両方を実装したいけど、
スクロールしようとすると画面が切り替わったりして、うまくスクロールできない!仲良くして!!
ってなったので、それを解決するべく方法を見つけましたので、共有します。

レイアウトも見たい方は、
https://qiita.com/shinmai333/items/8bdd5a72c0f86348bd02
こちらから見れます。
全く一緒のレイアウトで、Fragmentの中身にHorizontalなRecyclerViewを乗っけただけです。
ソースコードやレイアウトはまあまあ適当に作ってありますので、ご了承くださいませ。

### ソー

元記事を表示

Androidのgradleでのbuild variantsあれこれ

# 前提
このようなVariantsの状況であるとします。

“`.gradle
android{
buildTypes{
debug{…}
release{…}
}
flavorDimensions “number”, “alphabet”
productFlavors{
one{
dimension “number”
}
two{
dimension “number”
}
alpfa{
dimension “alphabet”
}
beta{
dimension “alphabet”
}
}
}
“`

これでsyncすると以下のようなパターンが出力されますね
“`
oneAlphaDebug
oneAlphaRelease
oneBetaDebug
oneBetaReleas

元記事を表示

Androidde+ViewModel+coroutine+roomの使い方2点

# Android で coroutineを使って書いていて、直面した問題

1. 画面に検索条件があって、その検索条件で絞って room を検索し、その結果を RecyclerView に表示したい。RecyclerView に行を追加する EditText、buttonもあり、追加する場合は今、表示されている検索条件が room のテーブルのキーになっているので、そのキーで room に INSERT。RecyclerView も再表示したいので、ここは observe パターンでなければいけない。observe パターンで画面から検索条件が変わる場合って、どうすればいいんだろう?
1. 大量データを INSERT する処理がある。処理時間が長いので、その間は room のデータを変更して欲しくない。処理開始前にボタンをdisable にし、progressbar を表示。処理が完了するとボタンを enable、progressbar を非表示にしたい。coroutine の非同期処理の終了時に画面の View を更新するようにするには、どうしても ViewModel の中で co

元記事を表示

【Godot 4.0】Androidアプリ(apkファイル)エクスポート手順

 Godot 4.0 RC1でAndroidアプリapkファイルをエクスポートしました。環境はWindows11です。
 https://downloads.tuxfamily.org/godotengine/4.0/
 (rc1/Godot_v4.0-rc1_win64.exe.zip)

# まとめ
 Godotの最新ドキュメントの手順に従って設定しました。
 https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_android.html

 1.OpenJDK 11のインストール
 2.Android Studioをインストールして、SDK Managerから必要なツールをインストール
 3.デバッグ用KeyStoreファイルの作成
 4.Godotのエディター設定でAndroid SDKとデバッグ用KeyStoreファイルの場所を設定
 5.Godotのプロジェクト設定でAdvancedSettingsを有効にしてレンダリング>テクスチャにあるImport ETC2 ASTCをオンにする。

元記事を表示

Google Play Consoleで収益化用のBase64エンコードのRSA公開鍵を取得する方法

# この記事を書くに至った理由

Google Play Consoleで収益化用のBase64エンコードのRSA公開鍵を取得する方法を調べたところ、情報が古く、UIが変更されていたため取得が困難であったから。

# 結論

2023年2月14日で有効な方法です。

Google Play Consoleにログイン

収益化用のBase64エンコードのRSA公開鍵を取得したいアプリに移動。

左側のバーにある「収益化のセットアップ」をクリック

「ライセンス」というところに求めているものがあります。

「アプリバイナリに追加する Base64 エンコードの RSA 公開鍵です。スペースはすべて削除してください。」と書かれているはずです。

元記事を表示

AndroidStudio Electric Eelで”No matching variant of com.android.tools.build:gradle:7.4.0 was found.”が出た

## 何が起こったか
AndroidStudioを電気ウナギ(Android Studio Electric Eel | 2022.1.1)に更新。
新しいAndroidStudioでアプリを新規作成しようとしたところ、”No matching variant of com.android.tools.build:gradle:7.4.0 was found.”というエラーが出た。

## 調べた結果
どうやら Gradle JDKを11にしないとダメらしい。
公式情報が見つからなかったのでStackOverFlowを。
https://stackoverflow.com/questions/75114728/no-matching-variant-of-com-android-tools-buildgradle7-4-0-was-found

## 直し方
### Macの場合
AndroidStudio -> Preferences -> Build, Execution, Deployment -> Build Tools -> GradleJDKを選択し、1.8になっているとこ

元記事を表示

Flutter Androidビルド作成が失敗するKeystore file ‘android/app/key.jks’ not found for signing config ‘release’.

# はじめに
FlutterアプリをGoogle Play Storeに公開する手順は以下のような記事で解説されています。

https://gakogako.com/flutter_android_release/

https://zenn.dev/kazutxt/books/flutter_practice_introduction/viewer/42_chapter5_googleplay

ただ、私の場合はその通りにやってもできなかったので、、、ここに記録したいと思います。

**私はAndroidアプリを公開するのは初めてではないので、既にkeystoreファイルは持っています。なので最初の準備はすっ飛ばして進めました。**

だからなのかわかりませんが、`flutter build appbundle`の部分でエラーに見舞われました。。

# 前提
Keystoreファイルの作成、`key.properties`の作成など[ここまでの手順](https://gakogako.com/flutter_android_release/#flutter_cleanする)は

元記事を表示

tasks.register()に渡す第二引数と第三引数に関するメモ

`Plugin`を継承したクラスにてオーバーライドされる`apply()`では、タスクを登録することができる。

“`kotlin
class CustomPlugin : Plugin {
override fun apply(target: Project) {
with(target) {
tasks.register(“customTaskName”, CustomTask::class) {
dependsOn(taskName)

}
}
}
}
“`

タスクを登録する際、`Project`の`tasks`プロパティの`register()`を呼び出す。

第一引数には、タスク名を渡す。

ただ、第二引数に付けられた名前が`type : KClass`となっており、使われ方がよくわからなかった。

そして、第三引数として渡すブロックは`configurationA

元記事を表示

GradleプラグインとGradleタスクの違いのメモ

私は、GradleプラグインとGradleタスクの違いがわからなかった。

Gradle素人として、いくつか疑問が浮かんできた。

「プラグインとタスクの本質的な違いはなんだろう?」

「GradleプラグインとGradleタスクの使う場面ってどこだろう?」

まずは、Gradleプラグインについて調べてみた。

Gradleプラグインは、新しい既存の機能を拡張するために存在している。
そして、Gradleプラグインを使うことで新しいタスクの追加や、既存の設定を上書きしたりすることができるようだ。

ここで出てきたタスクという単語。

そう、Gradleタスクはプラグインによって追加することができるのだ。

:::note warn
もちろん、プラグインをわざわざ作成しなくても、直接**build.gradle**に定義することも可能。
:::

そして、ここでいうタスクとは、Gradleのビルドにおける1つの作業単位を表す。この作業単位とは、実際にはクラスのコンパイルや、JARの作成、そしてJavaDocの作成などのひとまとまりのロジックを意味している。

そしてこのタスクは、別のタ

元記事を表示

【Android】フォントを変更する

# フォルダの作成
resを右クリック→New→Directory でダウンロードしたフォントの置き場(ここではmy_fontと命名)になるフォルダを作っておきます

![スクリーンショット 2023-02-12 22.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/7199dff7-a12b-bc39-e402-137e4e8e99df.png)

以下のサイトなどからダウンロードし、先ほど作ったフォントの置き場であるmy_fontフォルダにドラック&ドロップでAndroidStudio内に持ってきます

[Google Noto Fonts](https://fonts.google.com/noto)

[Google Fotnts](https://fonts.google.com/)

# 使用
XML上の使用したいテキストの要素に
“`
android:fontFamily=”@my_font/〜〜〜〜”
“`
と先ほど追加したフォルダからfontFam

元記事を表示

kotlin coroutine

# サマリ
#### コンテキスト
コンテキストはスレッドのこと
withContext(Dispatchers.IO)
Dispatchers.Main
Dispatchers.IO
Dispatchers.Default

#### スコープ
スコープとはcoroutineが制御される範囲(追跡可能な範囲)
viewModelScope.launch
await:値を返す
※suspend 関数は、他の suspend 関数から、または、launch などのコルーチン ビルダーを使って新しいコルーチンを開始することによってのみ呼び出せる。

## コンテキスト
#### メインセーフ
suspend 関数は、他の suspend 関数から、または、launch などのコルーチン ビルダーを使って新しいコルーチンを開始することによってのみ呼び出せる。

“`kotlin
suspend fun fetchDocs() { // Dispatchers.Main
val result = get(“developer.android.

元記事を表示

Cloud Storage for Firebaseのエミュレーターに接続して画像をアップロードしたら失敗した話

開発中のAndroidアプリで、ローカルで起動したFirebase Emulator SuiteのCloud Storageに接続するように設定しました。

“`shell
FirebaseStorage.getInstance().useEmulator(“10.0.2.2”, 9199)
“`

しかし、通常通り画像のアップロード処理を行なってみたところ次のようなエラーが発生しました。

“`shell
StorageException has occurred.
User does not have permission to access this object.
Code: -13021 HttpResult: 403


com.google.firebase.storage.StorageException: User does not have permission to access this object.
“`

調べてみたところ、自動的に読み込まれた**storage.rules**の内容

元記事を表示

OTHERカテゴリの最新記事