
getExternalStorageDirectory()方法在40以后只能获取内置SD卡路径
外置SD卡
/
获取外置SD卡路径
@return 应该就一条记录或空
/
public List<string> getExtSDCardPath()
{
List<string> lResult = new ArrayList<string>();
try {
Runtime rt = RuntimegetRuntime();
Process proc = rtexec("mount");
InputStream is = procgetInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = brreadLine()) != null) {
if (linecontains("extSdCard"))
{
String [] arr = linesplit(" ");
String path = arr[1];
File file = new File(path);
if (fileisDirectory())
{
lResultadd(path);
}
}
}
isrclose();
} catch (Exception e) {
}
return lResult;
}
List<string> extPaths = getExtSDCardPath();
for (String path : extPaths) {
logappend("外置SD卡路径:" + path + "\r\n");
}
PS别忘记添加权限,内外置SD卡的权限在40以后是不一样的
使用以下命令:cat /sys/devices/platform/jz-msc0/mmc_host/mmc0/mmc0:1234/cid或者使用通配符cat /sys/devices/platform/jz-msc0/mmc_host/mmc0/mmc0:/cid 得到32个字节的数据:0254 4d53 4130 3847 0610 ebb5 5000 a93f 在kernel/drivers/mmc/core/sdc文件中:以下数组结构用于保存SD卡ID card->raw_cid[0];card->raw_cid[1];card->raw_cid[2];card->raw_cid[3]; linux内核中对应的代码位于: kernel/drivers/mmc/core/sdckernel/drivers/mmc/core/mmcckernel/include/linux/mmc/cardhkernel/include/linux/mmc/mmch 关键字: Linux MMC卡驱动读取SD卡ID如何读取SD卡ID如何获取SD卡ID如何获取SD卡序列号
1、请先检查有没有安装Android手机对应的的USB驱动,使用360手机助手都会自动帮你装上手机驱动,且驱动正确安装;
2、查看手机设置-应用程序-未知来源是否勾选,否则就会导致有些非电子市场提供的应用程序无法安装;
3、在设置-开发-允许模拟地点上打钩;
4、储存模式连接电脑或者用RootExplorer找到SD卡目录下的android_secure文件夹,里面应该会有一个smdl2tmp1asec,也可能是其他名称,总之与正常程序命名格式明显不一样的文件,删除,再次安装软件;
或用终端虚拟机删除/mnt/secure/asec/smdl2tmp1asec(驱动器模式下是:可移动磁盘/android_secure/smdl2tmp1asec),再安装即可;
5、用RE浏览器搜索程序相关关键字,把找到的相关文件和目录全部删除,然后重启再安装程序;
6、如有过备份,打开钛备份,找到相关软件,还原:选择程序+数据,或单独选择还原程序;
7、用系统自带的程序管理查看SD卡上的程序,有的程序没有彩色图标的,这些没有图标的软件就是以前一些没有正确安装或者卸载不完全软件数据,如果你再次安装就会报错,用系统自带的软件管理把它们卸载干净,再次安装软件时就不会出错了;
8、升级已安装的程序时提示“应用程序未安装”少部分软件升级时会出现,只能卸载掉旧版本,再安装新版本;
9、手机连接电脑然后打开360手机助手,随便安装一个应用程序,选择安装路径为手机内存;
10、还有一部分因为软件签名更改了,所以不能覆盖安装,直接删除重新安装新的版本即可;
11、1)首先下载应用程序的APK安装包放到SD卡里;
2)、将APK文件改名为comxxxxxxapk的形式(对比系统APP目录下的文件名做的改动);
3)、用有Root权限的RE浏览器将卡内的APK文件移动或复制到系统目录内的APP目录下(就是你能看到其他应用程序图标的那个目录);
4)、找到你复制过来的APK文件,长按调出菜单选“权限”,对照下图勾选相应的权限并确定;
有两种方法
第一种
sd卡的默认目录是"/mnt/sdcard",只需要
1、File
mFile
=
new
File
("/mnt/sdcard");
mFilelistFile就可以遍历出SD一级目录下的所有文件、文件夹。递归实现读取所有文件
2、根据文件后缀名可判断是否为音乐文件(包括mp3、acc等等)
3、提取出音乐文件
第二种方法
下载一个播放器软件,酷狗、天天动听或是QQ音乐,打开后他能够自动扫描出音乐文件。
直接调用文件管理器选择即可。
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。
1首先请安装「Root Explorer」这个app,它可以在已ROOT的手机中管理隐藏的系统核心档案。
2安装完成并开启Root Explorer以後,展开「/system/etc/permissions/」路径,然後在「platformxml」上长按。
3跳出「Options」选单以後,先按一下「Permissions」,我们要更改档案的权限才能写入文字。
4此时会跳出一个警告讯息,告知你目前系统内的档案为唯读模式,需先更改为读写模式,按下「Yes」即可更改。
5更改完成以後,将「Read」、「Write」、「Execute」项目都勾起来,然後按一下「OK」。
6权限更改完成以後,再次在「platformxml」上长按一次。
7跳出「Options」选单以後,这次我们点击「Open With」,选择用哪个app开启此档案。
8看到显示了一堆app,我们选择用「Text Viewer」来开启,如果读者们有其他的文字编辑app,也可以用它来开启。
9找到以下两段文字以後,将内容改成跟底下一样:
<permission name="androidpermissionWRITE_EXTERNAL_STORAGE" > <group gid="sdcard_r" />
<group gid="sdcard_rw" />
<group gid="media_rw" />
</permission>
<permission name="androidpermissionWRITE_MEDIA_STORAGE" > <group gid="sdcard_rw" />
<group gid="media_rw" />
</permission>
10更改完成以後,点击一下叫出选单,点击「Save Changes」储存更改,然後离开即可。
11储存成功以後,可以看到资料夹中多了一个「platformxmlbak」档案,往後要还原时,只要将「platformxml」删除,然後把「platformxmlbak」更改回原来名称即可。
12最後重新开启手机,即可让设定生效罗!
NOTE:
坊间已经有直接可以修改SD卡写入权限的app出现,但因为安全因素,我们还是自行手动修改比较安全。
以上就是关于android4.0后怎么获取sdcard的路径(包括外置和内置的)全部的内容,包括:android4.0后怎么获取sdcard的路径(包括外置和内置的)、Linux Android 下如何读取SD卡的ID--读取SD Card ID(SD CID)、请问手机系统安卓无法读取sd卡如何解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)