Kotlin で static なメンバーをどう書くべきなのか?

092: Learning Kotlin – dealing with static-ness and (companion) objects costs – Fragmented

「companion object」だな. と思いながらとりあえず書く.


class Foo {
    companion object {
        val myVar = "testing"
    }
}

これを Kotlin から呼ぶ場合は,


Foo.myVar

ですが, Java から呼ぶ場合は,


Foo.Companion.getMyVar();

となり クソですね.

では, Jvm アノテーション を使います.


class Foo {
    companion object {
        @JvmField val myVar = "testing"
    }
}

この場合は Kotlin/Java それぞれ同じように呼べます.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

なるべく入れたくないですよね Jvm なアノテーション.

const キーワード を使う


class Foo {
    companion object {
        const val myVar = "testing"
    }
}

以下, 共に問題ありません.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

同様に, パッケージレベルでは,


class BottomSheetView {
    companion object {
        const val BOTTOM_SHEET_ANIMATION_TIMING = 500L
    }

    // ...
}


animation.setTiming(BottomSheetView.BOTTOM_SHEET_ANIMATION_TIMING)

Companion object is initialized from the static constructor of the containing class and plain object is initialized lazily on the first access to that object.

こんなかんじでしっくりくる記述って見つけにくい気がしません? Kotlin て.

“Static constants” in Kotlin | Kotlin Blog


Amazon Fire HD 8 の「ドキュメント」

Fire HD 8 にデフォルトでインストールされているアプリ「ドキュメント」.

パッケージ名は com.amazon.zico .

いわゆる「ファイルマネージャ」アプリです.

電子書籍を中心としたドキュメント系のファイルを操作するためにつくられたAmazon製のアプリです.

起動すると以下3つのタブが表示されます.

それぞれ見ていきます.

SEND-TO-KINDLEストレージ

以下サービスを利用して端末に送信したファイルを参照できます.

Amazon.co.jp ヘルプ: Kindleパーソナル・ドキュメントサービス

Amazon.co.jp ヘルプ: Send-to-Kindle Eメールアドレスの使い方について

私, なぜか送信できません. 無反応です. 謎です.

もしかして, 許可する送信元アドレスが gmail ではダメだったりする?

CLOUD DRIVE

以下のクラウドストレージにパソコンなどからアップロードしたファイルが自動的に同期されます.

Amazon Drive

ローカルストレージ

文字通りローカルの保存場所です.

Android が持っている内部ストレージ のディレクトリを参照していくことができます.

Androidでいうファイルマネージャアプリのようにディレクトリをタップするとそれを開きファイルをタップするとそれに対応したアプリで開こうとします.

なのでここで確認できる(端末内で保存している)ファイルが mobi または pdf 形式のファイルの場合は Kindle アプリが起動して電子書籍を読むことができます.

対応するアプリがインストールされていなければ epub 形式のファイルは読めません.

「Kindle Fire HD 8」の対応ファイルとインテントフィルター

以下の形式のファイルが対応(推奨?) されているようです.

Kindle Fireドライブを開き、内部ストレージフォルダを開きます。
コンピュータにコンテンツをダウンロードしたフォルダから、端末の該当フォルダにドラッグします。
Books: AZW(.azw3), MOBI(non-DRM), KF8
Documents: TXT, PDF, PRC, DOC, DOCX
Music: MP3, non-DRM AAC (.m4a), MIDI, PCM/WAVE, OGG, WAV
Pictures: JPEG, GIF, PNG, BMP
Movies: MP4, 3GP, VP8 (.webm)

Amazon.co.jp ヘルプ: コンピュータからKindle Fireへコンテンツを転送する

Amazon.co.jp ヘルプ: USB経由でFireタブレットまたはKindle端末にパーソナル・ドキュメントを転送する

画面左から表示されるメニューのそれぞれにSDカード以下各ディレクトリが対応しているようです.


shell@douglas:/sdcard $ ls -d */
Alarms/
Android/
Books/
DCIM/
Documents/ <-- ドキュメント
Download/  <-- ダウンロード (この下に 添付ファイル)
Movies/
Music/
Notifications/
Pictures/
Podcasts/
Ringtones/
kindle/

おまけ

以下からAmazon公式にWEB版リーダーも公開されています.

Kindle Cloud Reader

(つづく)


「Kindle Fire HD 8」の対応ファイルとインテントフィルター

「電子書籍」とひとことにいっても, 実は, ファイル形式やリーダー端末やアプリなど利用方法をさまざま.

Fire HD を買ってみたのですがそんな調査と使い方を少し探ってみようと.

いうても, Android 5.1 だろよ, とな.

インテントフィルター

デフォルトでインストールされている 電子書籍リーダーとしての Kindle アプリ.

AndroidManifest を見てみると以下抜粋.


...
<activity
    android:theme="@2131624707"
    android:label="@2131230864"
    android:icon="@2130839461"
    android:name="com.amazon.kindle.TabletStartActivity"
    android:launchMode="singleInstance"
    android:configChanges="orientation|screenLayout|screenSize">
    <meta-data
        android:name="restriction_filter"
        android:resource="@2131296307"/>

    <intent-filter>
        <action
            android:name="android.intent.action.MAIN"/>
        <category
            android:name="android.intent.category.LAUNCHER"/>
        <category
            android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

    <intent-filter>
        <action
            android:name="android.intent.action.VIEW"/>
        <category
            android:name="android.intent.category.DEFAULT"/>
        <category
            android:name="android.intent.category.BROWSABLE"/>
        <data
            android:scheme="kindle"/>
    </intent-filter>

    <intent-filter>
        <action
            android:name="android.intent.action.VIEW"/>
        <category
            android:name="android.intent.category.DEFAULT"/>
        <category
            android:name="android.intent.category.BROWSABLE"/>
        <data
            android:mimeType="application/x-mobipocket-ebook"
            android:scheme="file"/>
    </intent-filter>

    <intent-filter>
        <action
            android:name="android.intent.action.VIEW"/>
        <category
            android:name="android.intent.category.DEFAULT"/>
        <category
            android:name="android.intent.category.BROWSABLE"/>
        <data
         android:mimeType="application/x-mobi8-ebook"
         android:scheme="file"/>
   </intent-filter>

   <intent-filter>
      <action
         android:name="android.intent.action.VIEW"/>
      <category
         android:name="android.intent.category.DEFAULT"/>
      <category
         android:name="android.intent.category.BROWSABLE"/>
      <data
         android:mimeType="application/pdf"
         android:scheme="file"/>
   </intent-filter>

   <intent-filter>
      <action
         android:name="android.intent.action.VIEW"/>
      <category
         android:name="android.intent.category.DEFAULT"/>
      <category
         android:name="android.intent.category.BROWSABLE"/>
      <data
         android:mimeType="application/pdf"
         android:scheme="content"/>
   </intent-filter>

   <intent-filter>
      <action
         android:name="android.intent.action.VIEW"/>
      <category
         android:name="android.intent.category.DEFAULT"/>
      <category
         android:name="android.intent.category.BROWSABLE"/>
      <data
         android:scheme="file"
         android:host="*"
         android:pathPattern=".*pdf"/>
   </intent-filter>

</activity>
...

レガシーなスタイルの file スキーマからしか mobi ファイルは読みません.
pdfファイルに関しては content スキーマから読むことができます.

よって, 外部ファイルに対して kindle アプリをリーダーとして使うためには以下のファイル形式と配置が必要になります.

- pdf ファイル
- デバイスローカルに配置した mobi ファイル

epub 形式は直接は開けません.

意外と使えないようですがさらに調べていきます.

(→ つづく)


「Google Play Protect」を実際に確認するまでの道のり

Google、新セキュリティサービス「Google Playプロテクト」の提供開始 - iPhone Mania

Android標準の包括的なセキュリティーサービス「Google Play プロテクト」が提供開始!特に操作することなく、自動でウイルスなどをスキャンして削除などの対策をしてくれる - S-MAX

- 2017年7月19日より提供開始
- Google Play サービス 11 以降が必要
- ストア以外のアプリも対象として24時間自動的にスキャンする

今まではどれを使ったらいいのか, 有料版を購入すべきかなど悩んでいた「ウィルススキャンアプリ」ももう不要となるのでしょうか.

まずは, Play サービスのバージョンを確認しておきます.

ややこしいのがスキャン結果の確認方法がいくつかあったりします.

端末の Google Play ストア アプリ を開きます。
メニュー アイコン Menu icon > Play プロテクト アイコン をタップします。

Android – Google Play プロテクト

この位置には「play プロテクトアイコン」がみつかりませんでした.

なので別の方法で.

設定の「Google」→「セキュリティ」内に「Google Play Protect」(日本語環境なら「Google Play プロテクト」)という項目ができます(機種によっては「アプリの確認」などと名称が違うとのこと)。

Android 7.x(開発コード名:Nougat)以降のGalaxyシリーズでは「設定」→「Google」→「セキュリティ」から

Android標準の包括的なセキュリティーサービス「Google Play プロテクト」が提供開始!特に操作することなく、自動でウイルスなどをスキャンして削除などの対策をしてくれる

設定アイコン選択後から適当に進もうとすると迷います.

やっとありました.

アプリを100個くらいいれていましたが現状は問題ないようでした.

追記 2017-09-12: Playストアで表示されるようになっている!

現在 バージョン 8.1.73 で左メニューから簡単に利用できるようになってます.

一度, インストールしている全アプリを更新してみたらいいかもしれませんっ.

→ Android 8.0 Oreo「Picture in Picture」を実際に確認する


【Bluetooth】遠隔操作で写真が撮れる39円ボタン

こんなのあるんですね.



BTで端末とペアリングすれば

ボタンが2つだけの仮想キーボードとして稼働します.


override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
  println("$event")
  return super.dispatchKeyEvent(event)
}


I/System.out: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_VOLUME_UP, scanCode=115, metaState=0, flags=0x8, repeatCount=0, eventTime=205335386, downTime=205335386, deviceId=9, source=0x101 }
I/System.out: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_VOLUME_UP, scanCode=115, metaState=0, flags=0x8, repeatCount=0, eventTime=205335591, downTime=205335386, deviceId=9, source=0x101 }

I/System.out: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=205340874, downTime=205340874, deviceId=9, source=0x101 }
I/System.out: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=205341051, downTime=205340874, deviceId=9, source=0x101 }

よって, 音量UPボタンとエンターボタンの2つの操作を数メートル離れたとこから操作できます.

一方, カメラアプリでは, 音量ボタンでシャッターを切ることができます.

そういうことで自撮りなどに楽しく利用できます.

ちなみに電池は「CR2032 3V」が入ってました.


10個 CR2032 ボタン電池 3v リチウムコイン電池

👉 Amazon Dash Button ってどうなってたっけ? hatena-bookmark