Bueno, al fin lo he encontrado, pongo aqui la solución por si puede servir a alguien:
El intent para que el visor de gpx pueda abrir el fichero previamente puesto en la carpeta compartida download no cambia, es el mismo:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uriGpx,"text/xml");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(intent);
Lo que si cambia es la manera de pasarle la uri del fichero gpx, hay que pasarle la uri a traves de MediaStore, es una uri como esta:
content://media/external/downloads/9815
En mi caso, lo que hago es a traves de una coxexión a mi servidor descargar el fichero gpx y colocarlo en una ubicadion privada (de la app) y luego copiarlo a la carpeta compartida donwload usando MediaStore, al hacerlo asi la funciòn de copiado ya devuelve la uri al archivo que es la que se pasa al intent.
Pongo aquí la función de copiado usando MediaStore:
//-Copia un archivo de una ubicación privada a donwload pública
public Uri copyFileD(File forg, String filename) {
Boolean ok;
InputStream is = null;
OutputStream os = null;
Uri target;
Uri uri;
ContentResolver cr = nContexto.getContentResolver();
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
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");
}
cr.delete(target, null, null); //-borra todos los archivos puesto en download por esta app, deja intactos el resto.
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.MediaColumns.IS_PENDING, false);
cr.update(uri, values, null, null);
}
}
return uri; //-es la uri necesaria para pasar al intent
}
* Así es como lo tengo y de momento funciona.