您可以使用以下代码示例来获取Android设备上一个空的MediaStore存储/卷的可用空间:
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;
import androidx.annotation.RequiresApi;
import androidx.documentfile.provider.DocumentFile;
public class StorageUtils {
private static final String TAG = StorageUtils.class.getSimpleName();
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static long getAvailableSpace(Context context) {
Uri externalUri = MediaStore.Files.getContentUri("external");
// Get the volume name of the primary external storage
String volumeName = getPrimaryVolumeName(context, externalUri);
if (volumeName == null) {
Log.e(TAG, "Failed to get primary volume name");
return 0;
}
// Get the document tree Uri of the primary external storage
Uri documentTreeUri = DocumentsContract.buildTreeDocumentUri(externalUri.getAuthority(), volumeName);
if (documentTreeUri == null) {
Log.e(TAG, "Failed to get document tree Uri");
return 0;
}
// Get the available space of the primary external storage
DocumentFile documentFile = DocumentFile.fromTreeUri(context, documentTreeUri);
if (documentFile == null) {
Log.e(TAG, "Failed to get document file");
return 0;
}
return documentFile.getFreeSpace();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static String getPrimaryVolumeName(Context context, Uri externalUri) {
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(externalUri, new String[]{MediaStore.VOLUME_NAME}, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(cursor.getColumnIndex(MediaStore.VOLUME_NAME));
}
} catch (Exception e) {
Log.e(TAG, "Failed to get primary volume name", e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return null;
}
}
要使用上面的代码示例,您需要在AndroidManifest.xml文件中添加以下权限:
然后,您可以在您的Activity或Fragment中调用以下方法来获取可用空间:
long availableSpace = StorageUtils.getAvailableSpace(this);
请注意,此示例仅适用于Android 5.0(API级别21)及更高版本。对于更旧的Android版本,您可能需要使用其他方法来获取可用空间。