Android 11 escritura fichero en carpeta download

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Android 11 escritura fichero en carpeta download

Jaume Tugores
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

--
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 [hidden email].
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/d759ff91-c0d9-4f4d-90c4-f102887ee4f8n%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Android 11 escritura fichero en carpeta download

Jaume Tugores
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 !!
El viernes, 2 de abril de 2021 a las 11:05:20 UTC+2, Jaume Tugores escribió:
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

--
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 [hidden email].
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 | Threaded
Open this post in threaded view
|

Re: Android 11 escritura fichero en carpeta download

Gabriel Pozo
Buena info ;)

Saludos, Gabriel


El vie, 2 abr 2021 a las 22:57, Jaume Tugores (<[hidden email]>) escribió:
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 !!
El viernes, 2 de abril de 2021 a las 11:05:20 UTC+2, Jaume Tugores escribió:
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

--
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 [hidden email].
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.

--
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 [hidden email].
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/CAAFH9pKSNFTM_Rvdm7npxurvJy-fY4QOa2kasAYSWAdzDc07Ng%40mail.gmail.com.