Avec la version Android KitKat 4.4.2, une nouvelle politique de Google mise en œuvre pour Writeaccess, que je ne comprends pas encore.
J'ai beaucoup lu sur ce problème avec d'autres applications. Ils obtiennent une "permission EACCES refusée". Mon application doit écrire/décompresser un fichier zip, écrire également dans une base de données sqlite.
Comment ce problème de refus d'autorisations EACCES peut-il être résolu avec la version Android 4.4.2 KitKat?
J'ai trouvé une solution efficace à ce problème dans forum xda ; il n'y a pas besoin d'enracinement.
Voici un exemple:
/**
* Returns an OutputStream to write to the file. The file will be truncated immediately.
*/
public OutputStream write()
throws IOException {
if (file.exists() && file.isDirectory()) {
throw new IOException("File exists and is a directory.");
}
// Delete any existing entry from the media database.
// This may also delete the file (for media types), but that is irrelevant as it will be truncated momentarily in any case.
String where = MediaStore.MediaColumns.DATA + "=?";
String[] selectionArgs = new String[] { file.getAbsolutePath() };
contentResolver.delete(filesUri, where, selectionArgs);
ContentValues values = new ContentValues();
values.put(MediaStore.Files.FileColumns.DATA, file.getAbsolutePath());
Uri uri = contentResolver.insert(filesUri, values);
if (uri == null) {
// Should not occur.
throw new IOException("Internal error.");
}
return contentResolver.openOutputStream(uri);
}
De la docs:
À partir de la version 4.4 d’Android, plusieurs périphériques de stockage externes sont présentés aux développeurs via Context.getExternalFilesDirs (), Context.getExternalCacheDirs () et Context.getObbDirs () .
Les périphériques de stockage externes mis en surface via ces API doivent être une partie semi-permanente du périphérique (par exemple, un emplacement pour carte SD dans un compartiment de batterie). Les développeurs s'attendent à ce que les données stockées dans ces emplacements soient disponibles sur de longues périodes. Pour cette raison, les périphériques de stockage transitoires (tels que les lecteurs de stockage de masse USB) ne doivent pas être mis à jour via ces API.
L'autorisation WRITE_EXTERNAL_STORAGE doit uniquement accorder un accès en écriture au stockage externe principal d'un périphérique. Les applications ne doivent pas être autorisées à écrire sur des périphériques de stockage externes secondaires, sauf dans leurs répertoires spécifiques à un package, comme le permettent les autorisations synthétisées. Le fait de limiter les écritures de cette manière garantit que le système peut nettoyer les fichiers lors de la désinstallation des applications.
Vous devez demander à l'Android à propos de la permission en temps réel, comme ceci:
private static final int MY_PERMISSIONS_REQUEST_STORAGE = 123456;
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Android.Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent chooserIntent = cameraHelper.openImageIntent();
startActivityForResult(chooserIntent, MY_PERMISSIONS_REQUEST_STORAGE);
}
}
}
}
La seule solution pour l’instant, c’est que ce problème ne peut être résolu qu’en rootant votre téléphone et en modifiant les autorisations de la carte externe depuis le répertoire racine à l’aide des explorateurs de fichiers, ce qui n’est pas recommandé, car cela annule la garantie de votre téléphone et déclenche également certaines applications de sécurité comme KNOX dans les téléphones comme Samsung Galaxy S5 S4 Note3 et aussi Note2.
Désolé pour poster ce fait amer.
permet d'espérer une mise à jour de Google lui-même qui peut nous sortir de cette situation.
Mais pensez aussi avant de mettre à jour Jellybean vers KitKat car le JB est le système d’exploitation le plus pratique pour Android ..__ et la différence entre JB et JK & KitKat n’est pas si grande.
J'espère que j'ai aidé ......