2

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

Вот часть 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

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

+0

Вы уверены, что сначала вы установили apk с провайдером? – Selvin

ответ

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

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

+0

Спасибо ;-) o бог, что маленькая точка. –

+0

Я не знаю, почему ... здесь http://developer.android.com/guide/topics/manifest/provider-element.html#nm thay сказал, что это должно быть «полное имя класса» или «с точкой» поэтому ваш подход должен быть в порядке – Selvin

1

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