20200318のAndroidに関する記事は8件です。

AndroidStudioのScratch Fileでビルドせずにプログラムを実行する方法

■概要

ちょっとした演算や勉強、作成した関数の結果などを調べたいときにアプリケーション全体を作成せずに、軽量な方法でKotlinコードを作成および実行できます

image.png

■特徴

  • 軽い!!!
  • AndroidStudioのエディタと基本同等機能が使える
    • 入力保管
    • 動的なエラー表示
    • 関数ジャンプ
    • ローカルヒストリーなどなど
  • プロジェクト内のクラス、関数の利用
  • 全プロジェクトで共通のScratch Fileを使用可能
  • プロジェクトに含めなくてよいのでGitなどで他者と共有する心配がない

■使い方

・ショートカット
【Mac】command + shift + N
【Windows】Ctrl + Alt + Shift + Insert

image.png

言語を選択すると下の画像のような状態になると思います
今回はKotlinを選択しました
Windowsの場合は結果画面が右に別れています

image.png

■機能説明

image.png
実行
右クリックからでも出来ます

image.png

実行結果の削除

image.png

モジュールの選択
選択するとプロジェクト内のクラスや関数が使用可能になります
コンテキストは使えないので注意

image.png

モジュールを選択すると出現
実行時にモジュールを作成する
一回はモジュール作成しないとモジュールの関数等使えないので注意

image.png
インタラクティブモード
何もしていないと2秒おきに結果を出力してくれる
しかしMacでは使えない???(調査中)

image.png

Read-Eval-Print-Loopの略で対話型実行のこと
新しいコードのみが実行されます
結果の表示形式も若干変わって
3 * 5 res1: kotlin.Int = 15
res1 * 10 res2: kotlin.Int = 150
といったように結果を利用することもできます

■色々試してみる

最初の画像と同じです
image.png

いちいちprintlnとか入力しなくても値を出してくれるのはありがたいですね
モジュールの関数を使う場合はimportが必要ですが、基本自動で補完してくれます

■保存場所

多少環境によって変わりますが以下でした
【Mac】~Library/Preferences/AndroidStudio3.5/scratches
【Android】~Users/user/AndroidStudio3.5/config/scratches

全プロジェクトで同じファイルを呼び出せます

image.png

Scratche File選択時のみに出る【Scratches】をクリックしてファイル選択、削除、名前変更するのがお勧めです
ファイル検索にひっかからないのでFavoritesにScratch Filesを登録しておくのも良いかも
新規作成して【Scratches】を出すのもありかと思います

■参考

・IntelliJ IDEA
https://pleiades.io/help/idea/scratches.html
・Kotlin
https://kotlinlang.org/docs/tutorials/quick-run.html
・Productivity Hack: AndroidStudio Kotlin Scratch File
https://medium.com/@shivam.gosavi340_58315/productivity-hack-androidstudio-kotlin-scratch-file-e17cfde152c6

■おまけ 他の簡易実行方法

1.WEB常にて実行

入力補完がなく動的にエラーを教えてくれないですが、ちょっとしたプログラムをコピって試すぐらいなら便利です

https://paiza.io/projects/YKxAS5SYXhuQXDPQrpwaqQ?locale=ja-jp

image.png

https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt
image.png

2.Kotlin REPL

image.png

上の手順でREPLを起動

image.png

補完は効きますが、対話式で前の編集が効きません
私の使い方が悪いのかもしれないですが、使いどころが思い浮かびませんでした

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

kotlinx.android.parcel.Parcelizeのimportでエラーになる

import kotlinx.android.parcel.Parcelize

これがparcelの時点でエラーになる

トップレベルのbuild.gradleで classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" を dependenciesに追加する

build.gradle
buildscript {
    ext.kotlin_version = '1.3.70'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // ↓こいつを追加する
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
  // 以下略

そして肝心なのがモジュールのbuild.gradleでpluginの宣言の順

module/build.gradle
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

これが正しい順。 kotlin-android のあとに kotlin-android-extensions を書かないと表題の通りimportエラーになる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android NDK + C++14 設定 cmake で no member named `make_unique` in namespace `std` エラーなどが出る

背景

C++14 を要求されるコードを

set(CMAKE_CXX_STANDARD 14)

と設定しても,

no member named `make_unique` in namespace `std`

などで, make_unique 周りでコンパイルがこける.

原因

たぶんなにか他の add_subdirectory などで追加している third party library が, CXX flags に直接 -std=c++11 など他の C++ バージョンを指定してしまっている可能性が高いです.

CMAKE_MAKEFILE_VERBOSE=On を cmake bootstrap に追加するなどして, コマンドラインで適切に C++14 モードになっているか確認してみましょう.

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

として, 厳格に -std=c++14 でコンパイルするようにするとよいかもしれません.

call to 'make_unique' is ambiguous エラー

spdlog を Android + C++14 でビルドするときに発生しました.

なにか他の Android ヘッダと定義がかちあっているようです.
先に spdlog のヘッダをインクルードするようにすると解決しました.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Palette APIで画像から色を抽出する(ツールバーの色を画像から変える)

Palette APIを使うとBitmapから簡単に色情報を取得することができるようです。
https://developer.android.com/training/material/palette-colors?hl=ja

公式でも書かれていますが、アルバムカバー画像から色を抽出してレイアウトカラーにしたり、今回のようにステータスバーを変更したりなど、ユーザーに視覚的に印象を与える場面で効果的なようです。

で、実際にどんな感じになるのかを試してみたのですが、とても簡単に使うことができました。

実際に書いてみたサンプルの挙動がこんな感じです。リスト表示されているユーザーを選択して詳細画面へいくと、ヘッダーが表示されてステータスバーがそのヘッダー画像から抽出された色に変更されるような感じです。

画面の色味が統一されてすごくいい感じですね!

今回のサンプルコード

Installation

このページのトップの公式ページのリンクを参照した方がいいですけど、これを書いてる今現在はbuild.gradleに implementation 'com.android.support:palette-v7:28.0.0' を追加するだけです。28の部分は自分のcompileSdkVersionに合わせる感じです。たぶんAndroidStudioから勝手に提案されると思います。

build.gradle
    android {
      compileSdkVersion 28
      ...
    }

    dependencies {
      ...
      implementation 'com.android.support:palette-v7:28.0.0'
    }

Basic Usage

BitmapからPaletteを生成します。生成したPaletteからMutedColorとVibrantColorを取得することができます。

BitmapからのPalette生成はこれだけ。

val palette = Palette.from(bitmap).generate()

BitmapからPaletteを生成するのはコストがかかる処理なので、頻度が高い場合や同じPaletteを使い回す場合は何度も generate() しないようにした方がいいみたいですね。

あとは非同期的に処理した方がいいかもしれません。CoroutineでUIスレッドをブロックしない形で呼び出した方が良さそうですね。後述します。

パレットからは、6つのパターンで色情報を抽出することができます。

  • Light Vibrant
  • Vibrant
  • Dark Vibrant
  • Light Muted
  • Muted
  • Dark Muted

Vibrantが「活発な」でMutedが「静かな」なので、まあ、それぞれそんな感じで色を抽出してくれるって感じですかね。。笑?

それぞれ getMutedColor() みたいな感じで呼び出します。返り値はColorのIntです。AndroidならそのままColorとして使えるので扱いやすいですね!

palette.getMutedColor(Color.BLACK)

色の抽出ができなかった時のために引数にはデフォルトカラーを入れておく必要があります。ここでは適当にBlackをデフォルト値として渡しています。

。。。これだけです。めっちゃ楽。
まとめるとこんな感じで使えます。

fun getMutedColor(bitmap: Bitmap): Int {
    return Palette.from(bitmap).generate().getMutedColor(Color.BLACK)
}

In sample code!

このサンプルコードではUseCase層にPalette API処理の関数を定義しています。

PaletteUseCase
fun getMutedColor(bitmap: Bitmap): Int {
    return Palette.from(bitmap).generate().getMutedColor(Color.BLACK)
}

Paletteの生成処理はコストがかかるので非同期的に取得したいところです。サンプルコードではViewModelからCoroutineスコープで呼び出す関数を定義しています。MVVM + LiveDataで書いているので、statusBarColor(Int型のMutableLiveData)にpostValueしています。

ViewModel
fun fetchStatusBarColor(bitmap: Bitmap) = viewModelScope.launch {
    // UIスレッドをブロックしない形で呼んであげる
    _statusBarColor.postValue(paletteUseCase.getMutedColor(bitmap))
}

FragmentからViewModelの fetchStatusBarColor() を呼び出す部分です。BitmapはリソースIDから取得しています。

Fragment
viewModel.fetchStatusBarColor(BitmapFactory.decodeResource(resources, it.headerResId))

fetchStatusBarColor() で色を抽出すると statusBarColor に変更を通知するので、ObserveしてるFragment側でWindowのステータスバーに getMutedColor() で取得したInt値をセットしているだけです。

Fragment
viewModel.statusBarColor.observe(viewLifecycleOwner, Observer { color ->
    activity?.also {
        // 本質的なのはこの1行だけ!
        it.window.statusBarColor = color
    }
})

以上でこんな感じで動くようになりました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Palette APIで画像から色を抽出する(ステータスバーの色を画像から変える)

Palette APIを使うとBitmapから簡単に色情報を取得することができるようです。
https://developer.android.com/training/material/palette-colors?hl=ja

公式でも書かれていますが、アルバムカバー画像から色を抽出してレイアウトカラーにしたり、今回のようにステータスバーを変更したりなど、ユーザーに視覚的に印象を与える場面で効果的なようです。

で、実際にどんな感じになるのかを試してみたのですが、とても簡単に使うことができました。

実際に書いてみたサンプルの挙動がこんな感じです。リスト表示されているユーザーを選択して詳細画面へいくと、ヘッダーが表示されてステータスバーがそのヘッダー画像から抽出された色に変更されるような感じです。

画面の色味が統一されてすごくいい感じですね!

今回のサンプルコード

Installation

このページのトップの公式ページのリンクを参照した方がいいですけど、これを書いてる今現在はbuild.gradleに implementation 'com.android.support:palette-v7:28.0.0' を追加するだけです。28の部分は自分のcompileSdkVersionに合わせる感じです。たぶんAndroidStudioから勝手に提案されると思います。

build.gradle
    android {
      compileSdkVersion 28
      ...
    }

    dependencies {
      ...
      implementation 'com.android.support:palette-v7:28.0.0'
    }

Basic Usage

BitmapからPaletteを生成します。生成したPaletteからMutedColorとVibrantColorを取得することができます。

BitmapからのPalette生成はこれだけ。

val palette = Palette.from(bitmap).generate()

BitmapからPaletteを生成するのはコストがかかる処理なので、頻度が高い場合や同じPaletteを使い回す場合は何度も generate() しないようにした方がいいみたいですね。

あとは非同期的に処理した方がいいかもしれません。CoroutineでUIスレッドをブロックしない形で呼び出した方が良さそうですね。後述します。

パレットからは、6つのパターンで色情報を抽出することができます。

  • Light Vibrant
  • Vibrant
  • Dark Vibrant
  • Light Muted
  • Muted
  • Dark Muted

Vibrantが「活発な」でMutedが「静かな」なので、まあ、それぞれそんな感じで色を抽出してくれるって感じですかね。。笑?

それぞれ getMutedColor() みたいな感じで呼び出します。返り値はColorのIntです。AndroidならそのままColorとして使えるので扱いやすいですね!

palette.getMutedColor(Color.BLACK)

色の抽出ができなかった時のために引数にはデフォルトカラーを入れておく必要があります。ここでは適当にBlackをデフォルト値として渡しています。

。。。これだけです。めっちゃ楽。
まとめるとこんな感じで使えます。

fun getMutedColor(bitmap: Bitmap): Int {
    return Palette.from(bitmap).generate().getMutedColor(Color.BLACK)
}

In sample code!

このサンプルコードではUseCase層にPalette API処理の関数を定義しています。

PaletteUseCase
fun getMutedColor(bitmap: Bitmap): Int {
    return Palette.from(bitmap).generate().getMutedColor(Color.BLACK)
}

Paletteの生成処理はコストがかかるので非同期的に取得したいところです。サンプルコードではViewModelからCoroutineスコープで呼び出す関数を定義しています。MVVM + LiveDataで書いているので、statusBarColor(Int型のMutableLiveData)にpostValueしています。

ViewModel
fun fetchStatusBarColor(bitmap: Bitmap) = viewModelScope.launch {
    // UIスレッドをブロックしない形で呼んであげる
    _statusBarColor.postValue(paletteUseCase.getMutedColor(bitmap))
}

FragmentからViewModelの fetchStatusBarColor() を呼び出す部分です。BitmapはリソースIDから取得しています。

Fragment
viewModel.fetchStatusBarColor(BitmapFactory.decodeResource(resources, it.headerResId))

fetchStatusBarColor() で色を抽出すると statusBarColor に変更を通知するので、ObserveしてるFragment側でWindowのステータスバーに getMutedColor() で取得したInt値をセットしているだけです。

Fragment
viewModel.statusBarColor.observe(viewLifecycleOwner, Observer { color ->
    activity?.also {
        // 本質的なのはこの1行だけ!
        it.window.statusBarColor = color
    }
})

以上でこんな感じで動くようになりました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

レジの店員を呼ぶアプリをつくた android cordova ハイブリッドアプリ

成果物

https://play.google.com/store/apps/details?id=com.itsumen.regi&hl=ja

リポジトリ

https://github.com/yuzuru2/regi_apuri_sozai

環境

  • node.js 12.14.0
  • cordova 9.0.0
  • java 1.8.0

※javaとandroidのsdkは各自インスコしてパスを通しておいてください。

コマンド

$ npm i -g cordova
$ cordova create sample com.example.sample sample
$ cd sample
$ cordova platform add android
$ cordova plugin add cordova-plugin-volume-control
$ rm -rf www/*
$ cd www
$ git clone https://github.com/yuzuru2/regi_apuri_sozai.git .
$ cd ..
$ cordova run android
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac上のファイルにAndroidからアクセスするには

Mac上のファイルにAndroidからアクセスしたかった話

ことの発端はHTMLであるページを作っていた時の話。

当然PCでHTMLファイルを記述していたわけだが、そういや公開したらスマホでも見るかもしれないな(というか多分そっちのほうが多いだろう)と思い、(私は手持ちの端末がAndroidなので)ファイル共有して開こうと思った…

が!

私は保守や作成時にわかりやすいよう、ファイル(特にCSS)を大量に分割して記述することが多く、ファイル転送がめんどくさい!
(いや、がんばれ)

ということで、手持ちの環境でファイル共有ができないかと模索してみた。

FTP

無知な私が最初に思いついたのはFTP。スマホのファイルマネージャーに簡単にFTPが作れる物があったからだ。

FTPとは、File Transfer Protocol、ファイル転送プロトコルのこと。
プロトコルっていうのは、Wikiによれば

プロトコルまたはプロトコールとは、複数の者が対象となる事項を確実に実行するための手順について定めたもの。

もともとは「人間同士のやりとり」だけに関する用語であった。戦間期の学術的批判を経て、情報工学分野でマシンやソフトウェア同士のやりとりに関する取り決め(通信規約)を指すためにも用いられるようになった。

ーーWikipedia

ということで、つまりは手順や取り決めと言ったところ。

そこで、無知な私が(2回目)FTPについて調べてみると、基本的にFTPや、その類似であるSFTP、FTPSなどはサーバー、クライアント間でファイル共有をする時に使うもの。

私がやりたいのはスマホからアクセスしたいので、もしかしたら深く調べればできるのかもしれないが、今回は断念。

ケーブル経由

そりゃあもちろんケーブル経由も検討しましたが、それはなんかチガウので却下。

あまり調べてはいないが、ケーブル接続したら自動でファイルの同期処理とかもできるかもなあと思った。

macOSのファイル共有

macにそんな機能ないかななんて、設定で探したら"共有"(Sharing)なんていうおあつらえ向きの設定項目があるじゃないですか。

検索のSS
言語設定が英語で申し訳ない。

これを使ってみよう!としたのだが、ファイル共有(File Sharing)とかの項目はあるのだが、どう考えてもアドレスがandroidからアクセスできるようなものではない…

afb://やsmb://から始まるものであった。

調べてみれば、AFPはApple File Protocolというもので、名前からしてApple独自のものだろう。

SMBはServer Message Blockというものらしく、Windows間でのファイル共有を行うためのものらしい。

…ちっがーう!

Android側を頑張ってみる

mac側で色々調べてみたが、どうにもうまく行かないものなので、Androidをどうにか対応できないか考えてみることにする。

SMB?

これ気になる。
Windows間でのファイル共有ができるのならばAndroidは対応しているのでは…?

という考えに至り、ちょっと探してみたところ、ありました。

私は今までFile Manager HDという、ネットワーク探査などができるファイルマネージャーが使いやすくそれを使っていたのだが、残念ながらSMBには対応していなかった。

そこで見つけたのがCx File Explorer
UIが非常にFMHDに似通っているのでそそくさと乗り換え。

ちょっと使ってみたところ、UXも上々。メモリ1.8GBのスマホでも動いたので良いですねこれ。

さて本題、SMBに接続する準備をしていく。

SMBを使用する準備

まずMac側から。

設定の共有設定項目から、ファイル共有を選択、これをオン。
ファイル共有のSS
続いて、右側、共有フォルダ(Shared Folders)に、必要であれば+ボタンを押してフォルダを追加。

右側、ユーザー(Users)の欄に使うユーザーが追加されているかを確認。
なければ+ボタンを押して追加。
ファイルにアクセスするだけならば読み取りのみ(Read Only)で構わないが、書き込みとかをするのなら読み取りと書き込み(Read & Write)に変えておく。

その後、設定(Options...)のボタンからWindows共有(Windows Sharing)の下の欄にあるユーザー一覧から使用するユーザーのチェックボックスをオンにしておく。

次にAndroid側。

ネットワークを確認して、MacのあるLAN上に接続しているかを確認しておく。

使ってみる

ファイルマネージャーからネットワーク、SMBを選択してアドレスを入力。
アドレスは上の画像(マスクしてあるが)File Sharing:Onの下の説明文のところに
smb://192.168.11.101
のような形で表記してある。

ユーザー名とパスワードも忘れずに匿名のチェックを外して入力し、接続。

うまく行けば、macで設定したフォルダが表示されるはずです。

がっ…ダメ…!

しかし、私の環境ではなぜか一部のフォルダにはアクセスできなくなってしまいました。

なぜ…?と思いましたが、調べても解決せず…

なので泣く泣く他の方法を模索することに

リモートログイン

気になったのは、File Sharingの時に数段下にあったリモートログイン(Remote Login)。

名前からして外部からファイルにアクセスできそう…!

ということで少し調べてみると、どうやらSSH暗号化を使ってアクセスするらしい…

と、ここでピンと!

最初の方に出てきたSFTPを調べていた時、説明の中にSSHという言葉が出てきたような気がしたのです。

物は試し、やってみることにしました。

SFTP-リモートログイン

まずはMacの準備。リモートログインの項目を開いて、使用するユーザーを追加しておく。

リモートログインのSS

次にAndroid側から、ファイルマネージャーのネットワークから同じように追加するのだが、この時、タイプをSFTPにする。

アドレスを入力(リモートログインの下、type "ssh ~~~~~@......"...部分)し、ユーザ名とパスワードを入力して接続。

うまく行けば、ユーザーのホームフォルダに移動するはずだ。ここから辿らなければならないのは面倒ではあるが、SMBを使うよりもSFTPを使ったほうが良いかもしれない。

SFTPの利点

SFTPは常にSSHという方法で暗号化されている。これはSecure SHellの略で、ファイルの閲覧等からパスワードの認証など、通信のすべてが暗号化される。

SSHは共有鍵と公開鍵を使用するハイブリッド暗号化方式で、安全性が高い(…らしい)

これは感覚だが、SMBなんかより断然接続が早かったように感じる。

まとめと補足

  1. FTPは普及率は高いが暗号化が一切されておらず、パスワードなども平文で送信するため盗聴される可能性もある。しっかり調べよう
  2. 今度ケーブル経由での同期方法も作ってみようと思った。
    • 詳細は今度書くかも
  3. MacOSの機能を使って今回は解決することができたが、ちょっと調べただけではダメだね。
    もっとしっかり調べないと。
  4. SMBは対応しているアプリ等が少なく、あまりおすすめできない上に、私の環境ではエラーが頻発。
    なんだコレ。
  5. SSHという文字列から今回の解決方法にたどり着けたのは僥倖。
    やっぱりよく調べておかないと。(何なら普通に調べたらこの方法出てきたけど。)
  6. SFTPはエラーもなく普通に快適に使えた。どうやら対応しているアプリも非常に多かった。
    • File Manager HDも対応していた…
      今更戻す気にもならないが。
  7. セキュリティは大事だね。しっかり調べないと(n回目)。
  8. ついでに速度大事。UX。
    • UXとUIについては論じ始めたら止まらないと思うんだけど僕だけかな
  9. IPは再接続しても変わらないのは初めて知りました
    • いちいち再編集しなくても簡単に再アクセスできますね

今回思ったこと以上9点。

特に深い技術的な内容ではないかもしれないが覚え書きと同じようなことで躓いた人に。
浅い調べ方だったり調べ方違ったりすると出てこないからね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

廣住燎亮は今日からエンジニア #0日目

はじめまして、廣住 燎亮と申します。

現在、東北大学 農学部 に所属している大学4年生です。

2020年2月20日からプログラミング言語【Kotlin】の勉強を始めて、
ついに今日、2020年3月17日にすべてのチュートリアルが終わり、本格的にアプリ開発を始めました。

ぼくには作りたいアプリがあり、
その開発に使える技術を学べるように、いろいろなアプリを少しずつ作っていって、最終的に完成させようと思っています。

「よっしゃ!今日からエンジニアだぜ!!」

とイキっていたのですが、もうね、class とか overrinde とか、マジでわからないっス。

どうしようかと途方に暮れていたのですが、

「あっ、Qiita で質問すればいいんじゃね?」

と気づき、この記事(ポエム)を書いています。

ですので、ぼくの書く記事は断じて役に立つものではなく、なんか初心者がワチャワチャ言ってる、みたいなものです。

はじめに言っておきますが、cardviewrecyclerview ぐらいは分かります。

ただ、xml やら gradle やらが分からない。そのくらいのレベルです。

これから毎日ポエムみたいなものを更新します。

初心者ならではの質問をするとおもうので、まぁ、ヒマなときに読んでください。

よろしくお願いします!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む