2

私の目標はActivityなしでContentProviderを書くことです。テストのために私は自分のアプリでテスト活動を書いた。アンドロイドにロガーが含まれていると私に伝えたい人には、私はこれを知っています。ここで私の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 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> 

をmanifest.xmlにするために、コンテンツプロバイダ情報を追加することがである、私のクライアントの活動のうちの一部です別のアプリ。 42:52.099:

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の

5月27日12を見つける傾けることを私に伝え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の下で指定したクラスのゼロ引数コンストラクタがシステムで見つからないため、プロバイダのランタイム登録が失敗します。

関連する問題