Android 總結外(wài)置 內(nèi)置SD卡路(lù)徑問(wèn)題 我們先來(lái)看(kàn)下(xià)android5.1 init.rc中 mkdir /mnt/shell/emulated 0700 shell shell mkdir /storage/emulated 0555 root root mkdir /storage/sdcard1 0000 system system mkdir /storage/usbotg 0700 system system mkdir /mnt/media_rw/usbotg 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw export EXTERNAL_STORAGE /storage/emulated/legacy export PRIMARY_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 export EMULATED_STORAGE_SOURCE /mnt/shell/emulated export EMULATED_STORAGE_TARGET /storage/emulated # Support legacy paths symlink /storage/emulated/legacy /sdcard symlink /storage/emulated/legacy /mnt/sdcard symlink /mnt/shell/emulated/0 /storage/emulated/legacy symlink /storage/emulated/legacy /storage/sdcard0 下(xià)面這(zhè)段是fuse功能,将storage/sdcard1 轉到/mnt/media_rw/sdcard1 并且擁有(yǒu)權限 # virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated class late_start chown system system /data/etc/storage.config # fusewrapped external sdcard daemon running as media_rw (1023) service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start service fuse_usbotg /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/usbotg /storage/usbotg class late_start 再來(lái)看(kàn)Environment.getExternalStorageDirectory其實這(zhè)個(gè)獲得的(de)內(nèi)部SD卡的(de)路(lù)徑,隻是Android把它理(lǐ)解成了外(wài)部存儲。 它的(de)路(lù)徑就是storage/sdcard0,進入目錄看(kàn),群組的(de)權限是都(dōu)有(yǒu)的(de)。它的(de)群組是sdcard_r。在APK中,加入相(xiàng)關權限會加入這(zhè)個(gè)群組。也就擁有(yǒu)這(zhè)些文(wén)件(jiàn)夾的(de)讀寫權限了。 drwxrwx--- root sdcard_r 1980-01-01 08:06 Alarms drwxrwx--x root sdcard_r 2015-10-20 15:40 Android drwxrwx--- root sdcard_r 2015-12-03 10:17 Camera360 drwxrwx--- root sdcard_r 2015-11-16 17:24 DCIM drwxrwx--- root sdcard_r 2015-10-29 13:48 Download drwxrwx--- root sdcard_r 2015-10-19 17:08 Movies drwxrwx--- root sdcard_r 2015-10-21 18:55 Music drwxrwx--- root sdcard_r 1980-01-01 08:06 Notifications drwxrwx--- root sdcard_r 2015-11-25 13:49 Pictures drwxrwx--- root sdcard_r 1980-01-01 08:06 Podcasts drwxrwx--- root sdcard_r 1980-01-01 08:06 Ringtones drwxrwx--- root sdcard_r 2015-12-03 11:21 baidu drwxrwx--- root sdcard_r 1980-01-01 08:00 elog drwxrwx--- root sdcard_r 2015-12-03 10:51 libs drwxrwx--- root sdcard_r 2015-12-03 11:21 soufun drwxrwx--- root sdcard_r 2015-12-03 10:17 system 上(shàng)面是Android原生(shēng)的(de),我們公司也是這(zhè)個(gè)方式。 但(dàn)是我試了華為(wèi)p8,就不是了。它在設置裏面有(yǒu)一個(gè)默認存儲,當你(nǐ)設置外(wài)部SD卡後,這(zhè)個(gè)接口得到的(de)是外(wài)部SD卡的(de)路(lù)徑。 華為(wèi)這(zhè)個(gè)路(lù)徑是storage/sdcard1,但(dàn)是當你(nǐ)插上(shàng)usb的(de)時(shí)候,外(wài)部存儲又(yòu)會unmount,導緻你(nǐ)微(wēi)信裏面使用的(de)圖片都(dōu)無法使用。這(zhè)也是我在編寫應用的(de)時(shí)候老(lǎo)是異常的(de)原因,是獲取的(de)sd卡被卸載了。 但(dàn)是在設置裏面選取默認儲存,然後Environment.getExternalStorageDirectory返回外(wài)部存儲地(dì)址還(hái)是內(nèi)部存儲地(dì)址是一個(gè)比較好(hǎo)的(de)選擇,像我們的(de)平台如果有(yǒu)外(wài)部的(de)SD卡,對(duì)于應用來(lái)說(shuō)都(dōu)沒有(yǒu)借口知道(dào)其路(lù)徑。隻能直接使用storage/sdcard1 如果默認存儲是外(wài)部sd卡的(de)話(huà),又(yòu)想獲取內(nèi)部存儲的(de)路(lù)徑怎麽辦呢(ne)? 如果是系統應用可以從(cóng)storageManager中getVolumList可以獲取所有(yǒu)的(de)Volume,後去(qù)Volume去(qù)看(kàn)它是不是Primary的(de),如果是就是內(nèi)部存儲。也可以直接使用getPrimaryVolume獲取內(nèi)存存儲的(de)Volume,但(dàn)是一般的(de)APK調不到這(zhè)函數。 一般apk應該可以使用mount命令這(zhè)種方式查看(kàn)內(nèi)部存儲和(hé)外(wài)部存儲的(de)信息。 rootfs / rootfs ro,relatime 0 0 tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0 devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,seclabel,relatime 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 none /acct cgroup rw,relatime,cpuacct 0 0 none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0 none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0 tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0 tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0 none /dev/memcg cgroup rw,relatime,memory 0 0 none /dev/cpuctl cgroup rw,relatime,cpu 0 0 tmpfs /tmp tmpfs rw,seclabel,relatime 0 0 /dev/block/platform/comip-mmc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0 /dev/block/platform/comip-mmc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,data=ordered 0 0 /dev/block/platform/comip-mmc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered 0 0 /dev/block/platform/comip-mmc.1/by-name/amt /amt ext4 rw,seclabel,relatime,data=ordered 0 0 /dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,noexec,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 /dev/fuse /storage/sdcard1 fuse rw,nosuid,nodev,noexec,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 /dev/fuse /storage/usbotg fuse rw,nosuid,nodev,noexec,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 上(shàng)面就是mount命令打出來(lái)的(de)信息,可以看(kàn)到3個(gè)fuse文(wén)件(jiàn)系統,這(zhè)個(gè)手機(jī)上(shàng)沒有(yǒu)外(wài)部SD卡,就沒有(yǒu)外(wài)部SD卡的(de)挂載信息了,內(nèi)部的(de)SD卡其實就是data分區(qū)的(de)一部分。