ContactProvider.javapackage waterlife.demo.contact;import java.util.Map;import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.net.Uri;
import android.content.UriMatcher;
public class ContactProvider extends ContentProvider {
private final static int Contact = 1;
private final static int Contact_ID = 2;
private static final String AUTHORITY = "waterlife.demo.contact";
private  static UriMatcher uriMatcher;
private DatabaseHelper mDatabaseHelper; 
private static Map<String, String> contactProjecttionMap;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(ContactProvider.AUTHORITY, "contacts", Contact);
uriMatcher.addURI(ContactProvider.AUTHORITY, "contacts/#", Contact_ID);
}
public static final class ContactColumns implements BaseColumns{
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/contacts");
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.contact";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.contact";
public static final String NAME = "name";
public static final String PHONE_NUMBER = "";

}

private static class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "myContact.db";
private static final int DATABASE_VERSION = 1;
private static final String Contact_Table = "myContactTable";

DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE" + Contact_Table + "(" +
ContactColumns._ID + "INTERGER PRIMARY KEY," +
ContactColumns.NAME + "TEXT," +
ContactColumns.PHONE_NUMBER + "TEXT" + ");");

} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXIT" + Contact_Table);
onCreate(db);
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int count;
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
switch(uriMatcher.match(uri))
{
case Contact:
count = db.delete(DatabaseHelper.Contact_Table, selection, selectionArgs);
break;
case Contact_ID:
String contactId = uri.getPathSegments().get(1);
count = db.delete(DatabaseHelper.Contact_Table, ContactColumns._ID + "=" + contactId
+ (!TextUtils.isEmpty(selection)? "AND(" + selection + ")" : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("UNKNOW URI" + uri);
}
return count;
} @Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
switch(uriMatcher.match(uri))
{
case Contact:
return ContactColumns.CONTENT_TYPE;
case Contact_ID:
return ContactColumns.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("UNKNOW URI" + uri);
}
} @Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
if(values != null)
{ long rowID = db.insert(DatabaseHelper.Contact_Table, null, values);
if(rowID > 0)
{
return ContentUris.withAppendedId(ContactColumns.CONTENT_URI, rowID);
}
}
        
return null;
} @Override
public boolean onCreate() {
// TODO Auto-generated method stub
mDatabaseHelper = new DatabaseHelper(getContext());
return false;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
switch(uriMatcher.match(uri))
{
case Contact:
qb.setTables(DatabaseHelper.Contact_Table);
qb.setProjectionMap(contactProjecttionMap);
break;
case Contact_ID:
qb.setTables(DatabaseHelper.Contact_Table);
qb.setProjectionMap(contactProjecttionMap);
qb.appendWhere(ContactColumns._ID+"=" + uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("UNKONW URI" + uri);
}
SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, null);
return cursor;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
int count;
switch(uriMatcher.match(uri))
{
case Contact:
count = db.update(DatabaseHelper.Contact_Table, values, selection, selectionArgs);
break;
case Contact_ID:
String contactId = uri.getPathSegments().get(1);
count = db.update(DatabaseHelper.Contact_Table, values, ContactColumns._ID + "=" + contactId 
+ (!TextUtils.isEmpty(selection)? "AND("+selection+")" : "")
, selectionArgs);
break;
default:
throw new IllegalArgumentException("UNKNOW URI"+uri);
}
return count;
}}

解决方案 »

  1.   

    AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="waterlife.demo"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
         <Provider android.name="contact.ContactProvider" android.authorities = "waterlife.demo.contact" />
        
            <activity android:name=".tabactivity.MyTabActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <activity android:name=".contact.MyContact"
                      android:label="@string/contact_name">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <action android:name="android.intent.action.EDIT" />
                    <action android:name="android.intent.action.PICK" />
                    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.dir/vnd.google.contact" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.GET_CONTENT"/>
                    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.item/vnd.google.contact" />
                </intent-filter>
            </activity>
            
            <activity android:name=".contact.MyContactDetail"
                      android:label="@string/contact_detail_name">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <action android:name="android.intent.action.EDIT" />
                    <action android:name="android.intent.action.EDIT_NOTE" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:mimeType="vnd.android.cursor.dir/vnd.google.contact" />          
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.INSERT" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:mimeType="vnd.android.cursor.item/vnd.google.contact" />          
                </intent-filter>
            </activity>    </application>
    </manifest> 
      

  2.   

    Error Log:06-09 16:31:46.332: INFO/jdwp(1538): received file descriptor 30 from ADB
    06-09 16:31:46.502: WARN/System.err(1538): Can't dispatch DDM chunk 46454154: no handler defined
    06-09 16:31:46.522: WARN/System.err(1538): Can't dispatch DDM chunk 4d505251: no handler defined
    06-09 16:31:51.142: DEBUG/dalvikvm(849): GC freed 164 objects / 9968 bytes in 113ms
    06-09 16:32:04.608: ERROR/ActivityThread(1538): Failed to find provider info for waterlife.demo.contact
    06-09 16:32:05.192: WARN/KeyCharacterMap(1538): No keyboard for id 0
    06-09 16:32:05.202: WARN/KeyCharacterMap(1538): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
    06-09 16:32:06.202: ERROR/ActivityThread(1538): Failed to find provider info for waterlife.demo.contact
    06-09 16:32:06.212: INFO/ActivityManager(584): Starting activity: Intent { action=android.intent.action.INSERT data=content://waterlife.demo.contact/contacts }
    06-09 16:32:06.232: DEBUG/AndroidRuntime(1538): Shutting down VM
    06-09 16:32:06.232: WARN/dalvikvm(1538): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
    06-09 16:32:06.243: ERROR/AndroidRuntime(1538): Uncaught handler: thread main exiting due to uncaught exception
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538): android.content.ActivityNotFoundException: No Activity found to handle Intent { action=android.intent.action.INSERT data=content://waterlife.demo.contact/contacts }
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1484)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1454)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Activity.startActivityFromChild(Activity.java:2812)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Activity.startActivityForResult(Activity.java:2676)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Activity.startActivity(Activity.java:2700)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at waterlife.demo.contact.MyContact.onOptionsItemSelected(MyContact.java:49)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.Activity.onMenuItemSelected(Activity.java:2085)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:820)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:813)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:519)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.view.View.onTouchEvent(View.java:3828)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.widget.TextView.onTouchEvent(TextView.java:6291)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.view.View.dispatchTouchEvent(View.java:3368)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.os.Handler.dispatchMessage(Handler.java:99)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.os.Looper.loop(Looper.java:123)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at android.app.ActivityThread.main(ActivityThread.java:3948)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at java.lang.reflect.Method.invoke(Method.java:521)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    06-09 16:32:06.282: ERROR/AndroidRuntime(1538):     at dalvik.system.NativeStart.main(Native Method)
    06-09 16:32:06.323: INFO/Process(584): Sending signal. PID: 1538 SIG: 3
    06-09 16:32:06.323: INFO/dalvikvm(1538): threadid=7: reacting to signal 3
    06-09 16:32:06.442: INFO/dalvikvm(1538): Wrote stack trace to '/data/anr/traces.txt'求教为什么会找不到provider信息呢?
      

  3.   


    06-09 16:32:06.282: ERROR/AndroidRuntime(1538): android.content.ActivityNotFoundException: No Activity found to handle Intent { action=android.intent.action.INSERT data=content://waterlife.demo.contact/contacts }
    看log,不仅provider没有,并且.contact.MyContactDetail这个也没有。
    请将androidManifest.xml里面,contact.ContactProvider改为.ContactProvider。
      

  4.   

    <Provider android.name="contact.ContactProvider" android.authorities = "waterlife.demo.contact" />
    这句改为<Provider android.name=".contact.ContactProvider" android.authorities = "waterlife.demo.contact" />
      

  5.   

    contact.ContactProvider和.contact.ContactProvider相差一个"."但是读取文件时一个的读取路径为 workspace/contact/ContactProvider.java一个为 workspace/waterlife/demo/contact/ContactProvider.java
      

  6.   

    我用activity contact.MyContact,有点,没点都可以找到。
    我也测试了notepad的例子,有没有点好像没什么不同。
      

  7.   

    而且加点也还是找不到provider info..........
      

  8.   

    import waterlife.demo.R;
    把这行删除了,看看!
      

  9.   

    看LZ的错误 应该只没找到你写的那个Provider类
    Manifest.xml里面对应的Provider:name直接上包名waterlife.demo.contact了?
      

  10.   

    import waterlife.demo.R;我确定,你的java文件里,有这行,编译是不会通过的
      

  11.   

    怎么会编不过呢,我的AndroidManifest.xml的package="waterlife.demo",自然生成的R文件就是waterlife.demo.R了
      

  12.   

    就是找不到provider,我把整个packet绝对路径都写上,还是不行。
    搞的我没脾气了.....
      

  13.   

    你的意思是Provider:name=waterlife.demo.contact?
      

  14.   

    import waterlife.demo.contact.gContactProvider.ContactColumns;
    这句import,gContactProvider需要更改为ContactProvider,或者说工程里面有两个provider?
      

  15.   

    问题找到了,错在这一行:
    <Provider android.name="contact.ContactProvider" android.authorities = "waterlife.demo.contact" />
    Provider 应改为小写provider;
    android.name---->android:name;
    android.authorities ---->android:authorities.
    谢谢各位。