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.
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.
Utilisez l'autorisation READ_EXTERNAL_STORAGE
pour lire les données de l'appareil.
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.
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.
try
Environment.getExternalStorageDirectory().getAbsolutePath()
et n'oubliez pas d'ajouter
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
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
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.
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.
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);