2010-09-07 43 views
7

Điều này rất đơn giản nhưng không hoạt động. Tôi đang cố tạo một tệp tạm thời (sau này là một tệp lưu trữ vĩnh viễn) để xem trước tệp MP3. Tôi đã thử các biến thể sau của hậu tố như ví dụ sau:android createTempFile ném quyền bị từ chối?

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ó một số thiết lập AndroidManifest.xml mà tôi đang thiếu (Tôi đang sử dụng manifest mặc định)?

Trả lời

10

Bạn cần tạo tệp tạm thời trong thư mục mà ứng dụng của bạn sở hữu. Bạn nên sử dụng createTempFile(String prefix, String suffix, File directory), trong đó thư mục là vị trí để ghi tệp tạm thời. Bạn có thể có được vị trí hợp lệ cho thư mục với kết quả từ Context.getFilesDir() hoặc Context.getDir(String name, int mode).

+0

Cảm ơn Marc. Tôi đã thử mẫu với thư mục, nhưng tôi vẫn đang cung cấp một thư mục mà tôi không có quyền truy cập vào, getCacheDirectory. Đề xuất của bạn đã hoạt động. Trong khi đó, tôi chuyển sang getBaseContext(). OpenFileOutput (...) – mobibob

14

Tôi nghĩ rằng bạn vừa bỏ lỡ quyền ghi ở bộ nhớ ngoài, vì các tệp tạm thời được tạo ở đó theo mặc định. Thêm

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

vào tệp kê khai của bạn và nó sẽ hoạt động.

+0

Điều này là đúng nếu bạn cố gắng ghi vào bộ nhớ ngoài nhưng đối với OP, đây không phải là trường hợp. –

+2

Đã không làm việc cho tôi. –

+1

Theo [tài liệu Android] (http://developer.android.com/training/camera/photobasics.html#TaskPath), bạn vẫn cần quyền này trong phiên bản 18 trở xuống. '' – Impirator

Các vấn đề liên quan