Как я могу вызвать getContentResolver в Android?

Я пишу класс библиотеки, чтобы инкапсулировать часть моей логики в моем первом приложении для Android. Одна из функций, которую я хочу инкапсулировать, - это функция, которая запрашивает адресную книгу. Таким образом, ему нужен ContentResolver. Я пытаюсь понять, как сохранить функции библиотеки в черном ящике ... то есть избежать того, чтобы каждый Activity проход в своем собственном контексте получал ContentResolver.

Проблема в том, что я всю жизнь не могу понять, как получить ContentResolver из моей библиотечной функции. Я не могу найти импорт, содержащий getContentResolver. Googling сказал использовать getContext, чтобы получить Context для вызова getContentResolver, но я также не могу найти импорт, содержащий getContext. В следующих сообщениях говорилось, что используется getSystemService, чтобы получить объект для вызова getContext. НО - я тоже не могу найти импорт, содержащий getSystemService!

Итак, я застрял в недоумении, как я могу получить ContentResolver в инкапсулированной библиотечной функции, или я в значительной степени застрял в том, что каждый вызов Activity передает ссылку на свой собственный контекст?

Мой код выглядит примерно так:

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 - это метод, в котором я искал, чтобы избежать необходимости передавать Context или ContentResolver, если бы я мог, поскольку я надеялся, что он будет полностью закрашен черным ящиком.


person eidylon    schedule 04.02.2011    source источник


Ответы (4)


Передайте каждый вызов библиотечной функции _1 _... Или расширьте Application, чтобы сохранить контекст и получить к нему статический доступ.

person techiServices    schedule 04.02.2011
comment
Каковы были бы другие возможные побочные эффекты или подводные камни при расширении Application? Будет ли что-нибудь, что мне нужно будет очистить в методе деструктора или в чем-то еще, или? - person eidylon; 05.02.2011
comment
Хорошо, я пытаюсь пойти по этому пути. У меня есть класс, который extends Application, и я добавил полное имя класса как android:name в файл манифеста приложения. Итак, теперь в моем библиотечном классе я пытаюсь вызвать getApplication(), но он не находит его как метода и не дает мне никаких намеков на рефакторинг необходимого импорта для добавления. Как я могу позвонить getApplication(), чтобы получить дескриптор приложения? - person eidylon; 06.02.2011

Вы можете использовать это так:

getApplicationContext().getContentResolver() with the proper context.
getActivity().getContentResolver() with the proper context.
person codercat    schedule 11.10.2013

Вот как я закончил это для всех, кто может найти эту ветку в будущем:

Я использовал метод sugarynugs для создания класса extends Application, а затем добавил соответствующую регистрацию в файл манифеста приложения. Тогда код моего класса приложения:

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();
    }
}

Затем, чтобы получить ContentResolver в моем классе библиотеки, мой код функции будет таким:

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;
}
person eidylon    schedule 06.02.2011
comment
Как вы можете управлять разрешениями для этого? Если вы хотите ограничить доступ к данным для некоторых приложений, использующих вашу библиотеку, как мы можем этого добиться? - person Manohar; 12.07.2012

Немного сложно не видеть больше того, как вы кодируете свою библиотеку, но я не вижу другого варианта использования контекста и поэтому передайте его при вызове этого класса.

«Случайный» класс не имеет среды для получения обработчика контента: вам нужен контекст.

Теперь не так уж и странно передать ваш (активный) контекст вашему классу. Из http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

В Android контекст используется для многих операций, но в основном для загрузки и доступа к ресурсам. Вот почему все виджеты получают параметр Context в своем конструкторе. В обычном приложении для Android обычно есть два типа контекста: действие и приложение. Обычно это первый метод, который разработчик передает классам и методам, которым требуется контекст.

(курсив мой)

person Nanne    schedule 04.02.2011
comment
Я добавил небольшой фрагмент кода, показывающий, что я пытался сделать. - person eidylon; 05.02.2011
comment
Я думаю, что передача контекста, чтобы вы могли использовать его для получения contentresolver, - это ваше решение :) - person Nanne; 05.02.2011