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,最后进行处理该字段读完后应该执行的操作。

参考技术A   1首先判断SD卡是否存在之前需要增加一些权限:
  <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卡是不是存在的实现的主要内容,如果未能解决你的问题,请参考以下文章

java Android判断SD卡是否存在及容量查询

Android判断是否存在外置SD卡(获取手机所有存储设备的路径)

Android HTTP下载文件并保存到本地或SD卡

android 判断一个文件是不是存在

Android--向SD卡读写数据

获取SD卡路径