【问题标题】:Why my external sdcard exists return false when sdcard insert into android device?为什么当 sdcard 插入 android 设备时,我的外部 sdcard 存在返回 false?
【发布时间】:2015-02-23 15:39:34
【问题描述】:

使用这样的代码:

// /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。这是为什么呢?

【问题讨论】:

  • 什么安卓版本?你试过 Context.getExternalFilesDirs 吗?
  • @Henry 如何确认?我试过/storage/udisk/sda4/而不是/mnt/media_rw/udisk/sda4,它返回true
  • @MarcinJedrzejewski minSdkVersion 16 targetSdkVersion 21

标签: android file sd-card android-sdcard mount


【解决方案1】:

检查您的权限(AndroidManifest.xml 中的<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />),使用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;
    }

如果返回 false,则不是 Android SDK 问题。

【讨论】:

  • 我试过/storage/udisk/sda4/而不是/mnt/media_rw/udisk/sda4,它返回true。有什么问题?
  • 使用Environment.getExternalStorageDirectory() 而不是/storage/udisk/sda4//mnt/media_rw/udisk/sda4!任何其他设备都可能有自己的路径!
  • 当然我会使用Environment.getExternalStorageDirectory()之类的东西,但这不是我的问题,我的问题是为什么/storage/udisk/sda4//mnt/media_rw/udisk/sda4显示不同!
  • 首先,从您的问题来看并不明显。其次,为什么你认为你的应用程序线程可以访问文件系统中的所有目录?
  • 还有Environment.getExternalStorageDirectory()不返回外部sdcard,它返回android内部sdcard,其实我有更好的选择:ExternalStorage。但很明显,我在我的问题中改为硬编码/mnt/media_rw/udisk/sda4
【解决方案2】:

试试这个代码

文件file = new File(Environment.getExternalStorageDirectory()+File.separator+"FolderName");

//如果obj与此对象相同,则返回true,否则返回false。

Log.d(LOG_TAG,"存在文件:"+file.exists());

【讨论】:

  • 这将返回android设备的内部sdcard,我使用ExternalStorage获取我的外部存储,我只是更改为硬代码/mnt/media_rw/udisk/sda4以简化问题!
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多