2010-09-07 9 views
7

Ceci est simple, mais ne fonctionne pas. J'essaie de créer un fichier temporaire (plus tard un fichier de stockage permanent) pour la prévisualisation d'un fichier MP3. J'ai essayé les variantes suivantes du suffixe comme exemple suivant:android createTempFile renvoie l'autorisation refusée?

public class StudyFileIo extends Activity { 
    private static final String TAG = "StudyFileIo"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try { 
      File tempFooFile = File 
      .createTempFile("foo", "dat"); 
      Log.i(TAG, tempFooFile.getAbsolutePath()); 
     } catch (IOException e) { 
      Log.e(TAG, e.toString()); 
      e.printStackTrace(); 
     } 

    } 
} 

Log:

09-07 11:25:20.299 E/StudyFileIo(8859): java.io.IOException: Permission denied 
09-07 11:25:20.299 W/System.err(8859): java.io.IOException: Permission denied 
09-07 11:25:20.299 W/System.err(8859):  at java.io.File.createNewFileImpl(Native Method) 
09-07 11:25:20.299 W/System.err(8859):  at java.io.File.createNewFile(File.java:1160) 
09-07 11:25:20.299 W/System.err(8859):  at java.io.File.createTempFile(File.java:1224) 
09-07 11:25:20.299 W/System.err(8859):  at java.io.File.createTempFile(File.java:1182) 
09-07 11:25:20.299 W/System.err(8859):  at com.mobibob.studyfileio.StudyFileIo.onCreate(StudyFileIo.java:25) 
09-07 11:25:20.299 W/System.err(8859):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
09-07 11:25:20.299 W/System.err(8859):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
09-07 11:25:20.309 W/System.err(8859):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
09-07 11:25:20.309 W/System.err(8859):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
09-07 11:25:20.309 W/System.err(8859):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
09-07 11:25:20.309 W/System.err(8859):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-07 11:25:20.309 W/System.err(8859):  at android.os.Looper.loop(Looper.java:123) 
09-07 11:25:20.309 W/System.err(8859):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-07 11:25:20.309 W/System.err(8859):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-07 11:25:20.309 W/System.err(8859):  at java.lang.reflect.Method.invoke(Method.java:521) 
09-07 11:25:20.319 W/System.err(8859):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876) 
09-07 11:25:20.319 W/System.err(8859):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) 
09-07 11:25:20.319 W/System.err(8859):  at dalvik.system.NativeStart.main(Native Method) 

est-il un paramètre AndroidManifest.xml que je suis absent (j'utilise manifeste par défaut)?

Répondre

10

Vous devez créer les fichiers temporaires dans un répertoire dont votre application est propriétaire. Vous devez utiliser createTempFile(String prefix, String suffix, File directory), où le répertoire est l'emplacement auquel le fichier temporaire doit être écrit. Vous pouvez obtenir un emplacement valide pour répertoire avec le résultat de Context.getFilesDir() ou Context.getDir(String name, int mode).

+0

Merci Marc. J'avais essayé le formulaire avec le répertoire, mais je fournissais toujours un répertoire auquel je n'avais pas accès, getCacheDirectory. Votre suggestion a fonctionné. Pendant ce temps, je suis passé à getBaseContext(). OpenFileOutput (...) – mobibob

14

Je pense que vous venez de manquer l'autorisation d'écrire sur le stockage externe, car les fichiers temporaires y sont créés par défaut. Ajouter

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

à votre manifeste et il devrait fonctionner.

+0

C'est juste si vous essayez d'écrire sur un stockage externe mais pour OP, ce n'est pas le cas. –

+2

N'a pas travaillé pour moi. –

+1

Selon [les docs Android] (http://developer.android.com/training/camera/photobasics.html#TaskPath), vous avez toujours besoin de cette autorisation dans la version 18 et ci-dessous. '' – Impirator

Questions connexes