Android関連のことを調べてみた2020年01月30日

Android関連のことを調べてみた2020年01月30日

AndroidアプリでRealmマイグレーションするときの勘所

# 概要
[Realm](https://realm.io/)は、オープンソースのモバイル向けオブジェクトデータベース管理システムである。
弊社のモバイルアプリ[drill](https://drill.5thfloor.co.jp/)のAndroid版でも、設問の回答やアイデアメモ等のデータをデバイスに保存するために使っている。
Realmで保存しているデータのModelを書き換えるとマイグレーションが必要になる。実施した際に覚えておきたいと思ったところをまとめておく。

# 手順
## マイグレーション用のコードを記述する
マイグレーションするために、[`RealmMigration`](https://realm.io/docs/java/latest/api/io/realm/RealmMigration.html)を実装して、`migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long)`をオーバーライドする。

“`MyMigration.kt
class MyMigration : RealmMigra

元記事を表示

Android Studio – ImageViewをwrap_contentにしても画像サイズと合わない

# ImageViewに画像をセットすると、サイズが画像に合わない
こんなふうに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278251/1aa1049f-a525-3bd4-5c38-3a5b3e236f84.png)

layout_heightを`wrap_content`にしても変わらないのでハマった

# 解決法
Stack Overflowに書いてあった
[java – Image View not Wrapping Contents – Stack Overflow](https://stackoverflow.com/questions/21203189/image-view-not-wrapping-contents)

`adjustViewBounds`を`true`にすればOK。

“`xml:activity.xml
[Android]gradle taskのビルド時間を抽出するスクリプト書いてみた

# はじめに

現在、Androidインターンでビルド時間の改善に向けて日々奮闘中です。

マルチモジュールへの分割であったり、app moduleとは別なapplication moduleを作成してデバッグ速度をあげようとしている中のですが、

ビルド時間の計測を手動でしていたため、効率も悪く、ビルドがいつ終わったかを常に意識して待つ必要がありした。

そこで、shellscriptを書くことにより、人力ビルドから開放されようという試みです。

shell scriptを書くのは初めてなのでもっと良い書き方等あれば教えてくださいmm

# ざっくり流れ

1. 何回ビルドを行うかを入力
2. ビルドキャッシュを使うか否かを入力
3. output先のファイルを生成
4. 2の入力をもとにgradleのタスクを実行
5. 正規表現でビルド時間のみを抽出し、ファイルに書き込む
6. 4~5を1で入力した回数繰り返す

実際のコードはこちら

“`shell

#!/bin/bash
# ./build/build-time-2020-01-29-17-50-00.tx

元記事を表示

日付を適切にローカライズする[Kotlin]

ローカライズをしようと思った時に、ちょっと厄介なのが日付部分です。言語によって文字列も、記述順序も変わります。が、 `DateFormat` にある `getBestDateTimePattern` というメソッドを使えばそこらへんを自動でよろしくやってくれます。ということでこの記事では `getBestDateTimePattern` を紹介しようと思います。

# getBestDateTimePattern の特徴

* API Level 18 (Android 4.3)以上で使用可能
* 何の日付要素を表示するか(yyyyMMなど)を細かく設定できる
* 適切な日付要素の順番に並べてくれる

# サンプルコード

“`kotlin
private fun localizedDateString(epochSecond: Long): String {
val local = Locale.getDefault()
val format = DateFormat.getBestDateTimePattern(local, “EEEMMMd”)
val

元記事を表示

Android gradle で cmake build のメモ

https://developer.android.com/studio/projects/add-native-code.html#create-cmake-script

## Cmake version

SDK manager の cmake (Android Studio 経由で落とす. Android SDK には付属していない. どこかに直接ダウンロード URL はあるかと思われる)を使うか(version 3.10 ベース), もしくは cmake 3.7 以上を使う.

SDK manager 経由で落とすと,

`$ANDROID_SDK/cmake/3.10.xxx/bin/cmake` にある.

## ビルドフォルダ

デフォルトでは,

`app/.cxx/cmake/` に生成される.
たとえば

`app/.cxx/cmake/arm8Debug/arm64-v8a` など.

Android Studio では, CMake のエラーコードはパースしてくれないようで IDE 内でエラー位置に移動してくれないため, このフォルダで vim などで qu

元記事を表示

[ Android ] AlertDialogにListViewを表示する2(完成)

前回の記事ではエラーが発生してListViewを表示できなかった。
https://qiita.com/QiitaD/items/0713d7565ada707133e5

##起こったエラー
「java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.」が発生した。

このエラーの意味(参考URL参照)は
>「親Viewが子Viewを管理しています!
それに反することをすると、当然動かなくなるよ!(=_=メ)」

らしい…

##コードをチェック
自分のコードを見てみると親クラス(MainActivity)がもつリストビューの用語IDを取得して、それをAlertDialogにセットしようとしていた。これが原因であった。

~~~java
listViewFruits_ = findViewById(R.id.listView);//親クラスのレイアウトからListView取得
//
/

元記事を表示

Androidアプリがいきなりビルド出来なくなった時

# 何も変えていないのにビルド出来ない…
本記事では、僕がAndroidアプリのコードを何も変えていないのに突如ビルド出来なくなった時の話をします。
これはAndroidのパッケージマネージング事情によるところが多いっぽいので、それを主に解説します。
最初からビルドできてない場合は対象外です。

# 依存関係を疑う
最初に疑うべきは、ライブラリのバージョン指定。
以下のような記述をbuild.gradle内に見付けたら、真っ先に疑う。

“`javascript:android/build.gradle
compile ‘com.google.android.gms:play-services-gcm:+’
“`

まずいのは末尾の`:+`の部分。+は「その中で一番新しい」を表し、つまり`:+`は「最新版」という意味。
ライブラリのインストールはアプリをビルドするたびに行われるので、コードを変えていなくてもインストールされるライブラリはバージョンアップに従って変わっていく。

「何も変えてないのにビルドできないよ〜」はまずこれが原因。(経験数2)

# Androidサポー

元記事を表示

強制バージョンアップ覚書

# はじめに
アプリの機能でよく実装する強制バージョンアップですが、
毎回実装すると、地味に不具合が出ることに気がつきました…
(ロジックとしては定型的なんですが、意外とロジックミスをしやすい…この記事を書いていてもいくつか…)

使える場面は限定的ですが、強制バージョンアップのロジックを整理して残しておきます。
**※こちらは参考のみとして、業務ではコピペで使わないようお願いいたします。**

[ソースコードはこちらです](https://github.com/shinya-takano/ForceVersionUpSample)

# 覚書とテストコード
– バージョンルールは決めておく

[Android公式サイト](https://developer.android.com/studio/publish/versioning?hl=ja) では以下のように記載があります。

> versionName – ユーザーに表示されるバージョン番号として使用される文字列。この値は、未加工の文字列または文字列リソースへの参照として設定できます。
この値は文字列であり、アプリの

元記事を表示

Androidで登録バリデーションフォームをサクッと作る

Androidの今風のスタックでバリデーションをどう作るのかサクッと実装してみた

よくあるEメールとパスワードを入力するものを想定しています
スクリーンショット 2020-01-28 22.34.37.png

今回はEメールとパスワードを打ち込み、条件を満たせばREGISTERボタンが活性化するような仕組みとします

# 環境
* Kotlin
* AndroidX
* Databinding(2way)
* MVVM
* Gradle

一部抜粋

“`build.gradle
// LifeCycle
def lifecycle_version = “2.1.0”
implementation “androidx.lifecycle:lifecycle-extensions:$lifecycle_vers

元記事を表示

FlutterをAndroidStudio(Windows)にインストールしてデモアプリを実行するまでやってみた

##はじめに
FlutterをWindowsにインストールしたのでメモとして残したいと思います。
何番煎じの記事かわかりませんが、version違いとかで少しずつ違ってたりするので誰かのお役に立てれば幸いです。

##環境
Windows 10
Android Studio 3.5
Flutter Windows 1.12.13

##やってみる
基本的にはGoogleの[公式ドキュメント](https://flutter.dev/docs/get-started/install/windows)に沿ってやっていきます。

###まずはSDKをダウンロード
公式ドキュメントからSDKをダウンロード
![flutter_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/1573e0d5-7ade-850a-3b9f-131a125e6d2a.png)
zipを解凍し、適当な場所に配置します。
`C:\Program Files\`には置くなって書いてあるので、`C:\`の下に適当なフォルダを

元記事を表示

Android C/C++ でアクセスできるストレージのメモ

## 背景

主に開発時に, Android + C/C++ で fopen, std::ifstream などで実機上のファイルの読み書きをしたい.

SDK level 28 でコンパイルし, Android 10(Pixel4) で確認しています.

## `/sdcard`, `/storage/emulated/0`

Android M から, `/sdcard` へは Toast などでユーザから同意取得(or Android 設定で対応)になりました.
Permission を取得していればアクセスできます.

https://stackoverflow.com/questions/33162152/storage-permission-error-in-marshmallow

JAVA でいくらかコード記述を書く必要があります.

開発時であれば, adb で設定することもできます.

https://github.com/TilesOrganization/support/wiki/How-to-use-ADB-to-grant-permissions
https

元記事を表示

[Android] AlertDialogにListViewを表示する(未完)

##前提
ListViewの使い方がわからない方はこちらを参考にしていただきたい。
https://qiita.com/QiitaD/items/6123bb53d358c51beb97

##参考URL
こちらを参考にした。この方の記事で紹介されているサンプルではうまくいった。
https://qiita.com/ueno-yuhei/items/ef6d835e143592e7a3f0

##使い方(未完)
まずListViewを作り、それを以下のようにしてAlertDialogにセットした。

~~~java
//ListView作成
listView.setAdapter(adapter);

//AlertDialogにセット
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(“タイトル”)
.setView(listView)
.setPosit

元記事を表示

51歳からのプログラミング 備忘 Android非同期通信のコールバック AsyncTask終了後の処理

# 非同期通信のコールバック

AsyncTaskの処理が終了した後で、何かしたいときに使います。

“`java:MainActivity
public class MainActivity extends AppCompatActivity{

TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);

AsyncCallBack asyncCallBack = new AsyncCallBack();
MyAsyncTask myAsyncTask = new MyAsyncTask(asyncCallBack);
myAsyncTask.execute();

元記事を表示

Androidでsystrace

Androidのsystrace取るのに少しハマったのでメモします。

###### 実行手順
手順は[Android developers](https://developer.android.com/studio/profile/systrace/command-line?hl=ja)に記載されている通りなのですが、pythonは2.7系でないとダメでした。
参考:[Windowsにpythonをインストール](http://yoshihiro-kato.blogspot.com/2017/06/windowspython.html?m=1)

###### 不足パッケージの追加
また、pywin32をインストールしないと下記のエラーとなります。
`ImportError: No module named win32con `

pywin32は下記のコマンドでインストールできます。
`pip install pywin32`

pipはインストールしたpythonのScriptsフォルダ内にあり、pathを通していればそのまま使えます。
ただし、proxy環境では、オプションでp

元記事を表示

【Mac】UE4で開発したアプリをOculus Questへデプロイする

# はじめに

macOSでUE4を使ってOculus Questアプリを制作し、実機で動かすまでの方法が記載された記事があまり見当たらなかったので、今回書こうと思った次第です。

今回は、UE4で新規プロジェクト(プロジェクトのカテゴリ:ゲーム)立ち上げからOculus Questへデプロイまでを順を追って説明していきたいと思います。

文字だけで説明していますが、お許し下さい。

# 当記事で取り扱わない事

– UE4のインストール
– ADBのインストール(Macには既に入っている為)
– Oculus Questのセットアップ(前提:開発者モードがONになっている事)
– Javaのインストール

# 開発に必要なもの

– Oculus Quest本体
– コントローラー
– 本体付属の充電ケーブル

付属の充電ケーブルはType-Cですが、規格がUSB2.0の為、USB3.x系規格のものを別途購入することをおすすめします。
**付属の充電ケーブルでも開発可能です。(この事は他の記事では記されていない)**

Oculus Linkがありますが、コスパを考慮するなら

元記事を表示

SUZURIのAPIを使ってAndroidアプリを個人開発した話

タイトル通り、SUZURIさんのAPIを使って、Androidアプリを作成しました。
1ヶ月半ほどの開発期間でしたが、せっかく色々考えながら作ったので覚えてるうちにここに書いておきます。

開発したアプリ
SUZROID
https://play.google.com/store/apps/details?id=jp.co.seto.suzroid
ic_app.png ic_app.png

元記事を表示

[備忘録][Android][Kotlin]画面を遷移する方法

# 参考
[備忘録][Android][Kotlin]画面を遷移する方法

元記事を表示

[備忘録][Kotlin][OkHttp]解決方法:java.io.EOFException: \n not found: size=0 content= unexpected end

# 参考
[備忘録][Kotlin][OkHttp]解決方法:java.io.EOFException: n not found: size=0 content= unexpected end

元記事を表示

Could not complete execution for Gradle Test Executor 12.が出てテストが実行出来なかったときの対応

マルチモジュールでJUnit5のテストを実行した時に以下の例外で動かなかった時に

“`
Caused by: org.junit.platform.commons.util.PreconditionViolationException: Cannot create Launcher without at least one TestEngine; consider adding an engine implementation JAR to the classpath
“`

この辺の設定とかしてあるのに出たら

“`
testOptions {
junitPlatform {
filters {
engines {
include ‘spek2’
}
}
}
}
“`

pluginの指定が漏れてた。

“`
apply plugin: “de.mannodermaus.an

元記事を表示

【Android/Kotlin】n番目からm番目の文字を取得する方法

“`hoge.kotlin
var fuga = “20190127”
var length = fuga.length
var text = fuga.substring(length-2,length)//6から8まで抽出
→27
var text2 = fuga.substring(4,8)//4から8まで抽出
→0127
“`

元記事を表示

OTHERカテゴリの最新記事