fc2ブログ

戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
12
13
14
15
16
18
19
20
21
22
23
24
25
26
27
29
31
10

GALAXY SⅢの外部ストレージ

情報提供により GALAXY SⅢ の外部ストレージのパスを入手したので公開。

機種名:GALAXY SⅢ SC-06D
環境変数:SECONDARY_STORAGE
/mnt/extSdCard:/mnt/UsbDriveA:/mnt/UsbDriveB:/mnt/UsbDriveC:/mnt/UsbDriveD:/mnt/UsbDriveE:/mnt/UsbDriveF

サムスンさん、環境変数を変えた上に「:」区切りですか…
(GALAXY Note SC-05D までは EXTERNAL_STORAGE2 だった)

と白目をむきつつ調べていたらこんなのがありました。

我が征くは肥沃な荒野さんのストレージの扱いが混沌の極みの件

知らない外部ストレージの環境変数が一杯!
正規表現使って該当するパスを取得する方法も載っていてとても参考になります!!

HTC みたいに環境変数がないのは別途対応が必要になりますが…。

【関連記事】SDカードのパス取得:Environment と System.getenv


おまけ:
GALAXY S3ではアプリをSDカードに移動できないようです。
価格.com GALAXY S III SC-06D docomo 『アプリをSDに移動できません』のクチコミ掲示板
『GALAXY S IIIはAndroid4.0に準拠して、内部ストレージ全てがアプリケーション領域になる』
なので、アプリをmicroSDカードに移動出来ないようにしてあるらしいです。

容量対策として内部ストレージ搭載の機種が増えたため、ようやく仕様統一に動き出したのでしょうか。

『取り外しのできる』外部ストレージの仕様も早く統一してください…
スポンサーサイト



外部領域(SDカード)への保存とアンインストール

Androidのデータ保存で外部領域(SDカード)にデータを保存するときの注意事項。

ソフトウェア技術ドキュメントを勝手に翻訳
Android 開発ガイド - フレームワークトピック - 8. データ保存 外部保存域の使用

Android 2.2 (API 8) 以降、Context#getExternalFilesDir() が追加され、アプリに属する外部領域のディレクトリパスが取得できるようになりました。
このディレクトリに保存されたファイルは、アプリのアンインストール時にすべて削除されます。
※ Android 2.1 (API 7)以下は消えません。

アンインストール時に削除されるファイルは /mnt/sdcard/Android/data/[パッケージ名]/ 以下で、
Context#getExternalFilesDir() で取得されるディレクトリパスは /mnt/sdcard/Android/data/[パッケージ名]/files になります。
※ デバイスによって保存場所が変わりますが基本はこのパスになります。


ここで注意することは『SDカードのパス取得:Environment と System.getenv』で書いたように、SDカードが内部と外部の両方に搭載されているデバイスの場合です。
内部と外部に別れている場合、外部(ユーザーが挿し入れする方)のパスはメーカー依存になっています。

アンインストールで削除されるファイルは /mnt/sdcard/Android/data/[パッケージ名]/ 以下となるため、外部SDカードは対象外になります。
※ HTC J ISW13HTで /mnt/sdcard/ext_sd/Android/data/[パッケージ名]/files/ を作成して試しました。

アプリのアンインストール後にファイルが残らないよう、起動に必要なファイルは Context#getExternalFilesDir() に保存するようにしましょう。
ただし、ユーザーが作成したデータ(写真など)は消えないところがいいかもですね。ものによりますが。

---------------------------------------------------------------------------------
au Market で入手したゲームアプリをアンインストールしたときに
計 300M バイト以上もあるファイルが /mnt/sdcard/[メーカー名]/ に残っていたので記事にしてみました。

Android 2.1(API 7)以下に合わせたのかも知れないが削除されるようにしてほしかった…。

ListView の指定位置をスクリーン上端に表示する

ListView で指定した位置をスクリーンの上端に表示させる方法。

ListView#setSelection(int position)
ListView#setSelectionFromTop(int position, int y)

position は先頭に表示したい行のインデックス。
y は指定したピクセル分、下にずらします。

ListView#setSelection(position) は内部で ListView#setSelectionFromTop(position, 0) を呼んでいるだけです。

ListView を再生成するときに元の位置を保持するには以下のように使います。
// リストビューを取得する
ListView listView = (ListView) findViewById(R.id.listView);

// 現在のスクリーン上端に表示されているインデックスを取得する
int position = listView.getFirstVisiblePosition();

// アイテムの位置を取得する
int y = 0;
if (listView.getChildCount() > 0) {
y = listView.getChildAt(0).getTop();
}

// 表示位置を設定する
listView.setSelectionFromTop(position, y);

SQLiteDatabase 備忘録

SQLiteDatabase#close() は呼ぶ必要がない
finalize (破棄時)で close してくれる。
SQLiteOpenHelper#close も同じため不要。

ただし Cursor は close すること
close しないと破棄されたときに Logcat にエラーログが出力される。

【参考サイト】一歩ずつコツコツと - SQLiteを使う場合の注意点
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始