2013-11-25 11 views
7

Voglio che questo frammento scriva in un file csv quando si fa clic su un pulsante, ma continuo a ricevere java.io.IOException: open failed: ENOENT (Nessun file o directory). Qualsiasi aiuto sarebbe molto apprezzato.Android non crea file

public class AddFragment extends Fragment { 

    static EditText spent,saved,coupons; 
    Button writeExcelButton; 
    String data; 
    Spinner spinner; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.add_layout, container, false); 

     setSpinnerContent(view); 

     spent = (EditText) view.findViewById(R.id.spent1); 
     saved = (EditText) view.findViewById(R.id.saved1); 
     coupons = (EditText) view.findViewById(R.id.coupons1); 

     writeExcelButton = (Button) view.findViewById(R.id.button_addGroc); 
     writeExcelButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateSheet(); 
      } 
     }); 

     return view; 
    } 

    private void setSpinnerContent (View view) { 
     spinner = (Spinner) view.findViewById(R.id.groc_store); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
      R.array.store1, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
    } 

    public void updateSheet() { 
     try { 
      // This is the string that should be written to file 
      String mySpin =spinner.getSelectedItem().toString(); 
      data = mySpin + "," + spent.getText().toString() + "," + saved.getText().toString() + "," + coupons.getText().toString() + "/n"; 

      // This is the file that should be written to 
      String sdCard = Environment.getExternalStorageDirectory().toString(); 
      File dir = new File(sdCard + "/dir"); 
      if (!dir.exists()) { 
       dir.mkdir(); 
      } 

      File myFile = new File(dir.getAbsolutePath(), "savings.csv"); 

      // if file doesn't exists, then create it 
      if (!myFile.exists()) { 
       myFile.createNewFile(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Questo è ciò che il mio LogCat assomiglia

11-14 13:29:23.681: W/System.err(14386): java.io.IOException: open failed: ENOENT (No such file or directory) 
11-14 13:29:23.681: W/System.err(14386): at java.io.File.createNewFile(File.java:948) 
11-14 13:29:23.691: W/System.err(14386): at com.example.myfirstapp.AddFragment.updateSheet(AddFragment.java:101) 
11-14 13:29:23.691: W/System.err(14386): at com.example.myfirstapp.AddFragment$1.onClick(AddFragment.java:59) 
11-14 13:29:23.691: W/System.err(14386): at android.view.View.performClick(View.java:4240) 
11-14 13:29:23.691: W/System.err(14386): at android.view.View$PerformClick.run(View.java:17721) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Handler.handleCallback(Handler.java:730) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Looper.loop(Looper.java:137) 
11-14 13:29:23.691: W/System.err(14386): at android.app.ActivityThread.main(ActivityThread.java:5103) 
11-14 13:29:23.691: W/System.err(14386): at java.lang.reflect.Method.invokeNative(Native Method) 
11-14 13:29:23.691: W/System.err(14386): at java.lang.reflect.Method.invoke(Method.java:525) 
11-14 13:29:23.701: W/System.err(14386): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
11-14 13:29:23.711: W/System.err(14386): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-14 13:29:23.711: W/System.err(14386): at dalvik.system.NativeStart.main(Native Method) 
11-14 13:29:23.711: W/System.err(14386): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
11-14 13:29:23.711: W/System.err(14386): at libcore.io.Posix.open(Native Method) 
11-14 13:29:23.711: W/System.err(14386): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
11-14 13:29:23.711: W/System.err(14386): at java.io.File.createNewFile(File.java:941) 
+0

hai '' nel tuo manifest? – kiruwka

+1

Sì, è lì dentro. – user3033922

risposta

21

provare a cambiare

dir.mkdir(); 

a

dir.mkdirs(); 

Anche provare solo di passaggio dir invece di dir.getAbsolutePath()

Modifica

anche che non vuole concatanate percorsi di file del genere. Prova:

File myFile = new File(Environment.getExternalStorageDirectory(), "dir/savings.csv"); 
if (!myFile.exists()) { 
    myFile.mkdirs(); 
    myFile.createNewFile(); 
} 
+0

Ho provato entrambi i tuoi suggerimenti senza fortuna. Sto cercando di eseguire questo su un emulatore, se questo aiuta. – user3033922

+0

Hai aggiunto il supporto SDCard all'emulatore? Vai a eclipse - windows - avd manager - seleziona avd e modifica - hardware - nuovo - Supporto SDCard – Brianjs

+0

OK, quindi ho aggiunto una SDCard all'AVD dopo che avevo già avviato l'AVD e non pensavo di riavviarlo ... In questo momento non compare nulla in LogCat quando premo il pulsante ma non riesco a trovare il file in Esplora file. Non sembra esserci un'altra directory dopo mnt/sdcard. – user3033922

9

Aggiungi permessi in manifest.

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

Effettivamente questa è una cattura molto buona !! Se l'utente non sta aggiungendo questa autorizzazione, il sistema Android non consentirà all'utente di scrivere e si verificherà lo stesso errore ENOENT. –