мой Android ContentProvider не может найти ContentResolver

Моя цель — написать ContentProvider без Activity. Для тестирования я написал тест - активность в собственном приложении. Для тех, кто хочет сказать мне, что есть еще логгер, включенный в андроид, я знаю это.

Вот часть ContentProvider

public static final String AUTHORITY = "de.xyz.android.log4android";
public static final int LOGGER_ARROW_URI_ID = 1;
public static final String ARROW_CONTENT_TYPE = 
    "vnd.de.xyz.android.cursor.dir/vnr.log";

public static final int LOGGER_ITEM_URI_ID = 2;
public static final String ITEM_CONTENT_TYPE = 
    "vnd.de.xyz.android.cursor.item/vnr.log";

public static final UriMatcher sUriMatcher;
static {
    sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    sUriMatcher.addURI(AUTHORITY, LOGGER_TABLE, LOGGER_ARROW_URI_ID);
    sUriMatcher.addURI(AUTHORITY, LOGGER_TABLE + "#", LOGGER_ITEM_URI_ID);
}

public static final Uri CONTENT_URI = Uri.parse("content://"
        + LogServiceProvider.AUTHORITY + "/logs");

public static final DefaultLogEntry LOG_ENTRY = null;

//Some more not important code

@Override
public Uri insert(Uri uri, ContentValues initialValues) {
    synchronized (this) {
        try {
            long rowID = dbHelper.getWritableDatabase().insert(LOGGER_TABLE,
                    null, initialValues);

            if (rowID > 0) {
                Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
                getContext().getContentResolver().notifyChange(_uri, null);
                return _uri;
            }
        } catch (Exception ex) {
        }
        throw new SQLException("Failed to insert row into " + uri);
    }
}

//Some more not important code

Поэтому я также добавляю информацию о контент-провайдере в manifest.xml.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="de.xyz.android.logger"
          android:versionCode="1"
          android:versionName="1.0">

    <provider 
        android:name="de.xyz.android.logger.LogServiceProvider" 
        android:authorities="de.xyz.android.log4android"/>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <uses-sdk android:minSdkVersion="4" /> 
</application>

Вот часть моей клиентской активности, которая находится в отдельном приложении.

ContentResolver cr = getContentResolver();
Uri getItem = Uri.parse("content://de.xyz.android.log4android/logs");
ContentValues values = new ContentValues();
values.put("level","WARNING");
values.put("time","1986-11-16");
values.put("message","FistTest");
values.put("owner","jsb");
values.put("file","testLog.java");
values.put("line","27");
Uri newItem = cr.insert(getItem, values);

LogCat говорит мне, что TestClient не может найти ContentProvider

05-27 12:42:52.099: ERROR/ActivityThread(548): не удалось найти информацию о поставщике для de.xyz.android.log4android

Где моя ошибка. На мой взгляд, я сделал все, что указано в: Поставщики контента | Android. Было бы неплохо, если бы вы могли мне подсказать. Если вам нужно больше фрагментов кода для понимания, спросите меня.


person Jonny Schubert    schedule 27.05.2011    source источник
comment
Вы уверены, что сначала установили apk с провайдером?   -  person Selvin    schedule 27.05.2011


Ответы (2)


<provider android:name=".LogServiceProvider"
          android:authorities="de.xyz.android.log4android"
          android:exported="true" />

должно помочь :)

person Selvin    schedule 27.05.2011
comment
Спасибо ;-) о боже, эта маленькая точка. - person Jonny Schubert; 27.05.2011
comment
я не знаю почему... здесь developer.android. com/guide/topics/manifest/ сказал, что это должно быть полное имя класса или с точкой, поэтому ваш подход тоже должен быть в порядке - person Selvin; 27.05.2011

Один эзотерический способ, в котором это может потерпеть неудачу, - это если у вас есть конструктор, определенный для вашего поставщика контента, который принимает аргумент. Это приведет к тому, что конструктор аргумента 0 по умолчанию не будет существовать. Это приводит к сбою регистрации поставщика во время выполнения, поскольку система не может найти конструктор с нулевым аргументом в классе, который вы указали в android:name в манифесте.

person Addi    schedule 06.10.2011