2010-09-07 28 views
7

Esto es simple, pero no funciona. Estoy tratando de crear un archivo temporal (más tarde un archivo de almacenamiento permanente) para la vista previa de un archivo MP3. He probado las siguientes variantes del sufijo como ejemplo siguiente:android createTempFile arroja el permiso denegado?

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) 

¿Hay un cierto ajuste AndroidManifest.xml que me falta (estoy usando manifiesto por defecto)?

Respuesta

10

Debe crear los archivos temporales en un directorio que pertenezca a su aplicación. Debe usar createTempFile(String prefix, String suffix, File directory), donde directorio es la ubicación donde se escribirá el archivo temporal. Puede obtener una ubicación válida para el directorio con el resultado de Context.getFilesDir() o Context.getDir(String name, int mode).

+0

Gracias Marc. Había probado el formulario con el directorio, pero todavía estaba suministrando un directorio al que no tenía acceso, getCacheDirectory. Tu sugerencia funcionó. Mientras tanto, cambié a getBaseContext(). OpenFileOutput (...) – mobibob

14

Creo que acaba de perder el permiso para escribir en el almacenamiento externo, ya que los archivos temporales se crean allí de forma predeterminada. Añadir

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

a su manifiesto y que debería funcionar.

+0

Esto es correcto si intentas escribir en el almacenamiento externo pero para OP, este no es el caso. –

+2

No funcionó para mí. –

+1

Según [los documentos de Android] (http://developer.android.com/training/camera/photobasics.html#TaskPath), aún necesita este permiso en la versión 18 y siguientes. '' – Impirator