Есть отличная статья от парней из Firebase, объясняющая , как их SDK овладевает контекстом .
В основном мой контент-провайдер выглядит так:
/**
* This content provider is only responsible to inject the application context into the common module.
*/
class ContextProvider : ContentProvider() {
companion object {
private val TAG = ContextProvider::class.java.simpleName
}
override fun onCreate(): Boolean {
context?.let {
Common.setContext(it)
return true
}
Logger.e(TAG, "Context injection to common failed. Context is null! Check ContextProvider registration in the Manifest!")
return false
}
override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? = null
override fun getType(uri: Uri): String? = null
override fun insert(uri: Uri, values: ContentValues?): Uri? = null
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int = 0
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int = 0
}
И объект Common
, к которому я отношусь как к брату любого класса Application
, выглядит так:
/**
* Partially working like an Application class by holding the appContext which makes it accessible inside this module.
*/
@SuppressLint("StaticFieldLeak")
object Common {
/**
* App appContext
*/
@Volatile
lateinit var appContext: Context
var isStoreVersion: Boolean = false
fun setContext(context: Context) {
appContext = context
}
}
Как вы можете видеть, я также обогатил объект Common
флагом для хранения, если текущая сборка является версией хранилища или нет. Главным образом потому, что BuildConfig модуля приложения также недоступен в модуле или библиотеке.
Не забудьте добавить ContentProvider в AndroidManifest вашей библиотеки в теге <application>
<provider android:name=".util.ContextProvider"
android:authorities="${applicationId}.common.util.contextprovider"
android:exported="false" />