我想以编程方式获取设备内部/外部存储空闲内存的大小.我正在使用这段代码:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);
File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format = Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
Run Code Online (Sandbox Code Playgroud)
而我得到的结果是:
11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
Run Code Online (Sandbox Code Playgroud)
问题是我想获得1,96GB现在的SdCard的免费记忆.如何修复此代码,以便获得免费大小?
我试图找出运行我的应用程序的Android手机上的可用磁盘空间.有没有办法以编程方式执行此操作?
谢谢,
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)
而且,这是有史以来第一次,我们可以有一个Intent请求访问storageVolume(在此)。因此,例如,如果我们要请求用户授予对主数据库的访问权限(实际上是从那里开始,实际上并没有真正询问任何内容),则可以使用以下方法:
startActivityForResult(storageManager.primaryStorageVolume.createOpenDocumentTreeIntent(), REQUEST_CODE__DIRECTORTY_PERMISSION)
Run Code Online (Sandbox Code Playgroud)
代替startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), REQUEST_CODE__DIRECTORTY_PERMISSION),希望用户在那里选择正确的东西。
为了最终获得用户选择的内容,我们需要执行以下操作:
@TargetApi(Build.VERSION_CODES.KITKAT)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE__DIRECTORTY_PERMISSION && resultCode == Activity.RESULT_OK && data != null) {
val treeUri = data.data ?: return
contentResolver.takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
val pickedDir = DocumentFile.fromTreeUri(this, treeUri)
...
Run Code Online (Sandbox Code Playgroud)
到目前为止,我们可以请求对各种存储卷的许可... …
我因为一些琐碎的事情而失去了整整一天,但现在我只是放弃并需要你的帮助。
在用于读取应用程序代码/数据/缓存/大小的新 Oreo API 中,我们需要存储 UUID(StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid))。
存储 UUID 可以从StorageManager.getStorageVolumes()获取,它返回所有存储的列表,其中也包含 UUID。
问题开始了:返回列表中的 UUID 是字符串格式,而StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid)需要 UUID 对象 - 没有更简单的 - 存在方法UUID.fromString(String name)可以在一段时间内转换它。 . 但是等等,StorageManager 列表中的 UUID 值与 UUID 解析器不兼容 -什么?!我检查了 2 台设备(一台带奥利奥,一台带牛轧糖),都有外部存储器,每台设备我都有 2 个存储:
谁能解释一下我做错了什么,我应该如何获取外部存储的 UUID?或者只是新的 API StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid)没用,因为我们无法获得存储 UUID?
供参考:
更重要的是还有另一个 StackOverflow 问题,其中将此 API 的使用标记为正确的解决方案:https : …
我想问一下,有可用的应用程序,用户可以通过 OTG 电缆设备将 USB 连接到 Android 并播放其中包含的媒体(特别是视频)。
我制作了一个广播接收器来检测连接的 USB,我也想阅读内容。我正在使用此代码片段。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if(device != null){
//
Log.d("1","DEATTCHED-" + device);
}
}
}
//
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if(device != null){
//
Log.d("1","ATTACHED-" + device);
}
}
else {
PendingIntent mPermissionIntent;
mPermissionIntent = PendingIntent.getBroadcast(MainActivity.this, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个带有房间数据库的应用程序。我如何知道已达到数据存储的最大限制?如果应用程序超出该限制会发生什么情况。它会影响已存储的数据还是只是停止添加新数据?