2011-02-04 28 views
12

Estoy escribiendo una clase de biblioteca para encapsular parte de mi lógica en mi primera aplicación de Android. Una de las funciones que quiero encapsular es una función que consulta la libreta de direcciones. Como tal, necesita un ContentResolver. Estoy tratando de averiguar cómo mantener las funciones de la biblioteca en negro ... es decir, para evitar que cada Activity pase en su propio contexto para obtener un ContentResolver.¿Cómo puedo llamar a getContentResolver en android?

El problema es que no puedo entender cómo obtener un ContentResolver dentro de la función de mi biblioteca. No puedo encontrar una importación que contenga getContentResolver. Googling dijo que use getContext para obtener un Context al que llamar al getContentResolver, pero tampoco puedo encontrar una importación que contenga getContext. Las siguientes publicaciones dicen que use getSystemService para obtener un objeto para llamar al getContext. PERO - ¡No puedo encontrar ninguna importación que contenga getSystemService tampoco!

Así que estoy atascado preguntándome, ¿cómo puedo obtener un ContentResolver dentro de una función de biblioteca encapsulada, o estoy bastante atascado haciendo que cada llamada Activity pase en una referencia a su propio contexto?

Mi código es algo básicamente lo siguiente:

public final class MyLibrary { 
    private MyLibrary() { } 

    // take MyGroupItem as a class representing a projection 
    // containing information from the address book groups 
    public static ArrayList<MyGroupItem> getGroups() { 
     // do work here that would access the contacts 
     // thus requiring the ContentResolver 
    } 
} 

getGroups es el método en el que estaba buscando para evitar tener que pasar en un Context o ContentResolver si pudiera, como yo esperaba que fuese de forma limpia negro -boxed

Respuesta

7

Haga que cada función de biblioteca pase de llamada en un ContentResolver ... O extienda Application para mantener un contexto y acceder a él estáticamente.

+0

¿Cuáles serían los posibles efectos secundarios o "errores" de la extensión de la "Aplicación"? ¿Hubiera algo que necesitaría limpiar en un método destructor o algo así, o? – eidylon

+0

Bien, entonces estoy tratando de seguir esta ruta. Tengo una clase que 'extiende la Aplicación' y he agregado el nombre de la clase totalmente calificado como' android: name' en el archivo de manifiesto de la aplicación. Así que ahora en mi clase de biblioteca, intento llamar a 'getApplication()', pero no lo encuentro como un método, y no me da indicaciones de refactorización de una importación necesaria para agregar. ¿Cómo puedo llamar a 'getApplication()' para obtener el control de la aplicación? – eidylon

+0

No importa, lo tengo calculado. ¡Gracias por la ayuda! ¡Aclamaciones! – eidylon

2

Un poco difícil sin ver más de cómo está codificando su biblioteca, pero no veo otra opción para usar el contexto, y pasarlo cuando llame a esa clase.

Una clase 'aleatoria' no tiene el entorno para obtener un resguardo de contenido: necesita un contexto.

Ahora no es demasiado extraño pasar su contexto (actividad) a su clase. De http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

En Android, un contexto se utiliza para muchas operaciones, pero sobre todo para cargar y recursos de acceso. Esta es la razón por la cual todos los widgets reciben un parámetro Context en su constructor. En una aplicación normal de Android , generalmente tiene dos tipos de Contexto, Actividad y Aplicación . Por lo general es el primer que el desarrollador pasa a clases y métodos que necesitan un contexto

(el énfasis es mío)

+0

Actualicé con un pequeño fragmento de código que muestra lo que estaba tratando de hacer. – eidylon

+0

Creo que pasar el contexto para que pueda usarlo para obtener el resuelve contenido es su solución :) – Nanne

+0

no si solo necesita el resguardo de contenido ... – techiServices

5

Así es como acabé haciendo esto, para cualquiera que pueda encontrar este hilo en el futuro:

Usé el método sugarynugs para crear una clase que extends Application, y luego agregué el registro correspondiente en el archivo de manifiesto de la aplicación.El código para mi clase de aplicación es entonces:

import android.app.Application; 
import android.content.ContentResolver; 
import android.content.Context; 

public class CoreLib extends Application { 
    private static CoreLib me; 

    public CoreLib() { 
     me = this; 
    } 

    public static Context Context() { 
     return me; 
    } 

    public static ContentResolver ContentResolver() { 
     return me.getContentResolver(); 
    } 
} 

Luego, para obtener una ContentResolver en mi clase de biblioteca, mi código de función es tal:

public static ArrayList<Group> getGroups(){ 
    ArrayList<Group> rv = new ArrayList<Group>(); 

    ContentResolver cr = CoreLib.ContentResolver(); 
    Cursor c = cr.query(
     Groups.CONTENT_SUMMARY_URI, 
     myProjection, 
     null, 
     null, 
     Groups.TITLE + " ASC" 
    ); 

    while(c.moveToNext()) { 
     rv.add(new Group(
      c.getInt(0), 
      c.getString(1), 
      c.getInt(2), 
      c.getInt(3), 
      c.getInt(4)) 
     );   
    } 

    return rv; 
} 
+1

¿Cómo puede gestionar los permisos para esto? Si desea restringir la exposición de datos para algunas aplicaciones que usan su biblioteca, ¿cómo podemos lograr eso? – Manohar

7

Se puede utilizar la siguiente manera:

getApplicationContext().getContentResolver() with the proper context. 
getActivity().getContentResolver() with the proper context. 
Cuestiones relacionadas