2010-09-07 24 views
7

Bu basit, ancak çalışmıyor. Bir MP3 dosyasının önizlemesi için geçici dosya (daha sonra kalıcı bir depolama dosyası) oluşturmaya çalışıyorum. Aşağıdaki örnek olarak sonekin aşağıdaki varyantları denedi:android createTempFile izin reddedildi mi?

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(); 
     } 

    } 
} 

Giriş:

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) 

ben eksik bazı AndroidManifest.xml ayarı (varsayılan manifestosunu kullanıyorum) var mı?

cevap

10

Temp dosyalarının, uygulamanızın sahip olduğu bir dizinde oluşturmanız gerekir. createTempFile(String prefix, String suffix, File directory)'u kullanmalısınız, burada dizini, geçici dosyanın yazılacağı konumdur. dizini için geçerli bir konum, Context.getFilesDir() veya Context.getDir(String name, int mode) sonucu alabilirsiniz.

+0

Teşekkürler Marc. Formu diziyle denedim, ancak hala erişemediğim bir dizini getCacheDirectory sağladım. Öneriniz işe yaradı. Bu arada, getBaseContext() konumuna geçtim. OpenFileOutput (...) – mobibob

14

Varsayılan olarak temp dosyaları oluşturulduğundan, dış depolama alanına yazma iznini atladığınızı düşünüyorum. Manifest'inizde için

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

ekle ve çalışması gerekir.

+0

Harici depolama alanına yazmaya çalıştığınızda, ancak OP için bu doğru değil, durum böyle değil. –

+2

Benim için çalışmadı. –

+1

[Android dokümanlar] 'a (http://developer.android.com/training/camera/photobasics.html#TaskPath) göre, 18 ve altındaki sürümlerde bu izne gerek duyarsınız. '' – Impirator

İlgili konular