好的,我有两个应用程序。 Alpha和Beta。 Alpha有一个导出的内容提供商。 Alpha和beta具有相同的字符串值。
机器人:sharedUserId = com.app.sharedId
如果应用'Beta'也在AndroidManifest.xml中设置了此值,则无法访问内容提供商。我得到以下callstack:
java.lang.RuntimeException:无法启动活动 ComponentInfo {} com.geoff.messenger.app/com.geoff.messenger.app.activities.SelectRecipientActivity: 显示java.lang.NullPointerException 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 在android.app.ActivityThread.access $ 800(ActivityThread.java:135) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:136) 在android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) 引起:java.lang.NullPointerException 在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 在com.geoff.contacts.app.providers.MyContactsProvider.query(MyContactsProvider.java:45) 在android.content.ContentProvider.query(ContentProvider.java:857) 在android.content.ContentProvider $ Transport.query(ContentProvider.java:200) 在android.content.ContentResolver.query(ContentResolver.java:461) 在android.content.ContentResolver.query(ContentResolver.java:404) at com.geoff.messenger.app.activities.SelectRecipientActivity.setupContentResolver(SelectRecipientActivity.java:51) 在com.geoff.messenger.app.activities.SelectRecipientActivity.onCreate(SelectRecipientActivity.java:28) 在android.app.Activity.performCreate(Activity.java:5231) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 在android.app.ActivityThread.access $ 800(ActivityThread.java:135) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:136) 在android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 在dalvik.system.NativeStart.main(本地方法)
我不明白为什么使用相同的sharedUserId会成为访问内容提供商的问题。我也不明白为什么错误信息没有暗示问题。
有人评论说,问题可能在于我的内容提供商的查询方法。代码就在这里:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(UserContract.TABLE_NAME);
// TODO use Uri matcher to parse the URI, but for now it's just 'all'
SQLiteDatabase database = dbHelper.getWritableDatabase();
Cursor cursor = builder.query(database, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}