2010-09-07 11 views
7

Jest to proste, ale nie działa. Próbuję utworzyć plik tymczasowy (później stały plik magazynu) do podglądu pliku MP3. Próbowałem następujące warianty przyrostkiem jako poniższym przykładzie:Android createTempFile zgłasza odmowę zgody?

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) 

Czy istnieje jakiś ustawienie AndroidManifest.xml że mi brakuje (używam domyślnego manifestu)?

Odpowiedz

10

Musisz utworzyć pliki tymczasowe w katalogu, który posiada twoja aplikacja. Powinieneś użyć createTempFile(String prefix, String suffix, File directory), gdzie katalog jest miejscem, do którego ma zostać zapisany plik tymczasowy. Możesz uzyskać poprawną lokalizację katalogu dla katalogu z wynikiem Context.getFilesDir() lub Context.getDir(String name, int mode).

+0

Dzięki Marc. Próbowałem już formularza z katalogiem, ale wciąż dostarczałem katalog, do którego nie miałem dostępu, getCacheDirectory. Twoja sugestia zadziałała. Tymczasem przełączyłem się na getBaseContext(). OpenFileOutput (...) – mobibob

14

Myślę, że właśnie przegapiłeś pozwolenie na pisanie w pamięci zewnętrznej, ponieważ pliki tymczasowe są tam domyślnie tworzone. Dodaj

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

aby Twój manifest i powinno działać.

+0

Jest to prawdą, jeśli próbujesz pisać do pamięci zewnętrznej, ale dla OP, tak nie jest. –

+2

Nie pracował dla mnie. –

+1

Zgodnie z dokumentacją systemu Android (http://developer.android.com/training/camera/photobasics.html#TaskPath) nadal potrzebujesz tego uprawnienia w wersji 18 i starszych. '' – Impirator

Powiązane problemy