2012-08-02 9 views
11

Estoy desarrollando una aplicación con ContentProvider para ofrecer algunos archivos internos (archivos binarios). Cuando lo despliego en un Samsung Galaxy S, SII o cualquier otro, funciona perfectamente, compro cuando lo pruebo en un Galaxy Nexus o Nexus S, ¡no funciona!Proveedor de contenido que no funciona en los dispositivos de la familia Nexus

Escenario:

Mi ContentProvider se puede acceder con dos URIs. Dependiendo de este URI, el proveedor crea un DataCursor (extendiendo CrossProcessCursor) o ModelCursor (extendiendo CrossProcessCursos también). El hecho es que, en la familia Nexus, accedo al primer cursor (DataCursor) para recuperar un identificador, y funciona perfectamente, pero cuando se accede a la segunda, que siempre lanza "OutOfBoundsException" al intentar

getBlob ()

method.

Proveedor

@Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     Cursor cursor = null; 

     // If the third app requieres DATA (phrase id, phrase string and phrase name) 
     if(uri.toString().equalsIgnoreCase(ProviderConstants.DATA_URI.toString())) { 
      // Build the DataHelper and the customized cursor 
      DataHelper dataHelper = new DataHelper(getContext()); 
      cursor = new DataCursor(dataHelper); 
     } else if(uri.toString().equalsIgnoreCase(ProviderConstants.MODEL_URI.toString())) {    
      // Let's take the model id from the selectionArgs... 
      if (selectionArgs != null && selectionArgs.length > 0) { 
       String modelId = selectionArgs[0]; 

       // Get an instance to the persistent storage service... 
       File file = FileManager.getDirectory(getContext(), modelId); 
       FileSystemPersistentStorageService clientPersistentStorageService = new FileSystemPersistentStorageService(file); 

       cursor = new ModelCursor(clientPersistentStorageService); 
      } else { 
       Log.e("ContentProvider", "Query without model id on selectionArgs"); 
      } 
     } 

     return cursor; 
    } 

Si necesita algo de código ni nada, sólo tiene que pedirlo por favor!

Muchas gracias.

+0

Para empezar: ** 1. ** ¿Cuáles son las versiones exactas de SDK presentes en sus dispositivos Android? ** 2. ** ¿Cuáles son las versiones * SQLite * exactas en cada dispositivo ('adb shell sqlite3 --version') ** 3. ** ¿El código funciona correctamente en el emulador? ** 4. ** ¿Cuál es la pila de llamadas completa, cuando obtienes * OutOfBoundsException *? ** 5. ** ¿Cómo se implementa * ModelCursor *? ** 6. ** ¿Cuál es su modelo de base de datos? ** 7. ** ¿Cómo usas tu proveedor de contenido (código)? – vArDo

+0

1. De 2.3.3 a 4.0 (amplia gama de dispositivos) 2. ¿Importa? Puedo verificarlos, pero ModelCursor no obtiene datos de SQLite, solo del almacenamiento interno de archivos.3. [Para ser probado, gracias]. 4. [enlace] (http://pastebin.com/NS7zBSGx). 5. Simplemente mehotd 'getBlob' y los demás requieren [link] (http://pastebin.com/q4kMAEw3). 6. No se necesita una base de datos. 7. 'Cursor modelCursor = getContentResolver(). Query (Uri.parse (" content: // "+ PROVIDER_NAME +"/model "), null, null, new String [] {modelId}, null);' - 'modelCursor .getBlob (0); ' – manelizzard

+2

¿Ha intentado mover el cursor a la primera entrada? ('modelCursor.moveToFirst()') – SteveR

Respuesta

1

Finalmente recibí la respuesta. No era debido a los dispositivos, pero fue debido a la versión del sistema operativo Android.

Las versiones anteriores de 4.0.3 tenían el método fillWindow() de AbstarctCursor implementado de una manera, no siendo obligatorio establecer la posición del cursor en 0 para el primer elemento. Después de 4.0.3 (as seen here), se modificó este método, lo que resulta en no establecer la posición del cursor a 0.

la excepción lanzada fue:

07-31 11:35:09.938: W/System.err(2760): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 
07-31 11:35:09.985: W/System.err(2760):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418) 
07-31 11:35:09.989: W/System.err(2760):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
07-31 11:35:09.989: W/System.err(2760):  at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:44) 
07-31 11:35:09.993: W/System.err(2760):  at android.database.CursorWrapper.getBlob(CursorWrapper.java:122) 
07-31 11:35:09.993: W/System.err(2760):  at es.agnitio.kivox.mobile.internal.ModelImporterAndroidImpl.importModelPackage(ModelImporterAndroidImpl.java:44) 
07-31 11:35:09.993: W/System.err(2760):  at es.agnitio.kivox.mobile.internal.KivoxMobileBasicCode.importModel(KivoxMobileBasicCode.java:159) 
07-31 11:35:09.997: W/System.err(2760):  at es.agnitio.kivox.mobile.internal.KivoxMobileBasicImpl.importModel(KivoxMobileBasicImpl.java:47) 
07-31 11:35:09.997: W/System.err(2760):  at es.agnitio.kivoxmobile.testing.KivoxMobileBasicTrial.onCreate(KivoxMobileBasicTrial.java:63) 
07-31 11:35:09.997: W/System.err(2760):  at android.app.Activity.performCreate(Activity.java:5008) 
07-31 11:35:10.001: W/System.err(2760):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
07-31 11:35:10.001: W/System.err(2760):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
07-31 11:35:10.001: W/System.err(2760):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
07-31 11:35:10.004: W/System.err(2760):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
07-31 11:35:10.004: W/System.err(2760):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
07-31 11:35:10.004: W/System.err(2760):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-31 11:35:10.008: W/System.err(2760):  at android.os.Looper.loop(Looper.java:137) 
07-31 11:35:10.008: W/System.err(2760):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-31 11:35:10.008: W/System.err(2760):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-31 11:35:10.012: W/System.err(2760):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-31 11:35:10.012: W/System.err(2760):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-31 11:35:10.012: W/System.err(2760):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-31 11:35:10.016: W/System.err(2760):  at dalvik.system.NativeStart.main(Native Method) 

que muestra (después de la investigación profunda), que el cursor índice no se está configurando en fillWindow().

SOLUCIÓN

Para resolver este problema "fragmentación", sólo tiene que añadir moveToPosition(0) en métodos como moveToFirst() o move() (con algo de lógica de aplicaciones) de su cursor personalizado.Esto hará que el índice del cursor se establezca en 0, evitando la excepción de solicitud de índice "-1".

Espero que ayude a alguien =)

0

estoy un poco en necesidad de una bola de cristal para éste, pero ... se puede probar dos cosas:

  • Mover el cursor a la primera entrada, como SteveR sugeridos.

  • En segundo lugar, me encontré con un problema similar al trabajar con una tableta Dell Streak de 7 "Supuestamente era parte de una lista de dispositivos con una excepción particular en cuanto al acceso a su almacenamiento interno. se solucionó con una sentencia if. podría ser algo similar, aunque lo dudo, sobre todo porque el Nexus se supone que es el dispositivo del desarrollador.

Tal vez debería tratar de correr el más simple posible ContentProvider prueba de la aplicación y ver cómo se comporta en esos dispositivos.

+0

Disculpa por la respuesta tardía. Ya he probado todo eso. El punto es que 'moveToFirst()' devuelve 'false'. Es como que el sistema no puede encontrar el proveedor, es extraño, porque en otros dispositivos lo encuentra. – manelizzard

Cuestiones relacionadas