Oruxmaps y Nougat

56 views
Skip to first unread message

Jaume Tugores

unread,
Nov 1, 2016, 1:44:03 AM11/1/16
to desarrolladores-android
Bueno, ya estoy otra vez.
Al adaptar mis aplicaciones, a la nueva versión N, api 24, vuelvo a tener problemas, esta vez al intentar que oruxmaps abra y cargue un archivo gpx.
Antes, con la version antigua lo hacía asi:

    //-Carga el fichero gpx creado en la sd
    void Orux_gpx(String pGpx){
        String rutaGpx = Environment.getExternalStorageDirectory() + File.separator + "midominio" + File.separator + pGpx;
        Intent i=new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.fromFile(new File(rutaGpx)),"text/xml");
        startActivity(i);
        finish();
    }

y por supuesto iba bien, ahora lo he adaptado a la nueva version, usando el file provider y dando permisos y ha quedado asi:

//-Carga el fichero gpx creado en la sd
void Orux_gpx(String pGpx){
String carpeta = Environment.getExternalStorageDirectory() + File.separator + "midominio";
File miGpx = new File(carpeta, pGpx);
Uri gpxfURI = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", miGpx);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(gpxfURI,"text/xml");
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
finish();
}

Ahora, se habre el Orux, pero no carga el fichero gpx y además no da ningún tipo de error, no nada en el logcat.
En la ayuda del Orux, se ve que no han actualizado a esta nueva versión y parece que nadie sabe nada.

He comprobado que el fichero esté y además desde el emsexplorer, al clicar encima, si que abre el archivo con el oruxmaps, asi que alguna manera debe de haber.

Martin

unread,
Nov 1, 2016, 5:08:42 PM11/1/16
to desarrolladores-android
Cuando no hay logcat es bastante complicado, pero por mi experiencia cuando pasa eso es que algo no fue configurado bien (una cadena mal tipeada, ausente o escrita fuera del lugar) algunas cosas que se pueden revisar son:

  • En el manifest el valor de android:authority en el bloque del FileProvider declarado y el valor del 2do parámetro de getUriForFile en el código sean el mismo, a veces cuando se adapta el código desde un ejemplo puede quedar de un lado com.example.fileprovider y por otro com.example.provider, ahi lo importante es obviamente que concida en ambos lugares, es una cadena que se forma siguiendo la convencion de PACKAGENAME . STRING
    donde string puede ser cualquier cosa como files, myfiles, provider, fileprovider, etc. y eso es a elección de cada uno.

    En los ejemplos de google se suele ver una constante harcodeada al comienzo de la clase para luego ser usada como el segundo parametro de getUriForFile
ej.:

class MainActivity extends .... {
    private final static String = AUTHORITY "com.example.myapp.fileprovider";

    // y luego cuando viene la hora de usar getUriForfile
    // mURI = FIleProvider.getUriForFile(getContext(), AUTHORITY, mFile);

}
  • Hay que revisar el path @xml/file_paths que este correcto
  • Hacer log.d de la variable gpxfURI
  • Tambien como una prueba, en lugar de lanzar el intent podrias probar a usar
    FileProvider.openFile (gpxfURI, "r");
    para probar si hay acceso al archivo o emite alguna Exception como FileNotFoundException, Saludos!

Jaume Tugores

unread,
Nov 2, 2016, 2:47:58 PM11/2/16
to desarrolladores-android
Gracias, ahora tengo unos días muy ocupados, enseguida que pueda lo pruebo y diré cosas.

Jaume Tugores

unread,
Nov 2, 2016, 2:47:59 PM11/2/16
to desarrolladores-android

Jaume Tugores

unread,
Nov 13, 2016, 11:17:18 PM11/13/16
to desarrolladores-android
Bueno, ya estoy aquí otra vez.
He hecho unas pruebas y NO he conseguido solucionar el problema, les expongo los resultados.
Tengo 2 aplicaciones distintas y he probado de copiar el mismo fichero a la otra y en esta SI que me abre el orux y carga el trak, pero en la original no.
He puesto los datos que se ven en el debug y parecen correctos, le he puesto la comprobacion de "if(outputFile.exists())" y si que ve el fichero.
El logcat no da ningún tipo de error, supongo que algo pasa con el orux y no coge el fichero de trak.

Aplicación 2, en esta sí que funciona, originalmente abría otro tipo de fichero, pero la he adaptado y funciona correctamente, abriendo el Orux y cargando el trak:
la pakage de esta es:  "package es.puigverd.puigverd;"
* en esta aplicación, el código está puesto en una clase

	String app = "salt.gpx";
	String carpeta = Environment.getExternalStorageDirectory() + File.separator + "Download";
	File miApp = new File(carpeta, app); // debug->"/storage/emulated/0/Download/salt.gpx"
	Uri miAppUri = FileProvider.getUriForFile(this.context, this.context.getApplicationContext().getPackageName() + ".provider", miApp); // debug->"content://es.puigverd.puigverd.provider/external_files/Download/salt.gpx"
	Intent intent = new Intent(Intent.ACTION_VIEW);
	intent.setDataAndType(gpxfURI,"text/xml");
	intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // debug: "Intent { act=android.intent.action.VIEW dat=content://es.puigverd.puigverd.provider/external_files/Download/salt.gpx typ=text/xml flg=0x10000001 }"
	context.startActivity(intent);

**** debug->"aqui van los valores que da el debug justo después de ejecutar la línea"


Aplicación original, aquí NO funciona:(debe de ver el fichero porque sabe que tiene que arrancar el orux, y lo arranca, pero una vez arrancado el orux, este no carga el trak)
la pakage de esta es:    "package es.vyvalavida.excursions;"
* en esta aplicación, el código está puesto en la misma activity, en una función.

    void Orux_gpx(String pGpx){
	pGpx = "salt.gpx";
        String carpeta = Environment.getExternalStorageDirectory() + File.separator + "vyvalavida";
        File miGpx = new File(carpeta, pGpx);  //-el valor que muestra el debug es: "/storage/emulated/0/vyvalavida/salt.gpx"
        Uri gpxfURI = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", miGpx); // debug->"content://es.vyvalavida.excursions.provider/external_files/vyvalavida/salt.gpx"
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(gpxfURI,"text/xml");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //debug->"Intent { act=android.intent.action.VIEW dat=content://es.vyvalavida.excursions.provider/external_files/vyvalavida/salt.gpx typ=text/xml flg=0x10000001 }"
        startActivity(intent);
    }

A ver si ustedes ven algo que yo no puedo ver, np consigo imaginar cual es el problema, ya que los valores parecen ser correctos.
Gracias.
 

Eduardo Martin Cabrera

unread,
Nov 14, 2016, 12:40:09 AM11/14/16
to desarrollad...@googlegroups.com
La única diferencia que veo ahí es que en la App que funciona usas Download en la ruta del archivo .gpx,
mientras que en la que no lo hace, usas vyvalavida; mas allá de eso si no hay una salida de logcat es difícil saber que estará fallando

 

--
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-android+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/c41c8d1d-2de4-4774-a2d5-7f81a1727fd5%40googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jauma

unread,
Nov 14, 2016, 12:47:49 AM11/14/16
to desarrollad...@googlegroups.com
Efectivamente, la diferencia es la carpeta, pero la carpeta existe y contiene el archivo, ademas se ve que lo encuentra, solo que el orxu no lo abre.
Otras diferencias que se me ha olvidado poner antes es la compilación:

En la versión que SI funciona:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "24.0.1"

    defaultConfig {
        applicationId "es.puigverd.puigverd"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 42
        versionName "18/Octubre/2016"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.0.0'
}




y la versión que NO funciona:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "es.vyvalavida.excursions"
        minSdkVersion 18
        targetSdkVersion 24
        versionCode 9
        versionName "07_/05/2016"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
}

Eduardo Martin Cabrera

unread,
Nov 14, 2016, 2:21:22 AM11/14/16
to desarrollad...@googlegroups.com
si podes pega las declaraciones del Fileprovider en manifest; osea el tag <provider> (y  asegurate que este dentro del tag <application>) y tambien los contenidos de @xml/filepaths

--
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-android+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Jaume Tugores

unread,
Nov 14, 2016, 3:10:48 AM11/14/16
to desarrolladores-android
AndroidManifiest.xml: 

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>

..
..
___________________________________________________________________________

en xml:
provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
<files-path name="xxx" path="yyy/"/>
</paths>
 
_________________________________________________________________

Está igual que en la app que si funciona,lo he puesto igual.

Eduardo Martin Cabrera

unread,
Nov 14, 2016, 4:08:21 AM11/14/16
to desarrollad...@googlegroups.com
arriesgando a adivinar, solo se me ocurre para revisar y probar en la app que no funciona lo siguiente:

* que este declarado el permiso READ_EXTERNAL_STORAGE o WRITE_EXTERNAL_STORAGE (por si acaso) y que se solicitó al usuario que apruebe este permiso en tiempo de ejecución
* agregar
<external-path name="myfiles" path="vyvalavida/" />
* o sino cambiar el directorio en uso de vyvalavida a Downloads (y alojar el archivo igual como en la app que si funciona)

--
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-android+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Jaume Tugores

unread,
Nov 27, 2016, 12:28:14 AM11/27/16
to desarrolladores-android
He hecho la prueba de Martín, he copiado el fichero  en la carpeta de Download y en este caso SI ha funcionado correctamente cargando el fichero.
Después de esto vuelvo a activar la carpeta vyvalavida y previamente en el provider_paths.xml le he añadido la linea:

<files-path name="external_files" path="vyvalavida/"/>

En este caso NO funciona, pero si que me ha dado un mensaje de error el logcat, aunque no consigo arreglarlo:

11-27 06:18:22.111 8969-8969/es.vyvalavida.excursions D/AndroidRuntime: Shutting down VM
11-27 06:18:22.112 8969-8969/es.vyvalavida.excursions E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: es.vyvalavida.excursions, PID: 8969
                                                                        java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/vyvalavida/penal.gpx
                                                                            at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:679)
                                                                            at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:378)
                                                                            at es.vyvalavida.excursions.laExcursion.Orux_gpx(laExcursion.java:275)
                                                                            at es.vyvalavida.excursions.laExcursion$cnxGpx.onPostExecute(laExcursion.java:200)
                                                                            at es.vyvalavida.excursions.laExcursion$cnxGpx.onPostExecute(laExcursion.java:172)
                                                                            at android.os.AsyncTask.finish(AsyncTask.java:660)
                                                                            at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:154)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)


Gracias por su interes.

Martin

unread,
Nov 27, 2016, 6:33:28 AM11/27/16
to desarrolladores-android
Buenas, creo que ese tipo de error suele darse cuando se intercambian cosas de acceso a external e internal storage;

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 * Si estas usando la memoria interna asegurate de usar:
en el xml (providers_path):

<files-path name="name" path="ruta/" />

en código java:
Context.getFilesDir()

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* En cambio, si estas usando la memoria externa
en el xml:
<external-files-path name="name" path="path" />

en código java:
Context.getExternalFilesDir() 

y en manifest el permiso: WRITE_EXTERNAL_STORAGE y/o READ_EXTERNAL_STORAGE

Jaume Tugores

unread,
Nov 28, 2016, 12:58:36 AM11/28/16
to desarrolladores-android
En el xml: 
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="vyvalavida/"/>
</paths>
 

y en la apertura de orux:
void Orux_gpx(String pGpx){
String ruta = Environment.getExternalStorageDirectory() + File.separator + "vyvalavida";
    File miGpx = new File(ruta, pGpx);

Uri gpxfURI = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", miGpx);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(gpxfURI,"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);
//finish();
} 

Con la carpeta de "vyvalavida" arranca el orux pero este no abre el archivo y ademas el logcat no da ninguna información.
Si cambio de carpeta por la de "Download", entonces va perfecto
He probado a con otras carpeta: "DCIM" y "pictures" y tampoco funcionan (ygual que vyvalavida)

Si cambio la carpeta a "Download"y en el xml tengo:
<external-path name="external_files" path="./"/>
tambien va perfecto

Si cambio la carpeta a "Download"y en el xml tengo:
<external-path name="external_files" path="vyvalavida/"/>
da error y si sale el logcat.

**NOTA: tengo instalada la aplicación de telegram (parecida al wastapp) y cuando me mandan un archivo gpx, para el orux, ocurre lo mismo que en mi app, el orux se abre pero no carga el archivo.

Gabriel Pozo

unread,
Nov 28, 2016, 9:57:34 AM11/28/16
to desarrolladores-android
Podrías pasar una salida bastante más extensa del logcat??

--
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 publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages