2011-01-02 14 views
10

Mam dziwny problem, z którym się zetknąłem. Moja aplikacja może zapisać prosty plik tekstowy na karcie SD, a czasami działa dla niektórych osób, ale nie dla innych i nie mam pojęcia, dlaczego.Zapisywanie pliku tekstowego na kartę SD kończy się niepowodzeniem.

Dla niektórych osób wymusza zamknięcie, jeśli umieści w pliku niektóre znaki, takie jak ... i inne. Nie mogę tego odtworzyć, ponieważ nie miałem żadnych problemów, ale jest to kod, który obsługuje zapisywanie plików. Czy ktoś może pomyśleć o czymś, co może prowadzić do problemów lub lepszego sposobu na zrobienie tego?

public void generateNoteOnSD(String sFileName, String sBody) 
{ 
    try 
    { 
     File root = new File(Environment.getExternalStorageDirectory(), "Notes"); 
     if (!root.exists()) 
     { 
      root.mkdirs(); 
     } 

     File gpxfile = new File(root, sFileName); 
     FileWriter writer = new FileWriter(gpxfile); 
     writer.append(sBody); 
     writer.flush(); 
     writer.close(); 

     Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
     importError = e.getMessage(); 
     iError(); 
    } 
} 
+0

Czy telefon z Androidem używasz zakorzenione lub nie zakorzenione telefon? –

Odpowiedz

6

Czy sprawdzasz, czy pamięć zewnętrzna jest zapisywalna? Jeśli nie, to spróbuj ...

Environment.getExternalStorageState() 

To powie Ci, czy karta SD jest zamontowany i można również sprawdzić, czy jest zapisywalny. To wszystko, co mogę zaproponować w tym momencie.

0

Używam zazwyczaj PrintWriter zamiast FileWriter. Nie wiem, czy to rozwiązałoby twój problem, ale jest na wyższym poziomie, więc może zająć się czymś więcej niż zwykłym FileWriter.

15

Możesz użyć tej metody, aby sprawdzić stan deaddCard. Zmień toastowe okno dialogowe na język:

** Opieka z MEDIA_MOUNTED_READ_ONLY. W bez konieczności pisania w SDCard i powrót prawdziwej **

public static Boolean comprobarSDCard(Context mContext) { 
    String auxSDCardStatus = Environment.getExternalStorageState(); 

    if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED)) 
     return true; 
    else if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { 
     Toast.makeText(
       mContext, 
       "Warning, the SDCard it's only in read mode.\nthis does not result in malfunction" 
         + " of the read aplication", Toast.LENGTH_LONG) 
       .show(); 
     return true; 
    } else if (auxSDCardStatus.equals(Environment.MEDIA_NOFS)) { 
     Toast.makeText(
       mContext, 
       "Error, the SDCard can be used, it has not a corret format or " 
         + "is not formated.", Toast.LENGTH_LONG) 
       .show(); 
     return false; 
    } else if (auxSDCardStatus.equals(Environment.MEDIA_REMOVED)) { 
     Toast.makeText(
       mContext, 
       "Error, the SDCard is not found, to use the reader you need " 
         + "insert a SDCard on the device.", 
       Toast.LENGTH_LONG).show(); 
     return false; 
    } else if (auxSDCardStatus.equals(Environment.MEDIA_SHARED)) { 
     Toast.makeText(
       mContext, 
       "Error, the SDCard is not mounted beacuse is using " 
         + "connected by USB. Plug out and try again.", 
       Toast.LENGTH_LONG).show(); 
     return false; 
    } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTABLE)) { 
     Toast.makeText(
       mContext, 
       "Error, the SDCard cant be mounted.\nThe may be happend when the SDCard is corrupted " 
         + "or crashed.", Toast.LENGTH_LONG).show(); 
     return false; 
    } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTED)) { 
     Toast.makeText(
       mContext, 
       "Error, the SDCArd is on the device but is not mounted." 
         + "Mount it before use the app.", 
       Toast.LENGTH_LONG).show(); 
     return false; 
    } 

    return true; 
} 
+0

@Aracem ... czy możesz zaktualizować napisy w języku angielskim, które napisałeś w swoim kodzie, nie dostałem ich, Dzięki – swiftBoy

+0

@RDC Done! przepraszam za szybkie tłumaczenie – Aracem

+0

@Aracem .. yeah! dziękuję :) – swiftBoy

3

Dla wszystkich współobywateli początkujących tam debugowania na rzeczywistym urządzeniu przez USB: Nie zapomnij odłączyć kabel USB od komputera dev, lubię zrobił. Po podłączeniu USB karta SD jest niedostępna. Szczęśliwe pisanie pliku ...

To nie jest poprawne we wszystkich wersjach telefonów/pamięci ROM. CMod7 i MIUI ROMS zarówno pozwalają na ustawienie, czy karta SD jest zamontowana, czy nie, po podłączeniu do komputera, w zależności od ustawień powyższe mogą być prawdziwe. Najlepiej sprawdzić.

+0

W moim HTC Wildfire, mam go podłączony, ale po prostu wybierz tryb "Tylko ładuj", a moje karty SD jako zapisywalne. Zwróć uwagę na krótki komunikat potwierdzający "przygotowanie karty SD ..." lub niektórych takich –

5

Właśnie się dowiedziałem, że w moim przypadku brakowało dodania <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> w pliku manifestu.

Cheers,

Wahib

Powiązane problemy