Created
October 8, 2014 02:50
-
-
Save bingoogolapple/7f3b014a2bf6d06dbd95 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class StorageUtil { | |
private StorageUtil() { | |
} | |
public static Context mContext; | |
public static void init(Context context) { | |
mContext = context; | |
} | |
/** | |
* 判断外存储是否可写 | |
* | |
* @return | |
*/ | |
public static boolean isExternalStorageWritable() { | |
String state = Environment.getExternalStorageState(); | |
return Environment.MEDIA_MOUNTED.equals(state); | |
} | |
/** | |
* 获取可用sd空间大小 | |
* | |
* @param context | |
* 应用程序上下文 | |
* @return | |
*/ | |
@SuppressWarnings("deprecation") | |
public static long getAvailableSize() { | |
StatFs statfs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()); | |
long blocks = statfs.getAvailableBlocks(); | |
long size = statfs.getBlockSize(); | |
return blocks * size; | |
} | |
/** | |
* sd卡空间是否够用 | |
* | |
* @param context | |
* 应用程序上下文 | |
* @param contentLength | |
* 文件大小 | |
* @return | |
*/ | |
public static boolean isSaveable(int contentLength) { | |
long avaliable = getAvailableSize(); | |
return avaliable > contentLength ? true : false; | |
} | |
/** | |
* 存储完文件后,sd存储空间是否处于快用完状态 | |
* | |
* @param context | |
* 应用程序上下文 | |
* @param contentLength | |
* 文件大小 | |
* @return | |
*/ | |
public static boolean isWeakSaveable(int contentLength) { | |
return getAvailableSize() - 30 * 1024 * 1024 < contentLength ? true : false; | |
} | |
/** | |
* Get a file path from a Uri. This will get the the path for Storage Access Framework Documents, as well as the _data field for the MediaStore and other file-based ContentProviders. | |
* | |
* @param context | |
* The context. | |
* @param uri | |
* The Uri to query. | |
*/ | |
public static String getPath(final Context context, final Uri uri) { | |
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; | |
// DocumentProvider | |
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { | |
// ExternalStorageProvider | |
if (isExternalStorageDocument(uri)) { | |
final String docId = DocumentsContract.getDocumentId(uri); | |
final String[] split = docId.split(":"); | |
final String type = split[0]; | |
if ("primary".equalsIgnoreCase(type)) { | |
return Environment.getExternalStorageDirectory() + "/" + split[1]; | |
} | |
// TODO handle non-primary volumes | |
} | |
// DownloadsProvider | |
else if (isDownloadsDocument(uri)) { | |
final String id = DocumentsContract.getDocumentId(uri); | |
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); | |
return getDataColumn(context, contentUri, null, null); | |
} | |
// MediaProvider | |
else if (isMediaDocument(uri)) { | |
final String docId = DocumentsContract.getDocumentId(uri); | |
final String[] split = docId.split(":"); | |
final String type = split[0]; | |
Uri contentUri = null; | |
if ("image".equals(type)) { | |
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; | |
} else if ("video".equals(type)) { | |
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; | |
} else if ("audio".equals(type)) { | |
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; | |
} | |
final String selection = "_id=?"; | |
final String[] selectionArgs = new String[] { split[1] }; | |
return getDataColumn(context, contentUri, selection, selectionArgs); | |
} | |
} | |
// MediaStore (and general) | |
else if ("content".equalsIgnoreCase(uri.getScheme())) { | |
return getDataColumn(context, uri, null, null); | |
} | |
// File | |
else if ("file".equalsIgnoreCase(uri.getScheme())) { | |
return uri.getPath(); | |
} | |
return null; | |
} | |
/** | |
* Get the value of the data column for this Uri. This is useful for MediaStore Uris, and other file-based ContentProviders. | |
* | |
* @param context | |
* The context. | |
* @param uri | |
* The Uri to query. | |
* @param selection | |
* (Optional) Filter used in the query. | |
* @param selectionArgs | |
* (Optional) Selection arguments used in the query. | |
* @return The value of the _data column, which is typically a file path. | |
*/ | |
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { | |
Cursor cursor = null; | |
final String[] projection = { MediaStore.MediaColumns.DATA }; | |
try { | |
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); | |
if (cursor != null && cursor.moveToFirst()) { | |
final int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); | |
return cursor.getString(column_index); | |
} | |
} finally { | |
if (cursor != null) { | |
cursor.close(); | |
} | |
} | |
return null; | |
} | |
/** | |
* @param uri | |
* The Uri to check. | |
* @return Whether the Uri authority is ExternalStorageProvider. | |
*/ | |
public static boolean isExternalStorageDocument(Uri uri) { | |
return "com.android.externalstorage.documents".equals(uri.getAuthority()); | |
} | |
/** | |
* @param uri | |
* The Uri to check. | |
* @return Whether the Uri authority is DownloadsProvider. | |
*/ | |
public static boolean isDownloadsDocument(Uri uri) { | |
return "com.android.providers.downloads.documents".equals(uri.getAuthority()); | |
} | |
/** | |
* @param uri | |
* The Uri to check. | |
* @return Whether the Uri authority is MediaProvider. | |
*/ | |
public static boolean isMediaDocument(Uri uri) { | |
return "com.android.providers.media.documents".equals(uri.getAuthority()); | |
} | |
public static boolean deleteDirectory(String filePath) { | |
if (null == filePath) { | |
return false; | |
} | |
File file = new File(filePath); | |
if (file == null || !file.exists()) { | |
return false; | |
} | |
if (file.isDirectory()) { | |
File[] list = file.listFiles(); | |
for (int i = 0; i < list.length; i++) { | |
if (list[i].isDirectory()) { | |
deleteDirectory(list[i].getAbsolutePath()); | |
} else { | |
list[i].delete(); | |
} | |
} | |
} | |
file.delete(); | |
return true; | |
} | |
public static boolean createDirectory(String filePath) { | |
if (null == filePath) { | |
return false; | |
} | |
File file = new File(filePath); | |
if (file.exists()) { | |
return true; | |
} | |
file.mkdirs(); | |
return true; | |
} | |
public static boolean deleteFile(String filepath) { | |
File file = new File(filepath); | |
if (file.exists()) { | |
return file.delete(); | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment