android获取sd卡路径下有没有sd卡的自动运行机制,一插卡

Android:文件下载和写入SD卡学习小结
今天刚刚学习完文件下载和写入SD卡的,以后做一个小结,以供以后学习查阅:
&一、文件下载
&&&&& Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:
&&&&& 1.创建一个HttpURLConnection对象:
// 创建一个URL对象,urlStr指的是网络IP地址&
url = new URL(urlStr);&
// 创建一个HttpURLConnection连接&
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();&
&&&&& 2.获得一个InputStream对象:
InputStream input=&
input=urlConn.getInputStream();&
&&&&& 3.设置访问网络的权限:
//在AndroidManifest.xml配置文件中加入权限信息&
&uses-permission android:name=&android.permission.INTERNET&/&&
二、访问并写入SD卡
&&&& 由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:
//得到当前设备SD卡的目录&
Environment.getExternalStorageDirectory();&
&&&& 在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
[java] view plaincopy
//在AndroidManifest.xml配置文件中加入权限信息&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE&/&&
&&&& 以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:
public class FileUtils {&
&&& private String SDPATH;&
&&& public String getSDPATH() {&
&&&&&&& return SDPATH;&
&&& public FileUtils() {&
&&&&&&& //得到当前外部存储设备的目录&
&&&&&&& // /SDCARD&
&&&&&&& SDPATH = Environment.getExternalStorageDirectory() + &/&;&
&&&& * 在SD卡上创建文件
&&&& * @throws IOException
&&& public File creatSDFile(String fileName) throws IOException {&
&&&&&&& File file = new File(SDPATH + fileName);&
&&&&&&& file.createNewFile();&
&&&& * 在SD卡上创建目录
&&&& * @param dirName
&&& public File creatSDDir(String dirName) {&
&&&&&&& File dir = new File(SDPATH + dirName);&
&&&&&&& dir.mkdir();&
&&&& * 判断SD卡上的文件夹是否存在
&&& public boolean isFileExist(String fileName){&
&&&&&&& File file = new File(SDPATH + fileName);&
&&&&&&& return file.exists();&
&&&& * 将一个InputStream里面的数据写入到SD卡中
&&& public File write2SDFromInput(String path,String fileName,InputStream input){&
&&&&&&& File file =&
&&&&&&& OutputStream output =&
&&&&&&& try{&
&&&&&&&&&&& creatSDDir(path);&
&&&&&&&&&&& file = creatSDFile(path + fileName);&
&&&&&&&&&&& output = new FileOutputStream(file);&
&&&&&&&&&&& byte buffer [] = new byte[4 * 1024];&
&&&&&&&&&&& while((input.read(buffer)) != -1){&
&&&&&&&&&&&&&&& output.write(buffer);&
&&&&&&&&&&& }&
&&&&&&&&&&& output.flush();&
&&&&&&& }&
&&&&&&& catch(Exception e){&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&&&&&& finally{&
&&&&&&&&&&& try{&
&&&&&&&&&&&&&&& output.close();&
&&&&&&&&&&& }&
&&&&&&&&&&& catch(Exception e){&
&&&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& }&
&&&&&&& }&
三、实例演示
&&&& 在对以上文件下载和SD卡访问基本知识了解的基础上,下面进行举例说明:
&&&& 文件下载一般有文本文件和字节文件,不同文件下载的方式不同,但是都需要通过上面所说的一般步骤,即都需要首先得到一个InputStream对象,然后在对这个对象进行不同的操作,以下是对一个图片文件(字节文件)进行处理,我们在以上FileUtils类的基础上创建一个HttpDownLoader类,以供文件下载时作为工具类调用:
public class HttpDownloader {&
&&& private URL url=&
&&& FileUtils fileUtils=new FileUtils();&
&&& public int downfile(String urlStr,String path,String fileName)&
&&&&&&& if(fileUtils.isFileExist(path+fileName))&
&&&&&&&&&&& {return 1;}&
&&&&&&& else{&
&&&&&&& try {&
&&&&&&&&&&& InputStream input=&
&&&&&&&&&&& input = getInputStream(urlStr);&
&&&&&&&&&&& File resultFile=fileUtils.write2SDFromInput(path, fileName, input);&
&&&&&&&&&&& if(resultFile==null)&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&& return -1;&
&&&&&&&&&&& }&
&&&&&&& } catch (IOException e) {&
&&&&&&&&&&& // TODO Auto-generated catch block&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&&&&&& }&
&&&&&&& return 0;&
& //由于得到一个InputStream对象是所有文件处理前必须的操作,所以将这个操作封装成了一个方法&
&&&&&& public InputStream getInputStream(String urlStr) throws IOException&
&&&&&& {&&&&&&
&&&&&&&&&& InputStream is=&
&&&&&&&&&&& try {&
&&&&&&&&&&&&&&& url=new URL(urlStr);&
&&&&&&&&&&&&&&& HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();&
&&&&&&&&&&&&&&& is=urlConn.getInputStream();&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&& } catch (MalformedURLException e) {&
&&&&&&&&&&&&&&& // TODO Auto-generated catch block&
&&&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& }&
&&&&&&&&&&&&&
&&&&&&&&&&&&
&& 下面编写Activity文件进行文件的操作:
public class MainActivity extends Activity {&
&&& private Button downfile=&
&&& @Override&
&&& public void onCreate(Bundle savedInstanceState) {&
&&&&&&& super.onCreate(savedInstanceState);&
&&&&&&& setContentView(R.layout.activity_main);&
&&&&&&& downfile=(Button)findViewById(R.id.downfile);&
&&&&&&& downfile.setOnClickListener(new View.OnClickListener() {&
&&&&&&& downfile.setOnClickListener(new View.OnClickListener() {&
&&&&&&&&&&&&&
&&&&&&&&&&& @Override&
&&&&&&&&&&& public void onClick(View v) {&
&&&&&&&&&&&&&&& // TODO Auto-generated method stub&
&&&&&&&&&&&&&&& HttpDownloader httpDownLoader=new HttpDownloader();&
&&&&&&&&&&&&&&&&& int result=httpDownLoader.downfile(&https://219.216.197.96:8080/test//file.jpg&, &test/&, &test.jpg&);&
&&&&&&&&&&&&&&&&& if(result==0)&
&&&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&&&& Toast.makeText(MainActivity.this, &下载成功!&, Toast.LENGTH_SHORT).show();&
&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&& else if(result==1) {&
&&&&&&&&&&&&&&&&&&&&& Toast.makeText(MainActivity.this, &已有文件!&, Toast.LENGTH_SHORT).show();&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&& else if(result==-1){&
&&&&&&&&&&&&&&&&&&&&& Toast.makeText(MainActivity.this, &下载失败!&, Toast.LENGTH_SHORT).show();&
&&&&&&&&&&&&&&&&& }&&
&&&&&&&&&&& }&
&&&&&&& });&
&&& @Override&
&&& public boolean onCreateOptionsMenu(Menu menu) {&
&&&&&&& getMenuInflater().inflate(R.menu.activity_main, menu);&
&注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。
&&&&&& 上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。Android SDCard Mount流程分析(一)
前段时间对 的SDCard unmount 流程进行了几篇简短的分析,由于当时只是纸上谈兵,没有实际上的跟进,可能会有一些误导人或者小错误。今天重新梳理了头绪,针对mount的流程再重新分析一次。
&&android 如何开机启动监听mount服务
&&默认挂载点在Android 系统的哪个目录
&&vold.fstab 配置文件的分析&
&&vold 里面启动页面main做了些什么
android 系统如何开机启动监听mount服务
android sdcard 热插拔监测和执行操作是由一个启动文件vold& 所统领的,系统开机会读取初始化配置文件init.rc,该文件位于比如我的板子是:device/ti/omap3evm/init.rc,具体根据自己平台查找。里面有一个是默认启动vold 服务的代码,如下:
service vold /system/bin/vold
&&& socket vold stream 0660 root mount
&&& ioprio be 2&
&如果要对该文件做出修改之类,要重新编一下boot.img 镜像文件,烧录进android 系统,之后可以在android的文件系统根目录找到init.rc文件。上述代码为启动vold 启动文件,也可以在init.rc 增加多一些我们想要的文件目录,比如增加一个可以存放多分区挂载的目录等,这个是后话。
&默认挂载点在Android 系统的哪个目录
&usbdisk 或者 sdcard 热插拔的时候,kernel 会发出命令执行mount或者unmount 操作,但这都是驱动级的。而mount 目录会在android 的文件系统目录下:/dev/block/vold 这个目录由vold 生成,用来存放所有的usbdisk 或者 sdcard 的挂载点。代码位于main里面最优先执行:
mkdir(&/dev/block/vold&, 0755);
&可以根据这个目录找到如下节点:
sh-4.1# ls /dev/block/vold/
179:0& 179:1& 8:0&&& 8:1&&& 8:2&&& 8:3&&& 8:4&
节点的小介绍:
0代表当前的整个设备,1代码当前设备的分区名称代号。
所以你会发现,sdcard只有一个分区它却生成了两个如:179:0 179:1
而usbdisk 有四个分区,它会生成五个挂载点: 8:0&&& 8:1&&& 8:2&&& 8:3&&& 8:4& 就是这个原因。
&vold.fstab 配置文件的分析
vold 里面会通过指定文件来读取预先配置好的sdcard或者多分区配置文件,该文件位于
/system/core/rootdir/etc/vold.fstab
如以下的配置文件为:
dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1
&dev_mount 代表挂载格式
&sdcard 代表挂载的标签
/mnt/sdcard 代表挂载点
&auto 为自定义选项可以为任何,但必须在main 里面自己判断比如这里的意思为自动挂载
后面两个目录为设备路径,第一个如果被占用会选择第二个
配置文件可以根据自己的需要编写,并不是固定的,但最好遵循google vold 启动文件代码的格式编写,要不然会给我们修改代码或者增加多分区功能带来不小的麻烦,如以下我自己编写的多分区挂载支持vold.fstab 配置文件:
&dev_mount sdcard external /mnt/sdcard auto /devices/platform/mmci-omap-hs.0/mmc_host/mmc0 /devices/platform/mmci-omap-hs.0/mmc_host/mmc1
dev_mount usb1 external /mnt/usbdisk/usb1-disk%d all /devices/platform/ehci-omap.0/usb1/1-2/1-2.1/
dev_mount usb2 external /mnt/usbdisk/usb2-disk%d all /devices/platform/ehci-omap.0/usb1/1-2/1-2.2/
dev_mount usb3 external /mnt/usbdisk/usb3-disk%d all /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/
&该文件修改后经系统编译会在android 系统目录里/system/etc/vold.fstab找到。
&/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/& 代表要挂载的USB口。
vold.fstab 只是一个单纯的配置文件,具体的读取和取数据还 是要靠main里面的process_config函数。看代码,里面正有一段用来读取配置文件:
& if (!(fp = fopen(&/etc/vold.fstab&, &r&))) {
&&&&&&& return -1;
在这个函数里面会根据读取到的数据存放起来,然后满足条件时执行操作。比如代码里面的:
if (!strcmp(type, &dev_mount&)) {
&&&&&&&&&&& DirectVolume *dv = NULL;
&&&&&&&&&&& char *
&&&&&&&&&&& if (!(part = strtok_r(NULL, delim, &save_ptr))) {
&&&&&&&&&&&&&&& SLOGE(&Error parsing partition&);
&&&&&&&&&&&&&&& goto out_
&&&&&&&&&&& }
&&&&&&&&&&& if (strcmp(part, &auto&) && atoi(part) == 0) {
&&&&&&&&&&&&&&& SLOGE(&Partition must either be 'auto' or 1 based index instead of '%s'&, part);
&&&&&&&&&&&&&&& goto out_
&&&&&&&&&&& }
&&&&&&&&&&& if (!strcmp(part, &auto&)) {
&&&&&&&&&&&&&&& dv = new DirectVolume(vm, label, mount_point, -1);
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& dv = new DirectVolume(vm, label, mount_point, atoi(part));
&&&&&&&&&&& }
&&&&&&&&&&& while ((sysfs_path = strtok_r(NULL, delim, &save_ptr))) {
&&&&&&&&&&&&&&& if (*sysfs_path != '/') {
&&&&&&&&&&&&&&&&&&& /* If the first character is not a '/', it must be flags */
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if (dv-&addPath(sysfs_path)) {
&&&&&&&&&&&&&&&&&&& SLOGE(&Failed to add devpath %s to volume %s&, sysfs_path,
&&&&&&&&&&&&&&&&&&&&&&&& label);
&&&&&&&&&&&&&&&&&&& goto out_
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& /* If sysfs_path is non-null at this point, then it contains
&&&&&&&&&&&& * the optional flags for this volume
&&&&&&&&&&&& */
&&&&&&&&&&& if (sysfs_path)
&&&&&&&&&&&&&&& flags = parse_mount_flags(sysfs_path);
&&&&&&&&&&& else
&&&&&&&&&&&&&&& flags = 0;
&&&&&&&&&&& dv-&setFlags(flags);
&&&&&&&&&&& vm-&addVolume(dv);
DirectVolume后面会讲到,执行mount 和unmount 都是它在做。
另外,有时后读取配置文件会有问题,这是因为它读取是通过指标下标递增的方式在读,如果有问题可以跟踪打印一下配置文件,看哪里需要修改。
&vold 里面启动页面main做了些什么
main 主要是初始化socket 连接监听数据变化,在系统起来时第一时间启动,并且通过读取配置文件来识别usb口或者sdcard 的设备地址,来mount 或者unmount 。其它执行mount 、 unmount& 或者删除节点等操作都是由上层或者framework 发送命令给main让其通知volumeManage 执行相应的操作。
摘自& Terry_龙&教你将Android机外置SD卡改为系统默认第一外接储存_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
教你将Android机外置SD卡改为系统默认第一外接储存
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢Android 判断是否有外置SD卡(包含手机存储的情况下)
& & & & &欢迎大家我分享和推荐好用的代码段~~
& & & & &欢迎转载,但请保留文章原始出处:
& & & & &CSDN:https://www.csdn.net
& & & & &雨季o莫忧离:https://blog.csdn.net/luckkof
String path =
path = android.os.SystemProperties.get(&external_sd_path&);
LogUtils.d(TAG, &current card id=
& + path);
} catch (IllegalArgumentException e) {
if(path.equals(&/storage/sdcard0&)){
LogUtils.d(TAG, &current card id=
有sd卡& + path);
LogUtils.d(TAG, &current card id=
没有sd卡& + path);

我要回帖

更多关于 萤石 sd卡 未插卡 的文章

 

随机推荐