如果两个应用程序具有相同的sharedUserId,为什么应用程序无法访问其他应用程序的内容提供程序?

时间:2015-08-27 18:59:15

标签: android permissions android-contentprovider

好的,我有两个应用程序。 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;
    }

0 个答案:

没有答案