无法在Android手机上写入SD卡

时间:2013-04-04 19:35:05

标签: android

EDIT2:对于那些在谷歌这个问题上磕磕绊绊的人。 canWrite()函数有点儿错误,似乎无法正常工作。我建议不要使用它。只需catch和例外。另外,请确保您的手机未处于USB Storage模式,以便您可以写入SD卡。最后,请确保Android设备中的设置没有写保护或任何类型。

我似乎在尝试在Android手机上写入SD卡时遇到问题。如果我使用Eclipse处于调试模式,或者自己运行手机,则无关紧要。我无法写入SD卡。是的,配置了权限,如下所示。当使用Android站点上提供的代码片段时,在完成该段后,我对两个布尔值都给出了错误。我完全不知道为什么存储不可用或不可写。我从我的Mac中弹出SD卡和手机以确保它们没有使用它并且手机可以安装,但就像我说的那样,当我不使用Eclipse时我会遇到同样的问题。

编辑:根据相关信息使用运行4.04的真实Android手机。

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tinywebteam.gpstracker"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.tinywebteam.gpstracker.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>

尝试执行下面的mkdirs()时失败并抛出指定的异常:

try {
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File(sdCard.getAbsolutePath() + "/GPStracker/data/");
            if (!dir.exists()) {
                if (!dir.mkdirs())
                    throw new FileNotFoundException("Couldn't make directory.");
            }
            File fileOut = new File(dir, "GPSTracker_" + ts + ".csv");
            if (fileOut.canWrite()) {
                FileOutputStream out = new FileOutputStream(fileOut);
                out.write(fileStr.getBytes());
                out.close();
                System.out.println("File written successfully");
            } else {
                System.out.println("Could not write to file");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

3 个答案:

答案 0 :(得分:2)

根据documentation,您所描述的州意味着您无法访问外部媒体存储:

  

public static final String MEDIA_SHARED

     

在API级别1中添加getExternalStorageState()返回MEDIA_SHARED if   媒体未安装,并通过USB大容量存储共享。

     

常数值:“共享”

您需要转到USB Mass Storage选项并关闭USB存储设备。

答案 1 :(得分:0)

这是交易,你正在使用

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/GPStracker/data/");

改为使用 -

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdcard + "/GPStracker/data");

这里我们没有使用第二个'/',因为mkdirs()将它误解为创建递归目录。 你不会得到这个例外。并检查你是否通过附加'/'传递你的文件名,或者它也是这样。

答案 2 :(得分:0)

我有一个三星galaxy s3(运行android 4.1.2),我的内存名为sdCard0,我的外部SD卡名为extSdCard。

所以Environment.getExternalStorageDirectory()返回了我内部手机内存的sdCard0路径

在这种情况下,您可以使用以下内容获取实际路径。

String externalpath = new String();
String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
System.out.println("Path  of sd card external............"+externalpath);
System.out.println("Path  of internal memory............"+internalpath);
}

获得实际路径后,您可以将文件写入SD卡。