Пример сценарий:
userprofile1:
Пользователь выбирает опцию через радио -группу (например, значение = 3).
Это значение (3) должно быть сохранено в ContentProvider. < /P>
userprofile2: < /strong> < /p>
После перехода на другой профиль приложение должно получить ранее сохраненное значение из ContentProvider.
ожидаемое значение: 3 (то же самое, что и то, что было сохранено в UserProfile1).
Однако проблема, с которой я сталкиваюсь, заключается в том, что значение не устанавливается правильно, даже для userprofile1.
Код: Выделить всё
FATAL EXCEPTION: DefaultDispatcher-worker-3 (Ask Gemini)
Process: com.android.globaldataapp, PID: 6914
java.lang.IllegalArgumentException: Unknown URL content://com.android.globaldataservice.data.provider/globaldataapp
at android.content.ContentResolver.insert(ContentResolver.java:2189)
at android.content.ContentResolver.insert(ContentResolver.java:2155)
at com.android.globaldataservice.data.provider.AppDataProviderWrapper.setValue(AppDataProviderWrapper.kt:23)
at com.android.globaldataservice.data.repository.api.can.ApiRepository.saveData(ApiRepository.kt:691)
at com.android.globaldataservice.data.repository.api.can.ApiRepository$initializeBootUpValues$1.invokeSuspend(ApiRepository.kt:1791)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@2fbca59, Dispatchers.Default]
< /code>
Мой код будет похож на следующее: < /p>
Aappglobaldatacontentprovider.kt
class AppGlobalDataContentProvider : ContentProvider() {
private val sUriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
addURI("com.android.globaldataservice.data.provider", "globaldataapp", 1)
}
companion object {
const val AUTHORITY =
"com.android.globaldataservice.data.provider"
val CONTENT_URI: Uri = Uri.parse("content://$AUTHORITY/globaldataapp")
}
private lateinit var sharedPreferences: SharedPreferences
override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int {
sharedPreferences.edit().remove(KEY_VALUE).apply()
context?.contentResolver?.notifyChange(uri, null)
return 1
}
override fun getType(uri: Uri): String? {
return null
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
when (sUriMatcher.match(uri)) {
1 -> {
val value = values?.getAsString(KEY_VALUE) ?: return null
sharedPreferences.edit().putString(KEY_VALUE, value).apply()
context?.contentResolver?.notifyChange(uri, null)
return uri
}
else -> throw IllegalArgumentException("Unknown URI: $uri")
}
}
override fun onCreate(): Boolean {
val context = context?.createDeviceProtectedStorageContext()
?: throw IllegalStateException("Device-Protected storage context not available")
sharedPreferences = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE)
return true
}
override fun query(
uri: Uri, projection: Array?, selection: String?,
selectionArgs: Array?, sortOrder: String?
): Cursor? {
val value = sharedPreferences.getString(KEY_VALUE, null) ?: return null
val cursor = MatrixCursor(arrayOf(KEY_VALUE))
cursor.addRow(arrayOf(value))
return cursor
}
override fun update(
uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array?
): Int {
val value = values?.getAsString(KEY_VALUE) ?: return 0
sharedPreferences.edit().putString(KEY_VALUE, value).apply()
context?.contentResolver?.notifyChange(uri, null)
return 1
}
< /code>
Aappdataproviderwrapper.kt
@Singleton
class AppDataProviderWrapper @Inject constructor(@ApplicationContext private val context: Context) {
private val mContentUri: Uri = Uri.parse("content://$AUTHORITY/globaldataapp")
fun saveData(data: Int) {
val contentResolver = context.contentResolver
val contentValues = ContentValues().apply {
put(KEY_VALUE, data)
}
contentResolver.insert(mContentUri, contentValues)
}
fun getdata(): Int? {
val sharedPreferences = context.createDeviceProtectedStorageContext()
?.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE)
return sharedPreferences?.getInt(KEY_VALUE, 0)
}
}
< /code>
android manifest.xml
android:name=".data.provider.AppGlobalDataContentProvider"
android:authorities="com.android.globaldataservice.data.provider"
android:enabled="true"
android:exported="false"
android:grantUriPermissions="true"
android:singleUser="true" />
< /code>
apirepository.kt
appDataProviderWrapper.saveData(chargingType)
Подробнее здесь: https://stackoverflow.com/questions/794 ... globaldata
Мобильная версия