Android判断SD卡是不是存在的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android判断SD卡是不是存在的实现相关的知识,希望对你有一定的参考价值。
android作为一个智能手机操作系统,SDK对SIM卡的读取有相关的操作,都封装在framework中
和SIM卡相关的类主要有以下几个:
IccConstants (里面记录很多的常量,主要用来存储某个字段在SIM卡上的位置是什么,比如ADN(sim卡上的电话本),6F3A, FDN(固定拔号 6F3B))IccCardStatus(记录SIM卡的状态,如ABSENT, READY,UNKNOW,ETC)
IccFileHandler(这个是用来SIM卡上的RECORD读完后,要处理什么事情)
IccRecords(SIM卡上的文件内容,每一个字段,一个RECORD)
IccProvider(手机上的数据库,读出来的数据全放这)
IccUtils(里面一般全是静态方法,主要用来码制转换)
IccSmsInterfaceManager,IccCard(这个是一个抽象类,会根据上面手机的制式,自动起一个SIMCARD 或者RUIMCARD)
以GSM为例说下读取的过程:
根据SIM卡的类型,进入SIMRecords, 开始探测SIM卡的状态,因为,有些SIM卡会设置有PIN码,如果SIM卡有PIN码的话,手机会弹出输入PIN码的框,等待用户进行解码,注意,这个时候,如果PIN码如果没有解的话,手机是不会去读SIM卡的,因为,读SIM卡时,必须通过PIN才能去读,只有一些比较特殊的字段,可以不用,比如ECC 也就是紧急呼叫号码(一般存在卡上,运营商定制的)。同时,这PIN码未解的情况,手机中SIM卡的状态也是PIN_REQURIED_BLOCK。
当解完PIN码,或是手机没有设置PIN码,这时,手机的会探测到SIM是READY的状态,手机只有检测到SIM READY,才会发出读卡的请求。
手机开始读卡第一个是IMSI(International Mobile SubscriberIdentification Number)主要用来查找运营商的网络,里面有MCC,MNC,ICCID(Integrate circuit card identity)唯一标识一个移动用户。
当低层的MODEM读到字段结果后,会有一个返回结果,由于发送读取请求时,有一个事件信息EVENT_GET_BINARY_SIZE_DONE,当有返回时,会直接交给IccFileHandler,然后由IccFileHandler转发给SIMRecords,最后进行处理该字段读完后应该执行的操作。
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
2实现方法:
private boolean ExistSDCard()
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
return true;
else
return false;
扩展:
获取sd卡的路径:String path = Environment.getExternalStorageDirectory(); 参考技术B 核心提示:Android中判断SD卡是否存在,并且可以进行写操作,,可以使用如下代码if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))本回答被提问者采纳
Android HTTP下载文件并保存到本地或SD卡
想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径:
Environment.getExternalStorageDirectory()
另外,在保存之前要判断SD卡是否已经安装好,并且可读写:
//判断SDcard是否存在并且可读写 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ service.saveToSDCard(filename,filecontent); Toast.makeText(getApplicationContext(), R.string.success, 1).show(); }else{ Toast.makeText(getApplicationContext(), R.string.sdcarderror, 1).show(); }
实例
1. 下载存文本文件和下载如mp3等大容量的文件
2.代码编写
AndroidMainfest.xml中配置
主要是解决网络权限和写SDCard的权限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jingling.practice.downloadtest" > <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
package util; import android.util.Log; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /** * Created by Spring on 2015/11/7. * 下载工具类 */ public class HttpDownloader { private URL url = null; private final String TAG = "TAG"; /** * 读取文本文件 * @param urlStr url路径 * @return 文本信息 * 根据url下载文件,前提是这个文件中的内容是文本, * 1.创建一个URL对象 * 2.通过URL对象,创建一个Http连接 * 3.得到InputStream * 4.从InputStream中得到数据 */ public String download(String urlStr) { StringBuffer sb = new StringBuffer(); String line = null; BufferedReader bufferedReader = null; try { url = new URL(urlStr); //创建http连接 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //使用IO流读取数据 bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); while ((line = bufferedReader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } Log.e("TAG","下载txt文件"); Log.e("TAG",sb.toString()); return sb.toString(); } /** * 读取任何文件 * 返回-1 ,代表下载失败。返回0,代表成功。返回1代表文件已经存在 * * @param urlStr * @param path * @param fileName * @return */ public int downlaodFile(String urlStr, String path, String fileName) { InputStream input = null; try { FileUtil fileUtil = new FileUtil(); if (fileUtil.isFileExist(path + fileName)) { return 1; } else { input = getInputStearmFormUrl(urlStr); File resultFile = fileUtil.write2SDFromInput(path,fileName,input); if (resultFile == null) return -1; } } catch (IOException e) { e.printStackTrace(); return -1; } finally { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } return 0; } public InputStream getInputStearmFormUrl(String urlStr) throws IOException { url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); InputStream input = urlConn.getInputStream(); return input; } }
FileUtil.java
package util; import android.os.Environment; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * Created by Spring on 2015/11/7. */ public class FileUtil { private String SDPATH; public FileUtil() { } public String getSDPATH() { return SDPATH; } public FileUtil(String SDPATH){ //得到外部存储设备的目录(/SDCARD) SDPATH = Environment.getExternalStorageDirectory() + "/" ; } /** * 在SD卡上创建文件 * @param fileName * @return * @throws java.io.IOException */ public File createSDFile(String fileName) throws IOException { File file = new File(SDPATH + fileName); file.createNewFile(); return file; } /** * 在SD卡上创建目录 * @param dirName 目录名字 * @return 文件目录 */ public File createDir(String dirName){ File dir = new File(SDPATH + dirName); dir.mkdir(); return dir; } /** * 判断文件是否存在 * @param fileName * @return */ public boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } public File write2SDFromInput(String path,String fileName,InputStream input){ File file = null; OutputStream output = null; try { createDir(path); file =createSDFile(path + fileName); output = new FileOutputStream(file); byte [] buffer = new byte[4 * 1024]; while(input.read(buffer) != -1){ output.write(buffer); output.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } }
3.MainActivity
package com.jingling.practice.downloadtest; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import util.HttpDownloader; public class MainActivity extends Activity { HttpDownloader downloader ; private Button btn_downFile; private Button btn_downMP3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_downFile = (Button)this.findViewById(R.id.button); btn_downMP3 = (Button)this.findViewById(R.id.button2); btn_downFile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { downloader = new HttpDownloader(); String urlStr = "http://172.17.54.91:8080/download/down.txt"; downloader.download(urlStr); } }); btn_downMP3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String urlStr="http://172.17.54.91:8080/download/1.mp3"; String path="file"; String fileName="2.mp3"; HttpDownloader httpDownloader = new HttpDownloader(); httpDownloader.downlaodFile(urlStr,path,fileName); } }); } }
以上是关于Android判断SD卡是不是存在的实现的主要内容,如果未能解决你的问题,请参考以下文章