2011-09-18 40 views
30

Tôi gặp vấn đề mà tôi không thể tìm ra. Tôi đang sử dụng Eclipse để tạo cung cấp nội dung của riêng tôi nhưng vẫn gặp lỗi sau:Không thể tìm thấy thông tin nhà cung cấp cho 'ContentProvider'

[..] ERROR/ActivityThread(1051): Failed to find provider info for my.package.provider.countrycontentprovider

Mã tìm thấy ở đây: http://codepad.org/Rx00HjHd

phần chính:

public class CountryContentProvider extends ContentProvider { 

    public static final String PROVIDER = 
     "my.package.provider.countrycontentprovider"; 
    public static final Uri CONTENT_URI = 
     Uri.parse("content://" + PROVIDER + "/country"); 
    // ... 
    @Override 
    public boolean onCreate() { return true; } 
    // ... 
} 


// from my activity 
ContentResolver resolver = getContentResolver(); 
Cursor c = resolver.query(CountryContentProvider.CONTENT_URI, 
            null, null, null, null); 

// AndroidManifest.xml 
<provider 
    android:name="my.package.provider.CountryContentProvider" 
    android:authorities="my.package.provider.countrycontentprovider" /> 

Tôi đã thêm các nhà cung cấp đến biểu hiện và trả về true từ hàm onCreate. Tôi sử dụng CountryContentProvider.CONTENT_URI trong hoạt động của mình để lấy Nội dung từ nhà cung cấp của tôi, nhưng tôi vẫn tiếp tục nhận được thông báo lỗi đó. Tôi đã gỡ bỏ và thêm mã ba lần (trong trường hợp nhật thực tan chảy) để không có kết quả.
Tôi phải thiếu điều gì đó. Ai đó có thể chỉ cho tôi đi đúng hướng?

Trả lời

48

Tôi đã có thể tạo lại sự cố của bạn khi tôi chuyển nhà cung cấp <> trong số < ứng dụng> ... </application> thẻ. Eclipse không nói bất cứ điều gì như lỗi hoặc cảnh báo.

May mắn thay vấn đề này được phát hiện bởi Android Lint bắt đầu từ ADT 20.

+2

Vì vậy, tôi có nghĩa là thẻ ' 'phải được đặt trong thẻ' '. –

+2

Ngoài ra, hãy cẩn thận để không đặt nó bên trong một thẻ như tôi đã làm ngay từ đầu. –

14

Nó làm việc cho tôi chỉ sau khi xác định đường dẫn đầy đủ trong Authorities thẻ trong file manifest (xem SearchableDictionary mẫu mã trong SDK).

<provider android:name=".DictionaryProvider" 
     android:authorities="com.example.android.searchabledict.DictionaryProvider"> 
1

Thiết lập thuộc tính xuất khẩu là true trong thẻ cung cấp dịch vụ trong biểu hiện làm việc cho tôi:

android:exported="true" 

Theo tài liệu (http://developer.android.com/guide/topics/manifest/provider-element.html#exported), xuất khẩu là cần thiết chỉ nếu nhà cung cấp là có sẵn cho các ứng dụng khác. Nhưng đây là giải pháp duy nhất có hiệu quả đối với tôi.

-1

bạn có một chữ cái viết hoa và trên một dòng khác, một chữ thường.

android: name = "my.package.provider.- C -ountryContentProvider" android: cơ quan chức năng = "my.package.provider.- c -ountrycontentprovider"

nó phải giống nhau mọi nơi.

public static final String PROVIDER = 
    "my.package.provider.countrycontentprovider"; 
+0

Các nhà chức trách cần phải khớp (tức là, giống như trong tệp kê khai như trong tệp lớp - 'my.package.provider.countrycontentprovider'). Và tên lớp cần phải khớp - 'my.package.provider.CountryContentProvider'. Vì vậy, tôi không nghĩ rằng đây là vấn đề. –

-2

đăng ký cung cấp dịch vụ của bạn trong Android Manifest

<provider 
    android:authorities="your_content_authority" 
    android:name="yourProviderClass"/> 
+1

Các op đã thực hiện nó. –

0

Các android: cơ quan chức năng = trong file XML là cơ quan nội dung nằm trong lớp hợp đồng mà bạn có thể xây dựng. Thẩm quyền nội dung được thêm vào lược đồ để tạo URI nội dung cơ bản. Tiếng Anh đơn giản, tên miền ngược bạn đã sử dụng để làm cho ứng dụng của bạn không có mũ tại đây com.domain.sub.appName.

Tên android: là thư mục cộng với lớp mà nhà cung cấp của bạn được đặt tên, đừng quên dấu chấm .folder.ProviderClassContentAuthorityIsIn.

Hy vọng điều này sẽ giúp :)

Các vấn đề liên quan