我需要通过前台用户从其他服务访问系统用户创建的数据库。这两种服务都是同一个应用程序的一部分。
创建了一个系统服务,它创建了一个数据库并通过 ContentProvider 公开它。在另一个应用程序中,前台用户尝试通过 ContentResolver 访问它。
添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
清单声明
<service
android:name=".EXDBService"
android:enabled="true"
android:singleUser="true"
android:exported="true" />
<service
android:name=".EXService"
android:enabled="true"
android:exported="true"
android:permission="com.example.EX_SERVICE" />
<provider
android:name=".EXDBMananger"
android:authorities="com.example.provider"
android:exported="true"
android:readPermission="com.example.provider.READ_DATABASE"
android:writePermission="com.example.provider.WRITE_DATABASE" />
但是当使用 Contentresolver 发出插入/更新等请求时,它会抛出无法打开数据库的错误。
ContentResolver resolver = getContentResolver();
Uri uri = DbContract.BASE_CONTENT_URI;
// initiate contentValues with valid data
Cursor cursor = resolver.insert(uri, contentValues);
希望我能在这里分享更多的代码,但是有什么猜测会导致这个问题吗?
我看到用户 id 11 试图访问在用户 0 上运行的其他应用程序上的数据库。这会导致任何权限问题吗?
2023-04-20 21:01:48.745 8530-8530/com.example.xxxxx E/SQLiteDatabase: Failed to open database '/data/data/com.example.xxxxx/databases/My.DB'.
android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/data/data/com.example.xxxxx/databases/MY.DB': Directory /data/data/com.example.xxxxx/databases doesn't exist
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:254)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:205)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:505)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:198)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:919)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:899)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:763)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:752)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:383)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:340)