web-dev-qa-db-ja.com

プロバイダー情報エラーが見つかりませんでした

コンテンツプロバイダーを作成しようとしていますが、「com.example.alex.hopefulyworksのプロバイダー情報が見つかりませんでした」というエラーが発生して問題が発生します

ここにマニフェストとコンテンツプロバイダーがあります

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.alex.hopefulythisworks" >

    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider Android:name=".ColorContentProvider"
            Android:authorities="com.example.alex.hopefulythisworks.ColorContentProvider"
            Android:enabled="true"
            Android:exported="true" >
        </provider>

    </application>

</manifest>





    package com.example.alex.hopefulythisworks;
     ....
    public class ColorContentProvider extends ContentProvider {

    private ColorHelper database;

    private static final String AUTHORITY
            = "com.example.alex.hopefulythisworks";

    private static final String BASE_PATH
            = "tasks";

    public static final Uri CONTENT_URI
            = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
    public static final String CONTENT_URI_PREFIX
            = "content://" + AUTHORITY + "/" + BASE_PATH + "/";

    private static final UriMatcher sURIMatcher =
            new UriMatcher(UriMatcher.NO_MATCH);

    private static final int COLOR = 1;
    private static final int COLOR_ROW = 2;

    static {
        sURIMatcher.addURI(AUTHORITY, BASE_PATH, COLOR);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", COLOR_ROW);
    }



    @Override
    public boolean onCreate() {
        database = new ColorHelper(getContext());
       Log.d("contentprovider" , "inside content provider oncreate ");
        return false;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int uriType = sURIMatcher.match(uri);

        SQLiteDatabase sqlDB = database.getWritableDatabase();

        long id = 0;
        switch (uriType) {
            case COLOR:
                id = sqlDB.insert(ColorTable.TABLE_TASK,
                        null, values);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: "
                        + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return Uri.parse( CONTENT_URI_PREFIX + id);
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {

        // check if the caller has requested a column which does not exists
        ColorTable.validateProjection( projection );

        // Using SQLiteQueryBuilder instead of query() method
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

        queryBuilder.setTables( ColorTable.TABLE_TASK );

        switch ( sURIMatcher.match(uri) ) {
            case COLOR:
                break;
            case COLOR_ROW:
                // add the task ID to the original query
                queryBuilder.appendWhere( ColorTable.COLUMN_ID + "=" + uri.getLastPathSegment() );
                break;
            default:
                throw new IllegalArgumentException("Invalid URI: " + uri);
        }

        System.out.println("before null check");
        if(database == null){
            System.out.println("database is null");
            database = new ColorHelper(getContext());
        }
        System.out.println("after null check");

        SQLiteDatabase db = database.getWritableDatabase();
        Cursor cursor = queryBuilder.query( db, projection, selection,
                selectionArgs, null, null, sortOrder);

        // notify listeners
        cursor.setNotificationUri(getContext().getContentResolver(), uri);

        return cursor;
    }


    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase sqlDB = database.getWritableDatabase();
        int rowsDeleted = 0;
        switch ( sURIMatcher.match(uri) ) {
            case COLOR:
                rowsDeleted = sqlDB.delete(ColorTable.TABLE_TASK, selection, selectionArgs);
                break;
            case COLOR_ROW:
                String id = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsDeleted = sqlDB.delete( ColorTable.TABLE_TASK,
                            ColorTable.COLUMN_ID + "=" + id,
                            null);
                } else {
                    rowsDeleted = sqlDB.delete( ColorTable.TABLE_TASK,
                            ColorTable.COLUMN_ID + "=" + id
                                    + " and " + selection,
                            selectionArgs);
                }
                break;
            default:
                throw new IllegalArgumentException("Invalid URI: " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return rowsDeleted;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection , String[] selectionArgs) {


        SQLiteDatabase sqlDB = database.getWritableDatabase();
        int rowsUpdated = 0;
        switch ( sURIMatcher.match(uri) ) {
            case COLOR:
                rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
                        values,
                        selection,
                        selectionArgs);
                break;
            case COLOR_ROW:
                String id = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
                            values,
                            ColorTable .COLUMN_ID + "=" + id,
                            null );
                } else {
                    rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
                            values,
                            ColorTable.COLUMN_ID + "=" + id
                                    + " and " + selection,
                            selectionArgs);
                }
                break;
            default:
                throw new IllegalArgumentException("Invalid URI: " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return rowsUpdated;
    }





}
11
user2871354

authoritiesはパッケージ名のみを持つ必要があり、nameは完全なパッケージおよびクラス名です。

    <provider Android:name="com.example.alex.hopefulythisworks.ColorContentProvider"
        Android:authorities="com.example.alex.hopefulythisworks"
        Android:enabled="true"
        Android:exported="true" >
    </provider>

これは、Uriの構築に使用しているものと一致する必要があることに注意してください。

 private static final String AUTHORITY = "com.example.alex.hopefulythisworks";

Androidドキュメント

22
Android:authorities="com.example.alex.hopefulythisworks.ColorContentProvider"

同じである必要があります

private static final String AUTHORITY
        = "com.example.alex.hopefulythisworks";

別の解決策はAUTHORITY

private static final String AUTHORITY
        = "com.example.alex.hopefulythisworks.ColorContentProvider";

それが役に立てば幸い。

5
Euporie

authoritysearchableとして完全修飾名を使用していること、および以下のようにマニフェストファイルで宣言されているプロバイダーで使用していることを確認してください。

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:hint="@string/action_search"
    Android:label="@string/app_name"
    Android:searchSuggestAuthority="your_pakcage_name.SearchSuggestionProvider"
    Android:searchSuggestSelection=" ?" />


<provider
    Android:authorities="your_pakcage_name.SearchSuggestionProvider"
    Android:name="your_pakcage_name.SearchSuggestionProvider"
    Android:exported="true"
    Android:enabled="true"
    Android:multiprocess="true"/>

プロバイダーに機密情報がある場合は、エクスポートされたものがtrueではないことを確認してください

3
Nauman Zubair
 <provider 
 Android:name="com.example.absolutelysaurabh.todoapp.ColorContentProvider"
  Android:authorities="com.example.absolutelysaurabh.todoapp
  Android:enabled="true"
  Android:exported="false" >
</provider>

[〜#〜]重要[〜#〜]:「契約」クラスで、ここで使用されているものと同じ権限、つまり「com.example.absolutelysaurabh.todoapp」も使用していることを確認してください

1
Saurabh Singh