[Android] スマホのSDカードパスを取得、機種依存対策

SDカードはAndroidではリムーバブル ストレージとして外部ストレージの一部として規定されています。
ストレージ オプション | Android Developers
 
sdcard path 01 - [Android] スマホのSDカードパスを取得、機種依存対策

 



SDカードのパスを取得

 
このSDカードへのアクセスについては、メジャーアップデート毎に仕様が変更されているのが実情で、Android 2.xからAndroid 9までサポートしたいと言う場合には悲惨なことになります。
 
Android 7.0ではこのような方法で可能なようです。
特定のディレクトリへのアクセス
 
KitkatからNougatまではこの方法でできるようです。
How to get SD_Card path in android6.0 programmatically
 
Android 8.0では

Starting in Android O, the Storage Access Framework allows custom documents providers to create seekable file descriptors for files residing in a remote data source…

Ref: Universal way to write to external SD card on Android
 
Storage Access Framework を使うということでしょうか

以前は外部ストレージのpathはとりあえず
Environment.getExternalStorageDirectory().getPath()
で取得できてはいましたが、API 29からは使えなくなりました。

ストレージの読み書きの方法としては以下のようなやり方があります。

external storage 00 100x100 - [Android] スマホのSDカードパスを取得、機種依存対策
こちらでアプリ内にファイルを保存を試しましたが、共用メモリの外部ストレージに保存することもできます。例えばカメラの画像などのある程度大き...

cat33 00 100x100 - [Android] スマホのSDカードパスを取得、機種依存対策
デフォルトでAndroidにインストールされているギャラリーあるいはフォトには、撮った写真や画像が保存されています。そこから画像を取得す...

cat32 00 100x100 - [Android] スマホのSDカードパスを取得、機種依存対策
写真などの画像が保存されている共有メモリに保存するためにSAF(Storage Access Framework)を利用します。ファイル...

 
 
以下昔のSDカードのやり方など

 
Sdカードへの読み書きのヒストリーは

  • 当初はExternal Storageとして書き込みは通常で可能
  • JELLY_BEAN:これ以下では
    • どこにマウントされているか調べればSDカードの書き込める、端末依存
    • External Storageは内部メモリー領域を指す
  • KitKat: 書き込み完全不可
  • Lollipop: Storage Access FrameWorkにより可能となる

Android 5.0 ではストレージ アクセス フレームワークが拡張されて、再度SDカードのデータ読み書きができるようになりました。

とても厄介なのは、バージョン毎に異なる手法を取らざる得なくなり、正直SDカードで云々というのは避けたいところです。最近ではSDカードスロットが無いものもある

以下古い記事、使うこともあるかもしれませんので

Kitkat以降は完全にSDカードの書き込みは使えない

 
External Storage Technical Information によれば
http://source.android.com/devices/tech/storage/index.html
 
分かりにくい表現が使われていますが、結局こうありますね
Apps must not be allowed to write to secondary external storage devices
このsecondary external storageがSDカードを指しているのでしょう
 
しかし、ダメだと言われるとかえってなんとかしたくなるのが人情
 
http://androplus.kagome-kagome.com/Entry/148/
/etc/permissions/platform.xml を編集すれば使えるとか
ただし、要root なので…
 
こちらは隠しメソッドの getVolumeList() を使うらしいですが
http://qiita.com/aMasatoYui/items/e13664455af45123a66e
 
結局、世の中 Cloud の流れで、SDカードに無理に保存しようというのが
時代遅れなのかとも思います
 

JELLY_BEANでのExternal Storage

 
Androidでは、外部ストレージのパスを取得するために Environment.getExternalStorageDirectory() が用意されている

しかし、ストレージが内部ストレージ(取外不可)と外部ストレージ(取外可能)に別れている場合、

内部ストレージを取得するExternalStorageDirectory といいながら、内部メモリにある、
ユーザーがあたかもSDカードのように自由にアクセスできる領域を指しているだけである
本当の外部にあるストレージ、SDカードのパスを取得する Android API は用意されていない

SDカードのパスを取得するAPIは無い

Google developer: Using the External Storage

In this case, the SD card is not part of the external storage and your app cannot access it (the extra storage is intended only for user-provided media that the system scans).

それでもやはりSDカードの画像データを取り出したい、音楽データがSDにありそれを再生したいというような要望はつきません。何とかできないかと調べてみたら、幾つかトライされているものが、国内外にありました。

Ref: http://inujirushi123.blog.fc2.com/?no=93
システムの設定ファイルから取得する方法です

/system/etc/vold.fstab

システム設定ファイルの中身
#######################
## Regular device mount
##
## Format: dev_mount
## label – Label for the volume
## mount_point – Where the volume will be mounted
## part – Partition # (1 based), or ‘auto’ for first usable partition.
## – List of sysfs paths to source devices
######################

# Mounts the first usable partition of the specified device
dev_mount sdcard /storage/ext_sd auto /devices/platform/msm_sdcc.4/mmc_host
dev_mount usb /storage/usb auto /devices/platform/msm_hsusb_host

「/storage/ext_sd」が、取得するべきSDカードのマウント先(path)
「dev_mount」(機種によっては「fuse_mount」)で始まる行の半角スペース区切りで3番目がpathを示す
というのはどうやら共通の仕様のようだそうです

以下は環境変数での検索
Ref: http://inujirushi123.blog.fc2.com/blog-entry-30.html

Android APIには取得する術がないので環境変数からパスを取得
環境変数を呼び出すには System#getenv(String name) を使用

とても厄介なのは、バージョン毎に異なる手法を取らざる得なくなり、正直SDカードで云々というのは避けたいところです。最近ではSDカードスロットが無いものもある

 
 

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加




アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう、時間の制約がないところが一番の魅力です。

以下の3つはAndroidが学習できるオンラインスクールです。


TECH ACADEMY
Androidアプリコース



侍エンジニア塾
侍エンジニア塾 無料体験レッスン



CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp





正直ネットや本では限界があります。直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。

尚、スクールがダメだと言う人がいますが、やる気があれば問題ありません。与えられるのを待っていてはいけないですね
欲しいものは取りに行くのです。


Google Pixel 3 XLグローバル版
SIMフリー 並行輸入品
6.3インチの大画面
背景をぼかすポートレートモード撮影


Anker PowerCore II Slim 10000
Power IQ 2.0搭載
iPhone & Android対応

シェアする

  • このエントリーをはてなブックマークに追加

フォローする