20200114のAndroidに関する記事は6件です。

【Unity】 角速度(ジャイロ)センサーの使い方

注意

スマホから取得する方法になります。PC本体のセンサー情報を取得にはこの方法だと無理です。

UnityリファレンスのURL

リファレンスを読めば分かる人はコチラ
- https://docs.unity3d.com/ja/2019.3/ScriptReference/Gyroscope-rotationRate.html
- https://docs.unity3d.com/ja/2019.3/ScriptReference/Gyroscope-rotationRateUnbiased.html



以降は私の記事から情報を得る人向けです(忘れやすい私でも分かるように書いています)

1. 角速度の取得方法(Part1)

最初にジャイロセンサーを有効化します

// Start is called before the first frame update
void Start()
{
  Input.gyro.enabled = true;
}



有効化後に角速度を取得します - 単位 : Rad/Sec
(念のためロール・ピッチ・ヨー方向が合っているかは実機で確認した方が良いです。)

private void UpdateGyroData()
{
  double pitch = Input.gyro.rotationRate.x;
  double yaw = Input.gyro.rotationRate.y;
  double roll = Input.gyro.rotationRate.z;
}

rotationRateは角速度センサーから取得した生のデータです。
なぜ説明しているのかを理解したい方はPart2を読みましょう。

2. 角速度の取得方法(Part2)

Part2ではrotationRateUnbiasedを説明します。
より正確な値を取得する人向けに使用が推奨されます。
rotationRateで取得すると自動車がドリフトしている時の値が正しくないケースがあります。
ドリフト時の様に誤差が生まれやすい環境で使用する場合に使用が推奨されています。
(ハードウエアがそれらを考慮した設計をされていればrotationRateで取得しても問題ありません)



最初にジャイロセンサーを有効化します

// Start is called before the first frame update
void Start()
{
  Input.gyro.enabled = true;
}



有効化後に角速度を取得します - 単位 : rad/sec

private void UpdateGyroData()
{
  double pitch = Input.gyro.rotationRateUnbiased.x;
  double yaw = Input.gyro.rotationRateUnbiased.y;
  double roll = Input.gyro.rotationRateUnbiased.z;
}

3. Rad/Sec から Deg/Sec に変換する

ラジアンより度の方が一般的なので変換する事が多いと思います。
メモ程度で記載します。参考になる資料は[参考]欄に記載しておきます。

private void UpdateGyroData()
{
  double pitch = (Input.gyro.rotationRate.x * 180) / Mathf.PI;
  double yaw = (Input.gyro.rotationRate.y * 180) / Mathf.PI;
  double roll = (Input.gyro.rotationRate.z * 180) / Mathf.PI;
}



Unityの関数を使用して変換する事も出来ます。
今回はdouble型ですがfloat型の時に使用するといいと思います。

private void UpdateGyroData()
{
  double pitch = Input.gyro.rotationRate.x * Mathf.Rad2Deg;
  double yaw = Input.gyro.rotationRate.y * Mathf.Rad2Deg;
  double roll = Input.gyro.rotationRate.z * Mathf.Rad2Deg;
}


もっといい方法(アドバイス)や感想があったらコメントしてください。
おいしいと思うお店の情報もお待ちしております。

[参考]
Unity専用関数を使用: https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Rad2Deg.html
ラジアンと度の概念 : https://juken-mikata.net/how-to/mathematics/radian.html

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

手動で Flutter Android アプリに hot reload 命令を送るメモ(2020 年 1 月 14 日時点)

背景

Termux + Flutter + dart ffi で .so リロード対応し Android C/C++ + GUI アプリ開発を効率化するメモ
https://qiita.com/syoyo/items/21ba3174fe5a668f2960

などで, 特定のファイルで変更があったときに Flutter に hot reload 命令を送りたい.
(VSCode では, .dart ファイルが変更されたときだけ reload)

方法

flutter run --machine

で Flutter アプリを起動します.
これにより, stdin/stdout で JSON-RPC で通信できます.

https://github.com/flutter/flutter/blob/master/packages/flutter_tools/doc/daemon.md

appId は event message(stdout への出力)で取得できます.

[{"method":"app.restart", "id": 0, "params" : { "appId" : "e0c12cae-e4f3-47a9-8447-2b250bcc4af9", "fullRestart": true}}]

というメッセージを stdin(or /proc/<pid>/fd/0)に書き込むと hot reload できるはずです.

id は JSON-RPC の id なので, 任意の番号を指定します.

赤い画面になったら再度 flutter run が必要

赤い画面の致命的なエラーがでたら, app.restart 命令は fullRestart を true にしてもアプリは再起動しません. 再度 flutter run --machine する必要があります.

flutter attach は使えない

たとえば VSCode で実行しておいて, 外部プログラムでリロードの命令を送りたいですよね.

しかし, flutter attach では, app.restart 命令が使えません. JSON-RPC で命令を送ると NoSuchMethodError が帰ってきます.

したがって, flutter run する以外に方法がありません.

VSCode と連携したいが...

VSCode の dart extension では, pid や appId を出してくれません.
pid と appId がわかれば, 外部から /proc/<pid>/fd/0 で命令を送れるはずですが... なんらかのオプションで情報だしてくれるかもですが, ソースコードの改変が必要になるかもです.

現状使いにくい...

flutter run では, stdin/stdout で入力と出力を受け付けます. http などはないっぽそうです.
(--overvatory-port は, デバッグやプロファイリング用で, app.restart メソッドは使えない)

python などスクリプトを使って, popen などと組み合わせないとめんどいです.
(Linux/macOS だったら socat でソケットと stdin/stdout を繋ぐというてもあるかも?)

いずれにせよ処理を自動化するには stdout をパースしたりとめんどいで, 使いにくいです.

なんとか VSCode と連携したい...

ファイル変更があったときに vscode のコマンドを実行できる

https://github.com/BouKiCHi/vscode-watch-run

あたりと連携するか, VSCode Dart extension を拡張することになるでしょうか...

dart.previewHotReloadOnSaveWatcher

何かしらダミーの .dart ファイルを作っておき, Dart flutter extension v3.7.0 以降で dart.previewHotReloadOnSaveWatcher を true にする方法が考えられます.

https://github.com/Dart-Code/Dart-Code/issues/2074

このフラッグが true ですと, (VSCode の?)file watcher で変更を検知しますので, VSCode の外で .dart ファイルを編集した場合でも hot reload が実行されます! :tada: :tada:
(2019 年 11 月 15 日とフラッグ追加は最近ですね)

最近の VSCode ですと File -> Preferences -> Setting -> Extensions で Dart: Preview Hot Reload On Save Watcher に GUI でチェックをいれるだけなので楽ですね.

参考

VSCode dart extension(Flutter の機能は dart plugin に入っていて, Flutter repo は実質空です).

https://github.com/Dart-Code/Dart-Code

TODO

  • VSCode dart extension を改造して, pid, appId を抜き出したり, 特定のフォルダ or file の watch ができるようにする.
    • .so など, 非 .dart ファイルが変更されたときは, カスタムの shell コマンドを実行できるようにする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Android] MySQLに接続する(未完)

JDBCダウンロード

AndroidからDBに直接接続できないので、JDBCドライバが必要になる。
MySQLインストール時にしなかった方は、こちらのConnecter/Jというリンクからダウンロード・インストールできる。
https://dev.mysql.com/downloads/

C:\Program Files (x86)\MySQL\Connector J 8.0の階層にmysql-connector-java-8.0.18.jarがあるので、これをビルドパスに追加する。

ビルドパス設定

jarファイルをapp/libsの下に追加。
さらにbuild.gradleに以下を追加。

dependencies {
    compile files('libs/mysql-connector-java-8.0.18.jar)
}

その後、おそらく同期ボタンが出てくるので同期する。

・参考URL
https://qiita.com/icchi_h/items/8ce738ce8511ef69c799

パーミッション

ネットワークを使うのでパーミッションが必要。以下を追加。

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

MySQLへの接続プログラム

MainActivity.java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            //データベースに接続
            Connection con = MySqlConnect.getConnection();
            //ステートメントオブジェクトを作成
            Statement stmt = (Statement) con.createStatement();

            //SQL
            String mySql = "select date from table;";
            ResultSet rs = stmt.executeQuery(mySql);

            while(rs.next()) {
                Toast.makeText(getApplicationContext(), rs.getString("date"), Toast.LENGTH_LONG).show();
            }

            //オブジェクトを解放
            rs.close();
            stmt.close();
            con.close();

        } catch (Exception e) {
        }

MySqlConnect.java

class MySqlConnect{
  static Connection getConnection() throws Exception {
    //JDBCドライバのロード
    Class.forName("com.mysql.jdbc.Driver");
    //各設定
    String url = "jdbc:mysql://ホスト名/db名";
    String user = "user_name";
    String pass = "password";
    //データベースに接続
    Connection con = DriverManager.getConnection(url,user,pass);
    return con;
  }
}

・参考URL
https://qiita.com/ks_513/items/0b286c4932a8e36c672e

困ったところ

現在以下のエラーが発生しており、未完状態である。
ClassLoader referenced unknown path
java.lang.UnsupportedOperationException

ビルドパスの設定、gradleファイルの見直しなど試してみたが突破できなかった。

感想

簡単にできると思っていたが、意外と時間がかかる。
様々なサイトを見たが、非同期処理についてはほとんど書かれていなかったので関係ないとみている。
しかしhttps://qiita.com/ks_513/items/0b286c4932a8e36c672e
の一番下に非同期処理したほうが良いといった旨の記述がされているので、試す価値はありそうだ。

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

TextViewのテキストに下線を引くExtension

よく忘れるのでメモ。個人的にはハイパーリンクっぽい表現をしたいとき以外に使ったことはないです。
SpannableStringを使います。

fun TextView.drawUnderline() {
  text = SpannableString(text).apply {
    setSpan(UnderlineSpan(), 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
  }
}

※2020/1/15 追記
HtmlCompatを使った方が楽そう。

fun TextView.drawUnderline() {
  text = HtmlCompat.fromHtml("<u>$text</u>", HtmlCompat.FROM_HTML_MODE_COMPACT)
}

参考

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

Daggerの依存関係を視覚化してくれるプラグインScabbardを試してみる

はじめに

2019年12月に公開されたばかりのScabbardというプラグインを試してみたのでやり方を投稿します。

Scabbardとは?

Daggerの依存関係を画像化して表示してくれるというプラグインです。

公式より:
temp-cheat-sheat.png

Missing Binding箇所も表示してくれる
missing-binding.png

導入

Getting Startedを見ながら導入していきます。
環境は以下になります。

Mac OS 10.15.2 (Catalina)
Android Studio 3.5.3

リポジトリはDagger2+Retrofit2(+OkHttp3)+ViewModelのDIの最小構成[その1]のリポジトリを使用します。

1. GraphVizをbrew installする

GraphVizというソフトが必須のようなのでターミナルからインストールします。

brew install graphviz

Homebrewのインストール方法は割愛します。
Linux、Windowsの場合のインストール方法はこちらを参照してください。

2. build.gradleを設定する

プロジェクト単位のbuild.gradleに以下を追加します。

build.gradle
buildscript {
    repositories {
        ...
        maven {
            url "https://plugins.gradle.org/m2/" // 追加
        }
    }
    dependencies {
        ...
        classpath "gradle.plugin.dev.arunkumar:scabbard-gradle-plugin:0.1.0" // 追加
    }
}

また、モジュール単位のbuild.gradleに apply: pluginを追加し、DataBindingのようにenabled trueを記述します。

build.gradle
apply plugin: "scabbard.gradle"
...
scabbard {
    enabled true
}

ここまででビルド時にDaggerコンポーネントの依存関係を図示したpngファイルを生成してくれるようになります。

格納先は{project_root}/app/build/tmp/kapt3/classes...以下です。

スクリーンショット 2020-01-14 11.14.14.png

3. IDEにプラグインをインストールする

IDE上に短剣アイコンを表示させるためにプラグインをインストールします。
スクリーンショット_2020-01-14_10_48_52のコピー.png

このアイコンをクリックすると2. で生成したpngをIDE上で表示してくれるようになります。

Android Studio > Preferences... > Plugins > MarketPlace
にて、「Scabbard」を検索します。
スクリーンショット 2020-01-14 10.46.13.png

「Install」を選択してプラグインをインストールします。
スクリーンショット 2020-01-14 10.46.41.png

Restart IDEと表示されるのでIDEを再起動します。

プロジェクトをビルドし、AppComponent.ktを表示すると、インターフェースの横に短剣アイコンが追加されているのが分かります。

スクリーンショット 2020-01-14 10.57.14.png

短剣アイコンをクリックすると、以下のように依存関係を表示してくれます。
スクリーンショット 2020-01-14 10.50.56.png

以上で完了です!

おわりに

Daggerの依存関係を記述をミスって「Missing Binding」エラーが表示されると、どこで間違えているか追うのが大変ですが、このプラグインを使うと依存関係が視覚化されるので解決しやすくなるかなと思いました。

まだv0.1.0との事なので、今後の更新にも期待です。

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

【Android Studio】NDKデバッグ変数表示のHEX化

アプリではHEX表示出来てNDKでは出来ない・・・。んな訳ない!


でも、ググっても出てこない・・・
(しかたなく) Google Issue Trackerで問い合わせ!
⇒ 無事解決できた!というお話。


Googleからの回答

This is something we inherit from CLion. You can turn on hex view following this instruction:
https://www.jetbrains.com/help/clion/using-hexadecimal-view.html

⇒ CLionベースなので、こんな感じで設定変更したらHEX表示できるよ!との回答。


Enable hexadecimal view (少しアレンジ)


1.
In Find Action dialog (Shift+Ctrl+A on Linux/Windows, ⇧⌘A on macOS) type Registry; open Registry, type cidr.debugger.value.numberFormatting.hex (or just hex) to search for the setting and turn it on.
MaintenancePopup.png


RegistryPopup.png


2.
Go to Settings / Preferences | Build, Execution, Deployment | Debugger | Data Views | C/C++ and set the checkbox Show hex values for numbers. Choose to have hexadecimal values displayed instead or alongside the original values:


設定前
DecView.png


設定後(やった!)
HexView.png


まとめ

Currently, this feature is experimental. 的な事もあるので、開発元への問い合わせ。大事。


以上

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