2010-09-07 8 views
7

Das ist einfach, funktioniert aber nicht. Ich versuche, eine temporäre Datei (später eine permanente Speicherdatei) für die Vorschau einer MP3-Datei zu erstellen. Ich habe die folgenden Varianten des Suffix wie folgende Beispiel versucht:android createTempFile wirft die Berechtigung verweigert?

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) 

Gibt es eine AndroidManifest.xml Einstellung, die ich vermisst (Ich verwende Standard-Manifest)?

Antwort

10

Sie müssen die temporären Dateien in einem Verzeichnis erstellen, das Ihrer Anwendung gehört. Sie sollten createTempFile(String prefix, String suffix, File directory) verwenden, wobei Verzeichnis der Speicherort ist, an den die temporäre Datei geschrieben werden soll. Sie können einen gültigen Speicherort für Verzeichnis mit dem Ergebnis von Context.getFilesDir() oder Context.getDir(String name, int mode) erhalten.

+0

Danke Marc. Ich hatte das Formular mit dem Verzeichnis versucht, aber ich lieferte immer noch ein Verzeichnis, auf das ich keinen Zugriff hatte, getCacheDirectory. Dein Vorschlag hat funktioniert. Inzwischen habe ich getBaseContext() gewählt. OpenFileOutput (...) – mobibob

14

Ich denke, dass Sie gerade die Berechtigung zum Schreiben auf dem externen Speicher verpasst haben, da temporäre Dateien dort standardmäßig erstellt werden. In

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

zu Ihrem Manifest und es sollte funktionieren.

+0

Das ist richtig, wenn Sie versuchen, auf externen Speicher zu schreiben, aber für OP ist dies nicht der Fall. –

+2

Hat nicht für mich gearbeitet. –

+1

Laut [den Android-Dokumenten] (http://developer.android.com/training/camera/photobasics.html#TaskPath) benötigen Sie diese Berechtigung in Version 18 und darunter noch. '' – Impirator

Verwandte Themen