1

Je reçois une exception FileNotFoundException sur la ligne où je déclare le FileOutputStream. Je ne suis pas vraiment sûr pourquoi cela se produit particulièrement depuis que je crée un nouveau fichier avant de créer le FileOutputStream. Je n'ai pas affiché toute la fonction, mais en gros, il désinscrit les capteurs du gyroscope et de l'accéléromètre et écrit leur sortie dans un fichier .csv. Toute aide serait grandement appréciée car je n'ai aucune idée de ce qui ne va pas.Android: Java.io.fileNotFoundException

protected void stopRecording() throws IOException{ 
    sm.unregisterListener(this); 


    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    //file name is the current date and time 
    cal = Calendar.getInstance(TimeZone.getDefault()); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss"); 

    String output = sdf.format(cal.getTime()).toString(); 
    File file = new File(path, output+ "_A" + ".csv"); 
    FileOutputStream fos = new FileOutputStream(file); 
    out = new BufferedWriter(new OutputStreamWriter(fos)); 

    for(int i = 0; i < a.size(); i++){ 
     try { 
      out.write(a.get(i)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 

03-22 11: 43: 40,845 18684-18684 /? W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/2016-03-22_11:43:40_A.csv: ouverture échouée: EACCES (Autorisation refusée) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à libcore.io.IoBridge.open (IoBridge.java:452) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à java.io.FileOutputStream. (FileOutputStream.java:87) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à java.io.FileOutputStream. (FileOutputStream.java:72) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.example.alex.parkinsonsdiseaseapp.TestEnvironmentActivity.stopRecording (TestEnvironmentActivity.java:172) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à com.example.alex.parkinsonsdiseaseapp.TestEnvironmentActivity $ 3.onClick (TestEnvironmentActivity.java:120) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.view.View.performClick (View.java:5226) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.view.View $ PerformClick.run (View.java:21266) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.os.Handler.handleCallback (Handler.java:739) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.os.Handler.dispatchMessage (Handler.java:95) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.os.Looper.loop (Looper.java:168) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.app.ActivityThread.main (ActivityThread.java:5845) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à java.lang.reflect.Method.invoke (méthode native) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:797) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:687) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: Causé par: android.system.ErrnoException: ouverture échouée: EACCES (autorisation refusée) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at libcore.io.Posix.open (méthode native) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: à libcore.io.BlockGuardOs.open (BlockGuardOs.java:186) 03-22 11: 43: 40.860 18684-18684 /? W/System.err: à libcore.io.IoBridge.open (IoBridge.java:438) 03-22 11: 43: 40.860 18684-18684 /? W/System.err: ... 13 plus

+0

Je pense que vous ne pouvez pas utiliser: dans les noms de fichiers. – DonLeopardo

+0

Je l'ai essayé. Cela n'a pas fonctionné. –

+0

Pouvez-vous ajouter 'file.createNewFile();' avant la déclaration fos? Ne devrait pas faire la différence mais vaut la peine d'essayer, je pense –

Répondre

0

Je pense que cela vaut la peine d'essayer (c'est une bonne pratique quand même). Ressenti trop longtemps pour un commentaire, d'où une réponse.

Après avoir appelé le constructeur sur file pour créer un nouvel objet File, vérifiez s'il est lisible, accessible en écriture [Réf.: API]. Si ce n'est pas le cas, vous voudrez vous assurer qu'il est, avant d'essayer d'ouvrir un FileOutputStream dessus [Ref: API].

En outre, j'ai vu l'instance où vous devez appeler file.createNewFile() pour vous assurer qu'un fichier est créé. Donc, ajoutez cela avant la déclaration fos? Ne devrait pas faire un monde de différence; mais ça vaut le coup d'essayer, je pense.

EDIT:

Faire ce changement.

File path = Environment.getExternalStorageDirectory();

et assurer que vous avez

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

dans votre manifeste. Je souhaite que le logcat Android était plus particulier à propos de ce genre de choses.

+0

Je l'ai ajouté, mais pas de chance. –

+0

@AlexCauthen Rien, même si vous appelez 'setWritable (..)' ?! –

+0

@AlexCauthen Je suis sûr que vous avez les permissions d'écriture de fichier définies dans le manifeste? –

0

Vous devez vous assurer que vous placez vos lignes FileOutputStream et BufferedWriter dans le bloc try. En outre, utilisez des délimiteurs différents pour l'heure autre que ":".

protected void stopRecording() throws IOException{ 
    sm.unregisterListener(this); 


    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    //file name is the current date and time 
    cal = Calendar.getInstance(TimeZone.getDefault()); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh.mm.ss"); 

    String output = sdf.format(cal.getTime()).toString(); 
    File file = new File(path, output+ "_A" + ".csv"); 

    for(int i = 0; i < a.size(); i++){ 
     try { 
      FileOutputStream fos = new FileOutputStream(file); 
      out = new BufferedWriter(new OutputStreamWriter(fos)); 
      out.write(a.get(i)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      FileOutputStream fos = new FileOutputStream(file); 
      out = new BufferedWriter(new OutputStreamWriter(fos)); 
     } 
    } 
+0

Ceci attrape une exception, mais ne résout pas le problème sous-jacent –

+0

Je l'ai essayé, et ça marche pour moi. Le compilateur m'a donné une erreur disant qu'il devait attraper l'exception FileNotFoundException, ce que fait l'exception IOException. Une fois que j'ai fait cela et changé le délimiteur temporel, ça s'est bien passé. La seule autre chose à laquelle je puisse penser est la valeur du chemin. –

+0

Ce n'est pas le problème. Dans certaines combinaisons de spécifications sur Android, certaines choses s'arrêtent bizarrement. Les exceptions de capture sont très importantes, mais si la fonctionnalité fait partie intégrante de l'application, vous devez trouver un autre moyen de faire le travail, ou identifier exactement le problème. Tout simplement parce que le bloc catch n'a pas été touché sur votre appareil, ne garantit pas qu'il ne sera pas touché par quelqu'un d'autre. –

0

Je suppose que vous ne pouvez pas creat csv directement juste en utilisant File classe. Vous pouvez modifier File file = new File(path, output+ "_A" + ".csv"); en File file = new File(path, output+ "_A" + ".txt"); Le format de sortie est également illégal à un moment donné.