15

This is simple, but not working. I am trying to create a temp file (later a permanent storage file) for preview of an MP3 file. I have tried the following variants of the suffix as following example:

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)

Is there some AndroidManifest.xml setting that I am missing (I am using default manifest)?

mobibob
  • 8,670
  • 20
  • 82
  • 131

3 Answers3

22

You need to create the temp files in a directory that your application owns. You should use createTempFile(String prefix, String suffix, File directory), where directory is the location to which the temp file is to be written. You can get a valid location for directory with the result from Context.getFilesDir() or Context.getDir(String name, int mode).

Thomasleveil
  • 95,867
  • 15
  • 119
  • 113
Marc Bernstein
  • 11,423
  • 5
  • 34
  • 32
  • Thanks Marc. I had tried the form with the directory, but I was still supplying a directory that I did not have access to, getCacheDirectory. Your suggestion worked. Meanwhile, I switched to getBaseContext().openFileOutput(...) – mobibob Sep 08 '10 at 04:00
14

I think that you just missed the permission to write at the external storage, since temp files are created there by default. Add

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

to your manifest and it should work.

Thomasleveil
  • 95,867
  • 15
  • 119
  • 113
Gonzalo
  • 149
  • 1
  • 3
  • This is right if you try to write to external storage but for OP, this is not the case. – Timuçin Dec 14 '13 at 17:04
  • 4
    According to [the Android docs](http://developer.android.com/training/camera/photobasics.html#TaskPath), you still need this permission in version 18 and below. `` – Impirator Dec 08 '15 at 05:38
3

Even after adding <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" this to manifest I was getting error. But after adding this android:requestLegacyExternalStorage="true" in application tag of manifest file I am able to createTempFile and able capture pic from phone.

<application android:requestLegacyExternalStorage="true"

Prabhu
  • 49
  • 10