2010-10-13 7 views
4

J'ai un problème d'écriture sur la carte SD, voici le code: (Désolé pour la mise en page du code, il suffit de copier PASED il)L'autorisation d'écrire sur la carte SD Android

public class SaveAndReadManager { 

private String result; 
private String saveFileName = "eventlist_savefile"; 

public String writeToFile(ArrayList<Event> arrlEvents){ 
    FileOutputStream fos = null; 
    ObjectOutputStream out = null; 

    try{ 
    File root = Environment.getExternalStorageDirectory(); 

    if(root.canWrite()){ 
    fos = new FileOutputStream(saveFileName); 
    out = new ObjectOutputStream(fos); 
    out.writeObject(arrlEvents); 

    result = "File written"; 

    out.close(); 
    }else{ 
    result = "file cant write"; 
    } 
    }catch(IOException e){ 
    e.printStackTrace(); 
    result = "file not written"; 
    } 

    return result; 
} 

public boolean readFromFile(){ 
    return false; 
} 
} 

Je n'ai pas implémenté readFromFile() pour le moment. Le problème est que root.canWrite() retourne false tout le temps. Voici le fichier manifeste:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".InfoScreen" 
      android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

<activity android:name=".EventCalendar" 
       android:label="@string/app_name" /> 

    <activity android:name=".MakeEvent" 
       android:label="@string/app_name" /> 

    <activity android:name=".ViewEvent" 
       android:label="@string/app_name" /> 

</application> 
<uses-sdk android:minSdkVersion="8" /> 

J'ai demandé la permission d'écrire, et sur mon AVD, si je vais aux paramètres -> Carte SD et stockage de téléphone, il me dit que j'ai 1 Go sur la carte SD pour écrire. S'il vous plaît aider.

Merci :)

Répondre

3

Quel résultat voyez-vous retunred de writeToFile? "fichier non écrit" ou "fichier ne peut pas écrire"?

Lorsque j'ai exécuté votre code, il est tombé dans le bloc catch IOException avec le résultat de "fichier non écrit". La raison en est que fos a été défini de manière incorrecte:

fos = new FileOutputStream(saveFileName); 

devrait être:

fos = new FileOutputStream(root + "/" saveFileName); 

Après avoir changé cette ligne, je suis le résultat « Fichier écrit » retour de writeToFile.

+0

Merci, cela a fonctionné parfaitement: D – lands

6

Essayez de vérifier l'état de la carte SD avant de tenter d'écrire. Il peut être utilisé comme un lecteur partagé, corrompu, plein, etc. Une liste d'états se trouve ici: http://developer.android.com/reference/android/os/Environment.html

Voici un exemple d'obtenir les états:

String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     mExternalStorageAvailable = mExternalStorageWriteable = true; 
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
     mExternalStorageAvailable = true; 
     mExternalStorageWriteable = false; 
    } else { 
     mExternalStorageAvailable = mExternalStorageWriteable = false; 
    } 
0

J'utilise le code suivant pour enregistrer des données audio (avec succès) sur la carte SD de mon Android. Mon application nécessite l'autorisation RECORD_AUDIO, mais rien d'autre.

File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + FILE_NAME); 

if (file.exists()) 
    file.delete();               // Delete any previous recording 

try 
{ 
    file.createNewFile();             // Create the new file 
} 
catch (IOException e) 
{ 
    Log.e (TAG, "Failed to create " + file.toString()); 
} 

try 
{ 
    OutputStream   os = new FileOutputStream  (file); 
    BufferedOutputStream bos = new BufferedOutputStream (os, 8000); 
    DataOutputStream  dos = new DataOutputStream  (bos);   // Create a DataOutputStream to write the audio data to the file 

    // Create an AudioRecord object to record the audio 
    int   bufferSize  = AudioRecord.getMinBufferSize (frequency, channelConfig, Encoding); 
    AudioRecord audioRecord = new AudioRecord (MediaRecorder.AudioSource.MIC, frequency, channelConfig, Encoding, bufferSize); 

    short[] buffer = new short[bufferSize];         // Using "short", because we're using "ENCODING_PCM_16BIT"  
    audioRecord.startRecording(); 

    while (isRecording) 
    { 
     int bufferReadResult = audioRecord.read (buffer, 0, bufferSize); 
     for (int i = 0; i < bufferReadResult; i++) 
      dos.writeShort (buffer[i]); 
    } 

    audioRecord.stop(); 
    dos.close(); 
} 
catch (Exception t) 
{ 
    Log.e (TAG, "Recording Failed"); 
} 

Il me semble que vous êtes absent le getAbsolutePath() appeler en annexe à votre appel getExternalStorageDirectory() (qui peut avoir le même résultat que la solution codée en dur de Marc Bernstein).