Android
[Android] アプリのデータ保存先
まず、Androidのストレージをちょっと、整理してみる。
Androidのストレージは、APIから見ると、内蔵ストレージ、外部ストレージがある。
古い端末や開発で使うAndroidエミュレータでは、内蔵ストレージは、内蔵ストレージ。外部ストレージはSDカードとなっている。
Nexus7などの内蔵ストレージが大きい端末では、外部ストレージに内蔵ストレージも割り当てられているものがあり(ほとんどがそうなのかな?)、さらにSDカードスロットがあるものもあり、SDカードが外部ストレージの一部に割り当てられたりする。で、厄介なのが、外部ストレージがSDカードかそうでないのか、SDカードのマウント先を知るAPIがなかったりする・・・(/system/etc/vold.fstabを開いてごにょごにょするとわかるらしいが)
あと、Android5.0(APIレベル21)以降では、Environment.isExternalStorageEmulated(path)で外部ストレージがエミュレート(内部ストレージが割り当てられている)かどうかが確認できる。
タイトルの本題に入る。アプリケーションのデータの保存先は、基本的に内蔵ストレージのアプリ用のフォルダに保存することになる。外部ストレージだと、取り出されたり、そもそもなかったりするので保存先としてはむいていないような気がする。あと、ここに保存されたファイルは他アプリからアクセスできなくなっている。
Context.getFilesDir()
アプリで永続的に残すデータの保存に使う。アプリのアンインストールとともに削除される。
Context.getCacheDir()
名前の通り、キャッシュデータを保存するのに使う。ここに保存されたファイルはストレージの空き容量が少なくなると、OSによって勝手に削除されるようなのでその辺も注意しないといけない。アプリのアンインストールとともに削除される。
次に外部ストレージのアプリケーションのデータの保存先は次のようにして取得する。ここに保存されたファイルは、内蔵ストレージと違い他アプリからアクセスできるので注意が必要だ。
Context.getExternalFilesDirs()(Android4.4:APIレベル19〜)
Context.getExternalCacheDirs()(Android4.4:APIレベル19〜)
内蔵ストレージと同様の外部ストレージでのディレクトリの配列を返す。配列になっているのは、外部ストレージが複数あればそれらを配列で返す。外部ストレージに内蔵ストレージが割り当てられいてかつSDカードスロットにSDカードが刺さっている場合などだ。(確認していないが、USBストレージを繋いでる場合も含まれるのかも?)Android4.4以前は、サポートライブラリの次のやつを使う。
ContextCompat.getExternalFilesDirs()(Android1.6:APIレベル4〜)
ContextCompat.getExternalCacheDirs()(Android1.6:APIレベル4〜)
外部ストレージは、取り外せる場合があるのでEnvironment.getExternalStorageState()(Android5.0:APIレベル21〜)でマウントされているか調べる必要がある。
今まであげたのは、アプリごとに用意されているディレクトリだ。Wordみたいなファイルを扱うアプリケーションは、ストレージアクセスフレームワーク(SAF)(Android4.4:APIレベル19〜)のピッカーを使って行う。SAFのピッカーはWindowsのファイル選択ダイアログみたいなもので、ユーザにファイルを選択したり、ファイル名を入力してもらったりするものである。
(追記)
Android4.3以前について。(なのでタイトルを変更)
ContextCompat.getExternalFilesDirs()やContextCompat.getExternalCacheDirs()で得た場所にファイルを書いたりするには、AndroidManifest.xmlにpermissionを設定しとかないといけない。
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
[Java,Android] CPUコア数の取得
別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。
JavaでCPUコア数の取得方法って、
意外となかなか見つけれなかったのでメモっとく。
int core = Runtime.getRuntime().availableProcessors();
で、論理コア数が取れる。
Androidだと、SDKの説明によると
4.2以上は最大コア数で、
それ以前は、オンラインになっているコア数。つまり、省電力モードや熱などで動作コア数が変化する場合はそのコア数になるようです。
Androidでノイズ除去作ってみたが・・・(2)
別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。
NDKでメディアン部分をCで作ってみた。
Nexus7(2012)で測ってみた結果がこんな感じ。
001.jpg:1.2672秒
002.jpg:1.2042秒
003.jpg:1.1373秒
004.jpg:1.1525秒
005.jpg:1.1444秒
006.jpg:1.1462999999999999秒
007.jpg:1.1276秒
008.jpg:1.1260999999999999秒
009.jpg:1.1236000000000002秒
010.jpg:1.1218秒
Javaが6.5秒ぐらいだったんで、むっちゃ速い!てか、Dalvik遅すぎ。
Androidでノイズ除去作ってみたが・・・(1)
別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。
リンク: Java8でノイズ除去作ってみたが・・・: ときどき日記4.0.
Androidでも作ってみた。
MedianTestAndroid2.zipappcompat_v7関係で開くとエラーになるけど、これってどうしたらいいんだろー
(追記 21:58) すでにappcompat_v7がworkspaceに作られている状態だと、たぶんエラーにならなくなった。
Nexus7(2012)で測定してみた結果がこんな感じ。
001.jpg:6.9938秒
002.jpg:6.2264秒
003.jpg:6.51秒
004.jpg:6.6198秒
005.jpg:6.6396秒
006.jpg:6.617400000000001秒
007.jpg:6.6432秒
008.jpg:6.624秒
009.jpg:6.5998秒
010.jpg:6.566秒