以编程方式检查 SD 卡是不是可用

Posted

技术标签:

【中文标题】以编程方式检查 SD 卡是不是可用【英文标题】:Check whether the SD card is available or not programmatically以编程方式检查 SD 卡是否可用 【发布时间】:2011-11-17 18:11:11 【问题描述】:

我的应用适用于只有 SD 卡的手机。所以我想以编程方式检查 SD 卡是否可用以及如何找到 SD 卡的可用空间。有可能吗?

如果是,我该怎么做?

【问题讨论】:

“仅限 SD 卡”是什么意思?你的意思是它没有内部存储器?这很难想象。 【参考方案1】:
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
Boolean isSDSupportedDevice = Environment.isExternalStorageRemovable();

if(isSDSupportedDevice && isSDPresent)

  // yes SD-card is present

else

 // Sorry

【讨论】:

如何查看sdcard空闲内存? 但如果手机有内置存储,它会返回 true..所以不是正确的答案 在现代 Android 设备上,外部存储(称为“sdcard”)现在也可以是内部存储,只是分开。所以是的,这是一个很好的答案。 要确定外部存储是否是 SDCARD,请结合使用上述内容:Environment.isExternalStorageRemovable() 在模拟外部存储的情况下,这显然是一个错误的答案。理想情况下,应使用 Environment.isExternalStorageRemovable()。您还可以看到 Environment.isExternalStorageEmulated()。 @naresh 你不应该接受部分答案。【参考方案2】:

接受的答案对我不起作用

Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

如果设备有内置存储,则返回true; 我的解决方案是检查外部文件目录数,如果有多个,则设备有sdcard。 它工作正常,我在几台设备上对其进行了测试。

public static boolean hasRealRemovableSdCard(Context context) 
    return ContextCompat.getExternalFilesDirs(context, null).length >= 2;

【讨论】:

但是如果设备有槽并且没有插入sd卡,则显示长度为2。文件数组有空文件。无论如何,这对我来说是最好的解决方案:)【参考方案3】:

您可以像这样检查外部可移动 sd 卡是否可用

public static boolean externalMemoryAvailable(Activity context) 
    File[] storages = ContextCompat.getExternalFilesDirs(context, null);
    if (storages.length > 1 && storages[0] != null && storages[1] != null)
        return true;
    else
        return false;


我已经测试过了,这非常有效。

【讨论】:

我已经在三星 A70s 上测试过,无论有没有外接(可移动)SD 卡,在这两种情况下,它都运行良好。我已经尝试了其他人建议的所有解决方案,但这个工作正常。希望也适用于所有设备。非常感谢。【参考方案4】:

按照"Using the External Storage" 中的说明使用Environment.getExternalStorageState()

要获得外部存储的可用空间,请使用StatFs

// do this only *after* you have checked external storage state:
File extdir = Environment.getExternalStorageDirectory();
File stats = new StatFs(extdir.getAbsolutePath());
int availableBytes = stats.getAvailableBlocks() * stats.getBlockSize();

【讨论】:

【参考方案5】:

我写了一个小类来检查存储状态。或许对你有用。

import android.os.Environment;

/**
 * Checks the state of the external storage of the device.
 * 
 * @author kaolick
 */
public class StorageHelper

// Storage states
private boolean externalStorageAvailable, externalStorageWriteable;

/**
 * Checks the external storage's state and saves it in member attributes.
 */
private void checkStorage()

// Get the external storage's state
String state = Environment.getExternalStorageState();

if (state.equals(Environment.MEDIA_MOUNTED))

    // Storage is available and writeable
    externalStorageAvailable = externalStorageWriteable = true;

else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))

    // Storage is only readable
    externalStorageAvailable = true;
    externalStorageWriteable = false;

else

    // Storage is neither readable nor writeable
    externalStorageAvailable = externalStorageWriteable = false;



/**
 * Checks the state of the external storage.
 * 
 * @return True if the external storage is available, false otherwise.
 */
public boolean isExternalStorageAvailable()

checkStorage();

return externalStorageAvailable;


/**
 * Checks the state of the external storage.
 * 
 * @return True if the external storage is writeable, false otherwise.
 */
public boolean isExternalStorageWriteable()

checkStorage();

return externalStorageWriteable;


/**
 * Checks the state of the external storage.
 * 
 * @return True if the external storage is available and writeable, false
 *         otherwise.
 */    
public boolean isExternalStorageAvailableAndWriteable()

checkStorage();

if (!externalStorageAvailable)

    return false;

else if (!externalStorageWriteable)

    return false;

else

    return true;



【讨论】:

这个 calss 是否有助于检测 sd 卡的可用性? @PankajNimgade 此类可帮助您检查外部存储是否可用和/或可写。外部存储设备可以是 SD 卡或内置存储设备,如 nexus 设备。 是否可以专门检查“sdcard”?提前谢谢 @PankajNimgade 我不知道。我建议在这里阅读有关内部和外部存储的信息:developer.android.com/guide/topics/data/data-storage.html 浏览过该文件和其他几个文件,google 对“设备上可用的外部存储”和“sd 卡”没有具体的区别...... :(【参考方案6】:

我对其进行了修改,如果存在 SD 卡,它将在那里设置路径。如果不是,则将其设置在内部目录中。

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)

    path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";

else

    path = theAct.getFilesDir() + "/GrammarFolder";

【讨论】:

【参考方案7】:
 void updateExternalStorageState() 
     String state = Environment.getExternalStorageState();
     if (Environment.MEDIA_MOUNTED.equals(state)) 
        mExternalStorageAvailable = mExternalStorageWriteable = true;
      else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
        mExternalStorageAvailable = true;
       mExternalStorageWriteable = false;
      else 
       mExternalStorageAvailable = mExternalStorageWriteable = false;

handleExternalStorageState(mExternalStorageAvailable,
        mExternalStorageWriteable);

【讨论】:

【参考方案8】:

这个简单的方法对我有用。在所有类型的设备中测试。

public boolean externalMemoryAvailable() 
    if (Environment.isExternalStorageRemovable()) 
      //device support sd card. We need to check sd card availability.
      String state = Environment.getExternalStorageState();
      return state.equals(Environment.MEDIA_MOUNTED) || state.equals(
          Environment.MEDIA_MOUNTED_READ_ONLY);
     else 
      //device not support sd card. 
      return false;
    
  

【讨论】:

【参考方案9】:

科特林

fun Context.externalMemoryAvailable(): Boolean 
    val storages = ContextCompat.getExternalFilesDirs(this, null)
    return storages.size > 1 && storages[0] != null && storages[1] != null

【讨论】:

【参考方案10】:
  public static boolean hasSdCard(Context context) 

    File[] dirs = context.getExternalFilesDirs("");        
    if(dirs.length >= 2 && dirs[1]!=null)
        if(Environment.isExternalStorageRemovable(dirs[1])) // Extra Check
            return true;
        
     
    return false;
   

【讨论】:

【参考方案11】:

我创建了一个类来检查 SD 卡上的文件夹是否可用:

public class GetFolderPath 

    static String folderPath;

    public static String getFolderPath(Context context) 
        if (isSdPresent() == true) 
            try 
                File sdPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/FolderName");
                if(!sdPath.exists()) 
                    sdPath.mkdirs();
                    folderPath = sdPath.getAbsolutePath();
                 else if (sdPath.exists()) 
                    folderPath = sdPath.getAbsolutePath();
                
            
            catch (Exception e) 

            
            folderPath = Environment.getExternalStorageDirectory().getPath()+"/FolderName/";
        
        else 
            try 
                File cacheDir=new File(context.getCacheDir(),"FolderName/");
                if(!cacheDir.exists()) 
                    cacheDir.mkdirs();
                    folderPath = cacheDir.getAbsolutePath();
                 else if (cacheDir.exists()) 
                    folderPath = cacheDir.getAbsolutePath();
                
            
            catch (Exception e)

            
        
        return folderPath;
    

    public static boolean isSdPresent() 
        return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
    

【讨论】:

【参考方案12】:
** i fixed this with help of @Jemo Mgebrishvili answer** 

即使存在 sd 卡并且处于弹出状态,这也能完美运行

 if (ContextCompat.getExternalFilesDirs(this, null).length >= 2) 
                File[] f = ContextCompat.getExternalFilesDirs(this, null);
                for (int i = 0; i < f.length; i++) 
                    File file = f[i];
                    if(file!=null && i ==1)
                    
                        Log.d(TAG,file.getAbsolutePath()+ "external sd card  available");

                    

                
             else 
                Log.d(TAG, " external sd card not available");

            

【讨论】:

以上是关于以编程方式检查 SD 卡是不是可用的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中以编程方式检查模块可用性?

获取 Android 上的所有总空间和可用空间

如何以编程方式检查 Android 中互联网连接的可用性?

检查应用程序是不是在 Android Market 上可用

Android判断SD卡是不是存在的实现

以编程方式检查 redshift 集群状态