2013-04-04 178 views
3

EDIT2:適用人羣對面谷歌這個問題的絆腳石。 canWrite()功能有點兒錯誤,似乎不能正常工作。我會建議不要使用它。只是catch和例外。另外請確保您的手機不在USB Storage模式下,以便您可以寫入SD卡。最後確保Android設備中的設置沒有寫保護或類似的東西。無法寫入SD卡Android手機上

我似乎有試圖寫我的SD卡我的Android手機上的問題。如果我使用Eclipse進行調試模式或自行運行手機,則無關緊要。我無法寫入SD卡。是,配置權限,如下所示。當使用Android網站上提供的代碼片段時,我將在完成該段後爲兩個布爾值賦予false。我完全不知道爲什麼存儲不可用或不可寫。我從我的Mac彈出SD卡和手機,以確保他們沒有使用它,並且手機可以掛載,但就像我說的,當我不使用Eclipse時,我遇到了同樣的問題。

編輯:使用真正的Android手機將根據有關信息運行4.04。

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

您使用的是真實設備還是仿真器?什麼是'sdCard.getAbsolutePath()'返回? – 2013-04-04 19:43:27

+0

使用真正的Android手機 – MasterGberry 2013-04-04 19:43:43

+0

您的手機是否有外置SD卡?並非所有的事情 - 例如Nexus系列都沒有。 – 2013-04-04 19:45:03

回答

2

按照documentation,國家你描述意味着外部存儲媒體無法訪問你:

公共靜態最終字符串在API級別1 getExternalStorageState()MEDIA_SHARED

新增返回如果 介質被本未安裝,並且經由USB大容量存儲共享MEDIA_SHARED。

常數值:「共享」

你需要去您的USB大容量存儲選項,並關閉USB存儲器。

+0

嘿,這工作。謝謝!此外,我似乎現在有'canWrite()'函數返回false的問題。有任何想法嗎?在我看來,對mkdirs()也沒有做,因爲我找不到目錄。但這次它返回了「true」。 – MasterGberry 2013-04-04 22:07:14

+0

是的,因爲它看起來多餘的反斜槓給你帶來麻煩(按照@ Darpan的答案)'File dir = new File(sdCard.getAbsolutePath()+「/ GPStracker/data /」);'。可能會對你使用絕對路徑造成一些麻煩...... – DigCamara 2013-04-04 22:15:27

+0

我已經改變了他的解決方案。瀏覽電話的文件系統時仍然看不到該文件夾​​。 – MasterGberry 2013-04-04 22:22:53

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()曲解它看成遞歸目錄。 你不會得到這個例外。並檢查你是否通過你的文件名後附加'/',或者它也可以這樣工作。

+0

不像前面提到的那樣,兩個變量 – MasterGberry 2013-04-04 21:57:08

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卡。

+0

爲外部路徑和內部路徑獲取「」「 – MasterGberry 2013-04-04 21:59:54

+0

呃,這是什麼黑客,是不是有更復雜的東西? – tmanthey 2013-11-30 12:19:38

+0

@tmanthey這是不推薦的做法,我建議你不要使用它,我回答了很久,現在它肯定不是最好的答案,有些複雜的東西跟隨着文檔,如果你仍然想使用,你可以繼續。 – Raghunandan 2013-11-30 18:04:26