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

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

NoxPlayerをPythonで動かすための基礎

##背景
UWSCの配布・サポートが終わったので、以前UWSCで書いたマクロをPythonで書き直した
そこで書き直した内容のうち、NoxPlayerをマクロで動かす上で重要な内容をまとめてみようと思った

内容として、Nox操作に必要なADBコマンドの送り方、プログラムとNoxで双方向的な操作、あいまい画像認識の方法など述べる
ソースコードを乗せるが、改変しながら書いたので間違ってるかも

##環境
NoxPlayer 6.6.0.0
Python 3.6
opencv-python 4.1.2.30

##ADBコマンドを送って操作する
NoxPlayerでAndroid操作を自動化するにあたって、一々マウス操作では煩わしい
そのためバックグラウンドで操作する必要があるが、そのためにはADBコマンドを使う必要がある
→Noxにはnox_adb.exeが標準で付属しているため、これを用いる

最初に、PythonでUWSCのDOSCMDに当たる関数は以下のように書ける

“`Python:コード
from subprocess import run, PIPE
def doscmd

元記事を表示

Android-ボタンをクリックされるたびに,表示されるテキストの値を変化させる

#目指す成果物

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/a35ea9f4-d915-ecce-3587-d0022d9ba31f.png)

#ステップ
###1. アクティビティファイルについて知る
アクティビティというのがUIを描画するクラスです.
アプリが起動すると,AndroidManifest.xmlファイルで指定されたアクティビティが最初に起動します.
Androidアプリにはメインメソッドが無い代わりに,MainActivityを指定しています.

また,アクテビティが開始されると,レイアウトファイル内のビューがビューオブジェクトに変換されます.
これによりレイアウトファイル内のビューがアクティビティ内で使用できるようになります.
(レイアウトインフレーションという仕組み)

###2. レイアウトファイルについて知る

すべてのアクティビティには,レイアウトファイルが紐付けられていて,ビューを定義し,画面のどこに配置するかを決めます.

レイアウトファイルを

元記事を表示

Android-Helloworldという文字列を表示させる

#目指す成果物
![helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/d118eb79-a606-6357-c530-db176e68784e.png)

#ステップ
###1. HelloWorldプロジェクトを作成する
まずAndroid Studioのこのメイン画面で,「Start a new Android Studio project」をクリックします.
![androidstudio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/e348710c-59b3-1b54-6fef-3e6212b4e0cf.png)

「Choose your project」が表示されるので,「Empty Activity」を選択し,「next」をクリックします.
Activityは一つのプロジェクトにつき一つ必要です.javaでいうとmain()的な位置付けです.
![3.png]

元記事を表示

Pythonで作るAndroid WebView アプリ (非kivy)

ずっとLinuxMint18.2(Ubuntu16.04LTS派生)を使っていてWebViewアプリの作成には失敗していたのですが、LinuxMint19.3(Ubuntu18.04LTS派生)に上げた途端に成功したのでメモ。[過去記事][prereq]と手順は似ているので差分のみを書いていきます。

# openjdkの混在を避ける

私がOSをclean installではなくupgradeしたせいなのかopenjdkは複数のversionが混在してしまいました。

“`bash
# 現在入っているopenjdkを調べる
dpkg -l | grep openjdk
“`

“`
ii openjdk-11-jre:amd64 11.0.6+10-1ubuntu1~18.04.1 amd64 OpenJDK Java runtime, using Hotspot JIT
ii openjdk-11-jre-headless:amd64 11.0.6+1

元記事を表示

Android Vulkan で ValidationLayers をインストール, 有効にするメモ

https://developer.android.com/ndk/guides/graphics/validation-layer

## 環境

* NDK r21(検証レイヤーがひとつにまとまって便利)
* Android9 or later(Android 10(Pixel4) で動作確認)

.so を apk に含めるか, Android9 以降では .so をアプリ固有ストレージに置いて, 実行時に validation layer(.so) をロードすることができます.

## gradle に指定して apk にパッケージングする設定

https://developer.android.com/ndk/guides/graphics/validation-layer#ilp

特段問題なくできるかと思います.

gradle で ndk のディレクトリは android.ndkDirectory で取得できます.

https://stackoverflow.com/questions/32751398/how-can-i-access-sdk-ndk-paths

元記事を表示

Gradle を Kotlin で書こう

今までなんとなくコピペとかコピペとかコピペで書いていた gradle 。
Groovy とか言う音ゲーのタイトルっぽいスクリプトで書かれています。

なんとその gradle が Kotlin で記述できるではありませんか!
これで少しは理解に身が入ると言うもの。さっそく試したいと思いました。

## Kotlin DSL ??

– Domain-Specific Language

特定の課題を解決するために特化された言語
SQL や HTML, Groovy なんかも DSL になるらしいですね。

Kotlin でスクリプトが書ける機能です。

## Migration

今回は元々あるプロジェクトへの導入方法になります。

### Environment

– Android Studio 3.5.3
– Gradle 6.0.1
– Kotlin 1.3.61
– JDK 8

### Rename and Rewrite

ほぼほぼ Android Studio の New Project で自動生成される gradle を書き換えます。

__1. `setti

元記事を表示

Flutter 正方形にカメラの映像を表示させるサンプル

## 実現したいこと
正方形にカメラの映像を表示させる

## 動作の様子
![IMG_5485 2.2020-01-30 15_06_52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6327/58219644-8928-e2b1-7de3-026c36bab81a.gif)

## 動作コード
こちらに一式用意しています。
https://github.com/quqjp/flutter-test

コード箇所はこちら。
https://github.com/quqjp/flutter-test/tree/master/lib/sample4

## 利用プラグイン
Camera Plugin
https://pub.dev/packages/camera

installing に従い導入する
https://pub.dev/packages/camera#-installing-tab-

## コード
FittedBoxで囲ってセンタリングすることで、映像の中心を保ちつつ正方形にマスク処理

元記事を表示

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();

元記事を表示

OTHERカテゴリの最新記事