是否有通用的方法来查找外部SD卡的位置?
请不要与外部存储混淆.Environment.getExternalStorageState()返回内部SD挂载点的路径,如"/ mnt/sdcard".但问题是关于外部SD.如何获得像"/ mnt/sdcard/external_sd"这样的路径(它可能因设备而异)?
我想我将以mount文件系统名称过滤命令结束.但我不确定这种方式是否足够强大.
三星Galaxy S3有一个extrenal SD卡插槽,安装到/mnt/extSdCard.
我的问题是:如何通过类似的方式获得这条路径Environment.getExternalStorageDirectory()?这将返回mnt/sdcard,我找不到外部SD卡的API.(或某些平板电脑上的可移动USB存储器)
谢谢!
我如何检查Android设备上剩下多少MB或GB?我正在使用JAVA和android SDK 2.0.1.
是否有任何系统服务会暴露这样的事情?
是否可以通过Android SDK获取Android设备(而非SD卡)上的可用内存量?
如果是这样,怎么样?
我试图找出运行我的应用程序的Android手机上的可用磁盘空间.有没有办法以编程方式执行此操作?
谢谢,
从Lollipop开始,应用程序可以访问真正的SD卡(在Kitkat上无法访问之后,并且在之前的版本中尚未获得官方支持),正如我在此处所述.
因为看到支持SD卡的Lollipop设备变得非常罕见,并且因为模拟器实际上没有能力(或者它?)来模拟SD卡支持,所以我花了很长时间来测试它.
无论如何,似乎不是使用普通的File类来访问SD卡(一旦获得了它的许可),你需要使用Uris来使用它,使用DocumentFile.
这限制了对正常路径的访问,因为我找不到将Uris转换为路径的方法,反之亦然(加上它非常烦人).这也意味着我不知道如何检查当前的SD卡是否可访问,因此我不知道何时要求用户允许读取/写入(或向他们).
目前,这就是我获取所有SD卡的路径:
/**
* returns a list of all available sd cards paths, or null if not found.
*
* @param includePrimaryExternalStorage set to true if you wish to also include the path of the primary external storage
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static List<String> getExternalStoragePaths(final Context context,final boolean includePrimaryExternalStorage)
{
final File primaryExternalStorageDirectory=Environment.getExternalStorageDirectory();
final List<String> result=new ArrayList<>();
final File[] externalCacheDirs=ContextCompat.getExternalCacheDirs(context);
if(externalCacheDirs==null||externalCacheDirs.length==0)
return result;
if(externalCacheDirs.length==1)
{
if(externalCacheDirs[0]==null)
return result;
final String storageState=EnvironmentCompat.getStorageState(externalCacheDirs[0]);
if(!Environment.MEDIA_MOUNTED.equals(storageState))
return …Run Code Online (Sandbox Code Playgroud) 在这里,我们正在为Android电视盒开发Android应用程序.如何获取已安装的外部存储列表USB stick, SDCARD and SATA HDD.
Google不幸地计划破坏存储权限,以使应用程序无法使用标准File API(和文件路径)访问文件系统。许多人反对它,因为它改变了应用程序访问存储的方式,并且在许多方面都是受限制的有限API。
因此,如果我们想处理各种问题,我们将需要在将来的某些Android版本上完全使用SAF(存储访问框架)(在Android Q上,我们至少可以暂时使用一个标志来使用常规存储权限)。存储卷并到达那里的所有文件。
因此,例如,假设您要制作一个文件管理器并显示设备的所有存储卷,并为每个文件显示有多少总字节和可用字节。这样的事情看起来非常合法,但是由于我找不到找到这种方法的方法。
从API 24(此处)开始,我们终于可以列出所有存储卷,如下所示:
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
Run Code Online (Sandbox Code Playgroud)
事实是,此列表上的每个项目都没有功能来获取其大小和可用空间。
但是,以某种方式,Google的“ Google提供的文件”应用程序设法获得了该信息,而没有获得任何形式的许可:
并在装有Android 8的Galaxy Note 8上进行了测试。甚至没有最新版本的Android。
因此,这意味着即使在Android 8上,也应该有一种无需任何许可即可获取此信息的方法。
有一些类似于获得自由空间的东西,但是我不确定是否确实如此。虽然如此。这是它的代码:
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
AsyncTask.execute {
for (storageVolume in storageVolumes) {
val uuid: UUID = storageVolume.uuid?.let { UUID.fromString(it) } ?: StorageManager.UUID_DEFAULT
val allocatableBytes = storageManager.getAllocatableBytes(uuid)
Log.d("AppLog", "allocatableBytes:${android.text.format.Formatter.formatShortFileSize(this,allocatableBytes)}")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我找不到类似的东西来获取每个StorageVolume实例的总空间。假设我对此是正确的,我已经在这里提出了要求。
您可以在我对此问题写的答案中找到更多我所找到的内容,但是目前,这是所有变通办法的结合,这些工作不是变通办法,而是在某些情况下有效。 …
我添加了这一行来查找大小(内部和外部)大小,
return availableExternalMemorySize/(1024*1024);
Run Code Online (Sandbox Code Playgroud)
我在平板电脑上测试过.我得到内部和外部SD卡大小,因为,
在内部存储中:
在外部存储中:
但在Tablet中,我看到了设置.外部存储大小为8GB.但是,当我通过编程方式进行测试时,它向我展示了1.7 GB.
查找外部存储大小的步骤是什么?
当我调用它来获取外部存储器详细信息时,我收到如下错误.
05-07 16:55:07.710: E/AndroidRuntime(22624): FATAL EXCEPTION: main java.lang.IllegalArgumentException: Invalid path: /storage/emulated/0
05-07 16:55:07.710: E/AndroidRuntime(22624): at android.os.StatFs.doStat(StatFs.java:46)
05-07 16:55:07.710: E/AndroidRuntime(22624): at android.os.StatFs.<init>(StatFs.java:39)
Run Code Online (Sandbox Code Playgroud)
在我将我的机器人更新到SAMSUNG Galaxy S3 4.3之前,这是有效的.我跟着这篇文章.这是我的代码:
// getting available memory
public static String getAvailableExternalMemorySize() {
if (externalMemoryAvailableBool()) {
// File path =
// Environment.getExternalStorageDirectory().getAbsolutePath();
StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
.getAbsolutePath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return formatSize(availableBlocks * blockSize);
} else {
return ERROR;
}
}
// getting total memory
public static String getTotalExternalMemorySize() {
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码获取内部存储详细信息(用作内部存储器的存储).
public void getinternalstorage() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double bytesavalible = (double) stat.getBlockSizeLong() * (double) stat.getAvailableBlocksLong();
final double gb = bytesavalible / (1024 * 1024 * 1024);
double total = (double) stat.getBlockSizeLong() * stat.getBlockCountLong();
final double totalgb = total / (1024 * 1024 * 1024);
final double per = (100 - (gb / totalgb) * 100);
update_inte((int) (per * 1), round(totalgb, 2), round((gb), 2));
TextView text2written = (TextView) findViewById(R.id.inter);
text2written.setText(String.valueOf(round((totalgb - gb), 2)) + " GB " + …Run Code Online (Sandbox Code Playgroud) 我使用内部数据(应用程序的私有数据)来保存数据。
但是,如果设备存储空间不足,如何在保存之前检查存储空间是否已满?如果写入文件的数据非常大,导致设备的存储空间已满,我该如何检查并通知用户/防止应用程序显示强制关闭对话框?
Android 系统是否在此问题上做任何事情(例如显示一条消息,告诉用户设备上没有更多空间)?
主要关注的是确保检查在适用的驱动器上进行;如果应用程序已移至 SD 卡或其他外部存储单元,则应根据剩余内存检查该驱动器
示例场景:设备剩余 238KB。数据保存到 10 个文件中。每个文件为30-40KB。假设平均为35KB/文件,可以写入6个文件,而最后4个不能。我该如何处理此类问题?