2014-12-26 3 views
2

С кодом, как это:Почему моя внешняя SD-карта существует, возвращает false, когда sdcard вставляется в устройство Android?

// /mnt/media_rw/udisk/sda4 is my external sdcard path 
File sdcard = new File("/mnt/media_rw/udisk/sda4"); 

Log.d(LOG_TAG, "sdcard: " + sdcard 
       + ", exists: " + sdcard.exists()   // return false 
       + ", is directory: " + sdcard.isDirectory() // return false 
       + ", can write: " + sdcard.canWrite());  // return false 

Поскольку я работаю на ТВ платформе, поэтому я использую Tera Term инструмент для выполнения ls /mnt/media_rw/udisk/sda4, у меня есть список файлов.

А также, это мой /proc/mounts:

rootfs/rootfs ro,relatime 0 0 
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=111156k,nr_inodes=22811,mode=755 0 0 
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0 
devpts /dev/pts devpts rw,seclabel,relatime,mode=600,ptmxmode=000 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 /mnt/media_rw tmpfs rw,seclabel,relatime,mode=700,uid=1023,gid=1023 0 0 
none /storage tmpfs rw,seclabel,relatime,mode=751,uid=1028,gid=1028 0 0 
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,mode=700 0 0 
tmpfs /tmp tmpfs rw,seclabel,relatime,size=20480k,mode=771 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 
/dev/block/mmcblk0p1 /system ext4 rw,seclabel,relatime,data=ordered 0 0 
/dev/block/mmcblk0p2 /data ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,errors=panic,data=ordered 0 0 
/dev/block/mmcblk0p3 /cache ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,errors=panic,data=ordered 0 0 
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 
/dev/block/vold/8:4 **/mnt/media_rw/udisk/sda4** vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,usefree,utf8,errors=remount-ro 0 0 
/dev/fuse /storage/udisk/sda4 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 

Я попытался /storage/udisk/sda4/ вместо /mnt/media_rw/udisk/sda4, он возвращает true. Почему это?

+0

разрешение выпуск? – Henry

+0

Какая версия для Android? Вы пробовали Context.getExternalFilesDirs? – marcinj

+0

@Henry Как это подтвердить? Я попробовал '/ storage/udisk/sda4 /' вместо '/ mnt/media_rw/udisk/sda4', он возвращает' true' – roger

ответ

0

Проверьте права доступа (<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> в AndroidManifest.xml), используйте Environment.getExternalStorageDirectory() вместо прямого пути и попытаться выполнить эту функцию:

private static boolean isAvilableForRead() 
    { 
     boolean externalStorageReadable = false; 
     String state = Environment.getExternalStorageState(); 

     if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) || Environment.MEDIA_MOUNTED.equals(state)) 
     { 
      // We can read the media 
      externalStorageReadable = true; 
     } 

     return externalStorageReadable; 
    } 

Если она возвращает ложь, это не проблема Android SDK.

+0

Я пробовал '/ storage/udisk/sda4/'вместо'/mnt/media_rw/udisk/sda4', он возвращает 'true'. В чем проблема? – roger

+0

используйте 'Environment.getExternalStorageDirectory()' вместо '/ storage/udisk/sda4 /' или '/ mnt/media_rw/udisk/sda4'! У любого другого устройства может быть свой собственный путь! – anil

+0

, конечно, я буду использовать что-то вроде 'Environment.getExternalStorageDirectory()', но это не моя проблема, моя проблема в том, почему '/ storage/udisk/sda4 /' '/ mnt/media_rw/udisk/sda4' показать разницу! – roger

0

Попробуйте этот код

файл File = новый файл (Environment.getExternalStorageDirectory() + File.separator + "FOLDERNAME");

// Возвращает true, если obj совпадает с этим объектом, иначе false.

Log.d (LOG_TAG, «Exists File:» + file.exists());

+0

Это вернет внутреннюю SD-карту устройства Android, я использую [ExternalStorage] (https://gist.github.com/paour/11403182), чтобы получить внешнее хранилище, я просто перехожу на жесткий код '/ mnt/media_rw/udisk/sda4', чтобы упростить вопрос! – roger