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();
}
答案 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卡。