如何往外置sd卡中写入数据 android开发 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 package com.cshis.DGRHotel.SDCardReader;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import com.cshis.DGRHotel.SDCardReader.Dev_MountInfo.DevInfo;import android.os.Environment;/** * 取外置SD卡路径类 * @author WangYimin * */public class Dev_MountInfo implements IDev { /** * *** */ public final String HEAD = "dev_mount"; public final String LABEL = "<label>"; public final String MOUNT_POINT = "<mount_point>"; public final String PATH = "<part>"; public final String SYSFS_PATH = "<sysfs_path1...>"; /** * Label for the volume */ private final int NLABEL = 1; /** * Partition */ private final int NPATH = 2; /** * Where the volume will be mounted */ private final int NMOUNT_POINT = 3; private final int NSYSFS_PATH = 4; private final int DEV_INTERNAL = 0; private final int DEV_EXTERNAL = 1; private ArrayList<String> cache = new ArrayList<String>(); private static Dev_MountInfo dev; private DevInfo info; private final File VOLD_FSTAB = new File(Environment.getRootDirectory() .getAbsoluteFile() + File.separator + "etc" + File.separator + "vold.fstab"); public static Dev_MountInfo getInstance() { if (null == dev) dev = new Dev_MountInfo(); return dev; } private DevInfo getInfo(final int device) { // for(String str:cache) // System.out.println(str); if (null == info) info = new DevInfo(); try { initVoldFstabToCache(); } catch (IOException e) { e.printStackTrace(); } if (device >= cache.size()) return null; String[] sinfo = cache.get(device).split(" "); info.setLabel(sinfo[NLABEL]); info.setMount_point(sinfo[NMOUNT_POINT]); info.setPath(sinfo[NPATH]); info.setSysfs_path(sinfo[NSYSFS_PATH]); return info; } /** * init the words into the cache array * @throws IOException */ private void initVoldFstabToCache() throws IOException { cache.clear(); BufferedReader br = new BufferedReader(new FileReader(VOLD_FSTAB)); String tmp = null; while ((tmp = br.readLine()) != null) { // the words startsWith "dev_mount" are the SD info if (tmp.startsWith(HEAD)) { cache.add(tmp); } } br.close(); cache.trimToSize(); } public class DevInfo { private String label, mount_point, path, sysfs_path; /** * return the label name of the SD card * @return */ public String getLabel() { return label; } private void setLabel(String label) { this.label = label; } /** * the mount point of the SD card * @return */ public String getMount_point() { return mount_point; } private void setMount_point(String mount_point) { this.mount_point = mount_point; } /** * SD mount path * @return */ public String getPath() { return path; } private void setPath(String path) { this.path = path; } /** * "unknow" * @return */ public String getSysfs_path() { return sysfs_path; } private void setSysfs_path(String sysfs_path) { this.sysfs_path = sysfs_path; } } @Override public DevInfo getInternalInfo() { return getInfo(DEV_INTERNAL); } @Override public DevInfo getExternalInfo() { return getInfo(DEV_EXTERNAL); }}interface IDev { DevInfo getInternalInfo(); DevInfo getExternalInfo();}调用方法: Dev_MountInfo dev = Dev_MountInfo.getInstance(); DevInfo info = dev.getInternalInfo();// Internal SD Card Informations info = dev.getExternalInfo();// External SD Card Informations PATH.ROOT_SDCARD_PATH = info.getPath(); PATH.ROOT_INSIDE_PATH = Environment.getExternalStorageDirectory() .getAbsolutePath(); 原生的android系统,Environment.getExternalStorageDirectory()获取的是外部的sd卡,三星的应该都内置一个sd卡,程序默认读到的都是内置的,外置的sd卡的话,应该是三星另外做了个接口出来的,可以反射查看下Environment类下的接口方法就知道了 我用我同学的手机做的测试、 不是三星的 得到的也是内置内存卡的路径然后我问了一个做开发的同学 他告诉我是因为现在手机内置内存都比较大了 所以许多手机中直接就把内置内存挂载为sdcard了 而getExternalStorageDirectory()这个方法得到的其实是app可读写的地方 就是这个挂载了的内置内存了 语言表述不是特别好 将就着理解吧 问题最新进度: 按照同学提的意见 因为开发的特殊性 所以直接用了绝对路径 可是在绝对路径生成的file中, 无法生成第二层文件夹 即比如先在外置内存卡中已经生成了A这个文件夹,但是在A的文件夹之下无法生成子文件夹 这是为什么? 感觉像是无法对A这个文件夹之下进行任何写入操作一样 这是为什么? 文件夹没有时要自己创建的对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何 文件夹没有时要自己创建的对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何因为获取的路径不对,所以创建不了 文件夹没有时要自己创建的对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何因为获取的路径不对,所以创建不了感觉不是这个原因啊 我这个应用本来之前照片是存在内置内存中的 路径比如是sdcard/AAA/bbb 这里没有任何问题 可以看到内置内存里有AAA文件夹和子文件夹bbb以及bbb里面的照片然后我把这个绝对路径直接前缀部分改了其他任何东西都没有改动 即变为:/storage/extSdCard/AAA/bbb 这个外置内存卡的绝对路径导致的结果就是只能在外置内存卡中看到AAA的第一层文件夹 它内部的bbb子文件夹没有生成 这应该不会是因为文件夹路径的问题不对吧? 你也可以直接打内存卡的绝对路径,假设你的外内存卡的路径是/storage/sdcard1 那么路径就是:String SdcardPath = "/storage/sdcard1" 印象中Android默认的外置内存卡的路径是“/storage/sdcard0”(“/mnt/sdcard”也可以) 可能三星把路径改了,可是获得外置内存卡路径的方法还是用Google原生的。 你可以安装root explorer文件管理查看一下路径 我用的就是RootExplorer 写的就是绝对路径 现在其实已经可以连接到外置sd卡了 问题在于生产文件夹的时候只能在外置sd卡最外层生产 但是内部的子文件夹就没办法生产了 更加无法在生产的第一层文件夹内写入数据了 并不是路径问题找不到我的内置内存卡路径是 sdcard/AAA/bbb(或者是/storage/sdcard/AAA/bbb) 我如果是用的这个内置内存卡的路径任何操作和数据的写入等都没有任何问题 一切正常 但是如果只是把路径改为外置内存卡绝对路径/storage/extSdCard/AAA/bbb的话 结果就是只能得到最外层的AAA文件夹 但是内部应该还有一个子文件夹bbb却无法得到 然后我做了测试再写了一个File 这个file用的路径就是/storage/extSdCard/AAA/bbb 因为之前已经有了AAA这个文件夹 我判断这个新的file是否存在 然后不存在就调用file.mkdirs() 独立生存内部的bbb这个子文件夹 通过添加判断发现这个文件夹不存在 但是也无法创建bbb这个子文件夹 公司“单位通讯录”项目 关于android ScrollView的滚动事件 launchMode设置为singletask的一点疑问,标题要长。。。 求指出错误的地方 ListAdapter问题 有些activity里面无法调节音量 发个自己做的植物大战僵尸的源代码 为什么SDKManager没有intel atom system image这一项 Android ImageView 动态刷新显示图片 速度 渲染等问题 谁能用安卓播放此url视频? android中在另一个文件中写该类的方法 如何实现apk重启
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;import com.cshis.DGRHotel.SDCardReader.Dev_MountInfo.DevInfo;import android.os.Environment;
/**
* 取外置SD卡路径类
* @author WangYimin
*
*/
public class Dev_MountInfo implements IDev {
/**
* ***
*/
public final String HEAD = "dev_mount";
public final String LABEL = "<label>";
public final String MOUNT_POINT = "<mount_point>";
public final String PATH = "<part>";
public final String SYSFS_PATH = "<sysfs_path1...>"; /**
* Label for the volume
*/
private final int NLABEL = 1;
/**
* Partition
*/
private final int NPATH = 2;
/**
* Where the volume will be mounted
*/
private final int NMOUNT_POINT = 3;
private final int NSYSFS_PATH = 4; private final int DEV_INTERNAL = 0;
private final int DEV_EXTERNAL = 1; private ArrayList<String> cache = new ArrayList<String>(); private static Dev_MountInfo dev;
private DevInfo info; private final File VOLD_FSTAB = new File(Environment.getRootDirectory()
.getAbsoluteFile()
+ File.separator
+ "etc"
+ File.separator
+ "vold.fstab"); public static Dev_MountInfo getInstance() {
if (null == dev)
dev = new Dev_MountInfo();
return dev;
} private DevInfo getInfo(final int device) {
// for(String str:cache)
// System.out.println(str); if (null == info)
info = new DevInfo(); try {
initVoldFstabToCache();
} catch (IOException e) {
e.printStackTrace();
} if (device >= cache.size())
return null;
String[] sinfo = cache.get(device).split(" "); info.setLabel(sinfo[NLABEL]);
info.setMount_point(sinfo[NMOUNT_POINT]);
info.setPath(sinfo[NPATH]);
info.setSysfs_path(sinfo[NSYSFS_PATH]); return info;
} /**
* init the words into the cache array
* @throws IOException
*/
private void initVoldFstabToCache() throws IOException {
cache.clear();
BufferedReader br = new BufferedReader(new FileReader(VOLD_FSTAB));
String tmp = null;
while ((tmp = br.readLine()) != null) {
// the words startsWith "dev_mount" are the SD info
if (tmp.startsWith(HEAD)) {
cache.add(tmp);
}
}
br.close();
cache.trimToSize();
} public class DevInfo {
private String label, mount_point, path, sysfs_path; /**
* return the label name of the SD card
* @return
*/
public String getLabel() {
return label;
} private void setLabel(String label) {
this.label = label;
} /**
* the mount point of the SD card
* @return
*/
public String getMount_point() {
return mount_point;
} private void setMount_point(String mount_point) {
this.mount_point = mount_point;
} /**
* SD mount path
* @return
*/
public String getPath() {
return path;
} private void setPath(String path) {
this.path = path;
} /**
* "unknow"
* @return
*/
public String getSysfs_path() {
return sysfs_path;
} private void setSysfs_path(String sysfs_path) {
this.sysfs_path = sysfs_path;
} } @Override
public DevInfo getInternalInfo() {
return getInfo(DEV_INTERNAL);
} @Override
public DevInfo getExternalInfo() {
return getInfo(DEV_EXTERNAL);
}
}interface IDev {
DevInfo getInternalInfo(); DevInfo getExternalInfo();
}调用方法:
Dev_MountInfo dev = Dev_MountInfo.getInstance();
DevInfo info = dev.getInternalInfo();// Internal SD Card Informations
info = dev.getExternalInfo();// External SD Card Informations PATH.ROOT_SDCARD_PATH = info.getPath();
PATH.ROOT_INSIDE_PATH = Environment.getExternalStorageDirectory()
.getAbsolutePath();
然后我问了一个做开发的同学 他告诉我是因为现在手机内置内存都比较大了 所以许多手机中直接就把内置内存挂载为sdcard了 而getExternalStorageDirectory()这个方法得到的其实是app可读写的地方 就是这个挂载了的内置内存了 语言表述不是特别好 将就着理解吧
可是在绝对路径生成的file中, 无法生成第二层文件夹 即比如先在外置内存卡中已经生成了A这个文件夹,但是在A的文件夹之下无法生成子文件夹 这是为什么? 感觉像是无法对A这个文件夹之下进行任何写入操作一样 这是为什么?
文件夹没有时要自己创建的
对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何
文件夹没有时要自己创建的
对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何因为获取的路径不对,所以创建不了
文件夹没有时要自己创建的
对呀 我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊 可是就是死活创建不了 真心不知道为什么 给我的感觉就好像是没有对该文件进行操作的权限一样 不知道为何因为获取的路径不对,所以创建不了
感觉不是这个原因啊 我这个应用本来之前照片是存在内置内存中的 路径比如是sdcard/AAA/bbb 这里没有任何问题 可以看到内置内存里有AAA文件夹和子文件夹bbb以及bbb里面的照片
然后我把这个绝对路径直接前缀部分改了其他任何东西都没有改动 即变为:/storage/extSdCard/AAA/bbb 这个外置内存卡的绝对路径导致的结果就是只能在外置内存卡中看到AAA的第一层文件夹 它内部的bbb子文件夹没有生成 这应该不会是因为文件夹路径的问题不对吧?
问题在于生产文件夹的时候只能在外置sd卡最外层生产 但是内部的子文件夹就没办法生产了 更加无法在生产的第一层文件夹内写入数据了 并不是路径问题找不到
我的内置内存卡路径是 sdcard/AAA/bbb(或者是/storage/sdcard/AAA/bbb) 我如果是用的这个内置内存卡的路径任何操作和数据的写入等都没有任何问题 一切正常
但是如果只是把路径改为外置内存卡绝对路径/storage/extSdCard/AAA/bbb的话 结果就是只能得到最外层的AAA文件夹 但是内部应该还有一个子文件夹bbb却无法得到 然后我做了测试再写了一个File 这个file用的路径就是/storage/extSdCard/AAA/bbb 因为之前已经有了AAA这个文件夹 我判断这个新的file是否存在 然后不存在就调用file.mkdirs() 独立生存内部的bbb这个子文件夹 通过添加判断发现这个文件夹不存在 但是也无法创建bbb这个子文件夹