web-dev-qa-db-fra.com

java.io.filenotfoundexception open failed

Le code suivant, qui consiste à télécharger un fichier à partir d'un serveur et à le sauvegarder dans le stockage, fonctionne correctement lorsque le périphérique dispose d'un stockage interne.
Mais lorsque je l'ai essayé avec un périphérique sans stockage interne, uniquement avec un stockage externe, j'obtiens l'exception suivante.

Java.io.filenotfoundexception open a échoué (autorisation refusée)

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 fichier manifeste I a la suivante:

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

Des suggestions, quelle qu'en soit la cause? Soit dit en passant Environment.getExternalStorageDirectory () retourne/mnt/sdcard/et file.mkdir () return false.

13
Lazy Ninja

Ce problème semble être causé par plusieurs facteurs.

Chèque n ° 1
Commencez par ajouter cette autorisation dans votre fichier de manifeste et vérifiez si cela fonctionne:

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

</application>

.....

Contrôle n ° 2:

Si vous utilisez un émulateur, vérifiez les propriétés pour voir s’il possède une carte SD.

Contrôle n ° 3:

Désactiver le transfert de fichiers d'un périphérique à un autre. Si activé, l'application ne pourra pas accéder à la carte SD.

Chèque n ° 4:
Si cela ne fonctionne toujours pas, essayez ce qui suit:

 String dir = Environment.getExternalStorageDirectory().getAbsolutePath()

Pour moi, ce qui suit a fonctionné:
Le problème est que getExternalStorageDirectory renvoie/mnt/sdcard alors que j'ai besoin du chemin de stockage externe qui est/mnt/sdcard-ext et qu'il n'y a pas d'API dans Android qui puisse m'obtenir le chemin absolu d'une sdcard amovible. 
Ma solution consistait à coder en dur le répertoire comme suit:

String dir = "/mnt/sdcard-ext" ;

Étant donné que l’application ne doit fonctionner que sur un seul appareil, ce qui précède a été efficace.
Si vous rencontrez le même problème, utilisez une application file Explorer pour trouver le nom du répertoire externe et codez-le en dur.

14
Lazy Ninja

Utilisez l'autorisation READ_EXTERNAL_STORAGE pour lire les données de l'appareil.

10
Naresh R

L'avez-vous essayé sur l'émulateur? Vérifiez les propriétés s'il dispose d'une carte SD. J'ai eu le même problème, et c'était parce que l'émulateur n'avait pas de carte SD. Vérifiez si le vôtre a ou non.

6
keybee

J'ai eu le même problème, et je l'ai résolu en désactivant le transfert de fichier d'appareil à ordinateur . Parce que si vous activez le transfert de fichier, la carte SD n'est pas accessible à l'application de débogage. 

4
toskebre
try
Environment.getExternalStorageDirectory().getAbsolutePath()

et n'oubliez pas d'ajouter

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
3
brzhang

Je pense que vous utilisez Android 6.0 Marshmallow (API 23) ou une version ultérieure. Dans ce cas, vous devez implémenter les autorisations d'exécution avant d'essayer de lire/écrire du stockage externe . https://developer.Android.com/training/permissions/requesting.html

2
TheLastSummer

Essayez d’utiliser mkdirs au lieu de mkdir. Si vous créez un chemin de répertoire et que le parent n'existe pas, vous devez utiliser mkdirs.

1
Sagar

J'ai eu le même problème. J'ai utilisé correctement les autorisations d'écriture et de lecture dans le manifeste, mais cela n'a pas fonctionné! La solution était très ridicule: débranchez votre téléphone du PC avant d'exécuter l'application. Il semble que lorsque votre téléphone est connecté en tant que "Stockage de masse" au PC, l'application ne peut pas accéder au stockage externe.

0
gaby

j'ai fait une erreur très stupide . J'ai déjà mis dans AndroidManifest.xml

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

et ajouter également l'autorisation dans le fichier Java, comme obtenir l'autorisation de manière pragmatique . Mais l'erreur est manifeste dans Manifest.permission.READ_EXTERNAL_STORAGE . Veuillez utiliser Manifest.permission.WRITE_EXTERNAL_STORAGE .

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
0
Sanket Sangani