
/
获取手机自身内存路径
/
public static String getPhoneCardPath(){
return EnvironmentgetDataDirectory()getPath();
}
/
获取sd卡路径
双sd卡时,根据”设置“里面的数据存储位置选择,获得的是内置sd卡或外置sd卡
@return
/
public static String getNormalSDCardPath(){
return EnvironmentgetExternalStorageDirectory()getPath();
}
/
获取sd卡路径
双sd卡时,获得的是外置sd卡
@return
/
public static String getSDCardPath() {
String cmd = "cat /proc/mounts";
Runtime run = RuntimegetRuntime();// 返回与当前 Java 应用程序相关的运行时对象
BufferedInputStream in=null;
BufferedReader inBr=null;
try {
Process p = runexec(cmd);// 启动另一个进程来执行命令
in = new BufferedInputStream(pgetInputStream());
inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBrreadLine()) != null) {
// 获得命令执行后在控制台的输出信息
Logi("CommonUtil:getSDCardPath", lineStr);
if (lineStrcontains("sdcard")
&& lineStrcontains("android_secure")) {
String[] strArray = lineStrsplit(" ");
if (strArray != null && strArraylength >= 5) {
String result = strArray[1]replace("/android_secure",
"");
return result;
}
}
// 检查命令是否执行失败。
if (pwaitFor() != 0 && pexitValue() == 1) {
// pexitValue()==0表示正常结束,1:非正常结束
Loge("CommonUtil:getSDCardPath", "命令执行失败!");
}
}
} catch (Exception e) {
Loge("CommonUtil:getSDCardPath", etoString());
//return EnvironmentgetExternalStorageDirectory()getPath();
}finally{
try {
if(in!=null){
inclose();
}
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
try {
if(inBr!=null){
inBrclose();
}
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
return EnvironmentgetExternalStorageDirectory()getPath();
}
//查看所有的sd路径
public String getSDCardPathEx(){
String mount = new String();
try {
Runtime runtime = RuntimegetRuntime();
Process proc = runtimeexec("mount");
InputStream is = procgetInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
BufferedReader br = new BufferedReader(isr);
while ((line = brreadLine()) != null) {
if (linecontains("secure")) continue;
if (linecontains("asec")) continue;
if (linecontains("fat")) {
String columns[] = linesplit(" ");
if (columns != null && columnslength > 1) {
mount = mountconcat("" + columns[1] + "\n");
}
} else if (linecontains("fuse")) {
String columns[] = linesplit(" ");
if (columns != null && columnslength > 1) {
mount = mountconcat(columns[1] + "\n");
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return mount;
}
//获取当前路径,可用空间
public static long getAvailableSize(String path){
try{
File base = new File(path);
StatFs stat = new StatFs(basegetPath());
long nAvailableCount = statgetBlockSize() ((long) statgetAvailableBlocks());
return nAvailableCount;
}catch(Exception e){
eprintStackTrace();
}
return 0;
}
直接调用文件管理器选择即可。
1、调用系统提供的选择器,代码如下:
//注意,在Android44系统下建议使用 IntentACTION_OPEN_DOCUMENT方式
if (UtilityisKK()) {
Intent intent = new Intent(IntentACTION_OPEN_DOCUMENT);
intentaddCategory(IntentCATEGORY_OPENABLE);
intentsetType("image
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
处理返回结果:
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
superonActivityResult(requestCode, resultCode, intent);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case PIC_RESULT://选择图库
case PIC_RESULT_KK:
imageFileUri = intentgetData();//获取选择的URI
break;
}
}
2、除此自外,系统还提供一种选择器,这个选择器可以屏蔽掉那个auto backup的目录所以就开始打算用这个选择器来选了
Intent intent=new Intent(IntentACTION_GET_CONTENT);//ACTION_OPEN_DOCUMENT
intentaddCategory(IntentCATEGORY_OPENABLE);
intentsetType("image/jpeg");
if(androidosBuildVERSIONSDK_INT>=androidosBuildVERSION_CODESKITKAT){
startActivityForResult(intent, SELECT_PIC_KITKAT);
}else{
startActivityForResult(intent, SELECT_PIC);
}
为什么要分开不同版本呢其实在43或以下可以直接用ACTION_GET_CONTENT的,在44或以上,官方建议用ACTION_OPEN_DOCUMENT,主要区别是他们返回的Uri43返回的是带文件路径的,而44返回的却是content://comandroidprovidersmediadocuments/document/image:3951这样的,没有路径,只有编号的uri可以通过以下方式,处理URI。
参考:Android 44从图库选择,获取路径并裁剪
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT;
// DocumentProvider
if (isKitKat && DocumentsContractisDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContractgetDocumentId(uri);
final String[] split = docIdsplit(":");
final String type = split[0];
if ("primary"equalsIgnoreCase(type)) {
return EnvironmentgetExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContractgetDocumentId(uri);
final Uri contentUri = ContentUriswithAppendedId(
Uriparse("content://downloads/public_downloads"), LongvalueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContractgetDocumentId(uri);
final String[] split = docIdsplit(":");
final String type = split[0];
Uri contentUri = null;
if ("image"equals(type)) {
contentUri = MediaStoreImagesMediaEXTERNAL_CONTENT_URI;
} else if ("video"equals(type)) {
contentUri = MediaStoreVideoMediaEXTERNAL_CONTENT_URI;
} else if ("audio"equals(type)) {
contentUri = MediaStoreAudioMediaEXTERNAL_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(urigetScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return urigetLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file"equalsIgnoreCase(urigetScheme())) {
return urigetPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = contextgetContentResolver()query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursormoveToFirst()) {
final int index = cursorgetColumnIndexOrThrow(column);
return cursorgetString(index);
}
} finally {
if (cursor != null)
cursorclose();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "comandroidexternalstoragedocuments"equals(urigetAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "comandroidprovidersdownloadsdocuments"equals(urigetAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "comandroidprovidersmediadocuments"equals(urigetAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "comgoogleandroidappsphotoscontent"equals(urigetAuthority());
}
3、使用其它开源组件如PhotoView。
以上就是关于如何正确获得Android内外SD卡路径全部的内容,包括:如何正确获得Android内外SD卡路径、android怎么从sd卡指定的文件夹中获取所有图片的路径URL,谢谢~感谢各位大神了、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)