java.io.filenotfoundexception open échec eacces (permission refusée) sur le périphérique

Le code suivant qui consiste à télécharger un fichier à partir d'un serveur et de les enregistrer dans le stockage fonctionne correctement lorsque l'appareil dispose d'une mémoire de stockage interne.
Mais quand je l'ai essayé avec un appareil sans stockage interne, ainsi qu'avec stockage externe-je obtenir de l'exception suivante.

java.io.filenotfoundexception échec de l'ouverture de eacces (permission denied)

public void downloadFile(String dlUrl, String dlName) {
    int count;

    HttpURLConnection con = null;
    InputStream is = null;
    FileOutputStream fos = null;

    try {
        URL url = new URL( dlUrl );
        con = (HttpURLConnection) url.openConnection();
        con.setDoInput(true);
        con.connect();

        is = url.openStream();
        String dir = Environment.getExternalStorageDirectory() + Util.DL_DIRECTORY;
        File file = new File( dir );
        if( !file.exists() ){
            file.mkdir();
        }

        Util.LOG_W(TAG, "Downloading: " + dlName + " ...");

        fos = new FileOutputStream(file + "/" +  dlName);
        byte data[] = new byte[1024];

        while( (count = is.read(data)) != -1 ){
            fos.write(data, 0, count);
        }

        Util.LOG_D(TAG, dlName + " Download Complete!");


    } catch (Exception e) {
        Util.LOG_E(TAG, "DOWNLOAD ERROR = " + e.toString() );
        bServiceDownloading = false;
    }
    finally{
        try {
            if( is != null)
                is.close();
            if( fos != null)
                fos.close();
            if( con != null)
                con.disconnect();
        } catch (Exception e) {
            Util.LOG_E(TAG, "CLOSE ERROR = " + e.toString() );
        }
    }
}

Et dans le manifeste de fichier que j'ai est la suivante:

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

Toutes les suggestions de ce que peut-être la cause?
Par la voie de l'Environnement.getExternalStorageDirectory() retourne /mnt/sdcard/ et fichier.mkdir() de retour faux.

source d'informationauteur Lazy Ninja