Android 11 escritura fichero en carpeta download

109 views
Skip to first unread message

Jaume Tugores

unread,
Apr 2, 2021, 5:05:20 AM4/2/21
to desarrolladores-android
Tengo una app que la estoy pasando a android 11:
compileSdkVersion 30
buildToolsVersion '30.0.3'
minSdkVersion 26
targetSdkVersion 30

Esta versión no puede escribir en carpetas que no sean de la propia app, pero he leido que hay algunas carpetas publicas en las que se puede tener acceso y una de ellas es la download. Estoy intentando escribir un archivo en esta carpeta para que luego desde otra app se pueda leer, pero me da error la función createNewFile() -> acceso denegado.
¿ hay alguna manera de poder hacer eso ?
Gracias

Jaume Tugores

unread,
Apr 2, 2021, 9:57:44 PM4/2/21
to desarrolladores-android
Bueno, esta vez he encotrada una solucion que me funciona, consiste en escribir el archivo a una ubicación privada para luego desde alli copiarlo mediante el uso de MediaStore a la carpeta compartida donwload, aqui os paso una funcion que copia el archivo a donwload:

public Boolean copyFileD(File forg) {
Boolean ok = false;
InputStream is = null;
OutputStream os = null;
Uri target;
Uri uri;
String filename = forg.getName();
ContentResolver cr = nContexto.getContentResolver();
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + File.separator + filename);
values.put(MediaStore.MediaColumns.IS_PENDING, true);
values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename);
if (Build.VERSION.SDK_INT >= 29) {
target = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
} else {
target = MediaStore.Files.getContentUri("external");
}
uri = cr.insert(target, values);
if (uri == null) {
ok = false;
} else ok = true;
if (ok) {
try {
is = new FileInputStream(forg);
os = cr.openOutputStream(uri, "rw");
} catch (FileNotFoundException e) {
e.printStackTrace();
ok = false;
}
byte[] b = new byte[8192];
try {
for (int r; (r = is.read(b)) != -1; ) {
try {
os.write(b, 0, r);
} catch (IOException e) {
e.printStackTrace();
ok = false;
}
}
os.flush();
os.close();
is.close();
} catch (Throwable tr) {
tr.printStackTrace();
ok = false;
}
if (Build.VERSION.SDK_INT >= 29) {
values = new ContentValues();
values.put(MediaStore.Images.ImageColumns.IS_PENDING, false);
cr.update(uri, values, null, null);
}
}
return ok;
}

Es increible la cantidad de código necesaria para copiar un simple archivo !!

Gabriel Pozo

unread,
Apr 3, 2021, 7:38:50 AM4/3/21
to desarrollad...@googlegroups.com
Buena info ;)

Saludos, Gabriel


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/f94624d9-6684-4f11-a949-a685f0c35055n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages