2010-09-07 28 views
7

Questo è semplice, ma non funziona. Sto cercando di creare un file temporaneo (in seguito un file di archiviazione permanente) per l'anteprima di un file MP3. Ho provato le seguenti varianti del suffisso come riportato di seguito:android createTempFile genera il permesso negato?

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) 

c'è qualche impostazione AndroidManifest.xml che mi manca (sto usando manifesti di default)?

risposta

10

È necessario creare i file temporanei in una directory di proprietà dell'applicazione. È necessario utilizzare createTempFile(String prefix, String suffix, File directory), dove la directory è la posizione in cui deve essere scritto il file temporaneo. È possibile ottenere una posizione valida per la directory con il risultato da Context.getFilesDir() o Context.getDir(String name, int mode).

+0

Grazie Marc. Avevo provato il modulo con la directory, ma stavo ancora fornendo una directory alla quale non avevo accesso, getCacheDirectory. Il tuo suggerimento ha funzionato Nel frattempo, sono passato a getBaseContext(). OpenFileOutput (...) – mobibob

14

Penso che abbiate appena perso l'autorizzazione per scrivere nella memoria esterna, poiché i file temporanei vengono creati lì per impostazione predefinita. Aggiungere

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

al vostro manifesto e dovrebbe funzionare.

+0

Questo è giusto se si tenta di scrivere su memoria esterna ma per OP, questo non è il caso. –

+2

Non ha funzionato per me. –

+1

Secondo [i documenti Android] (http://developer.android.com/training/camera/photobasics.html#TaskPath), è ancora necessaria questa autorizzazione nella versione 18 e seguenti. '' – Impirator

Problemi correlati