Не срабатывает onReceive в BroadcastReceiver
Для аналитики мне нужно знать что юзер выбрал для того, чтоб поделиться контентом. Для этого я использую Google ShareSheet.
Для того, чтоб можно было из Google ShareSheet получить значение которые выбрал пользователь нужно использовать PendingIntent, вот как это у меня получилось
...
override fun doOpenShareSheet(
activity: AppCompatActivity
) {
var flag: Int = PendingIntent.FLAG_UPDATE_CURRENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
flag = PendingIntent.FLAG_IMMUTABLE
}
val pi: PendingIntent = PendingIntent.getBroadcast(
activity,
0,
Intent(activity, ChooserBroadcastReceiver::class.java),
flag
)
//Implement Google ShareSheet
val share: Intent = Intent.createChooser(
Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, config.url)
//Passing content URI to image to be displayed
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
type = "application/url"
},
config.mediaTitle,
pi.intentSender
)
activity.startActivity(share)
}
...
Теперь для того, чтоб получить значение мне нужно зарегестрировать BroadcastReceiver из кода (в Манефесте не получиться, так как мне нужно передать значение в конструктор ресивера).
Вот, что у меня получилось
...
class ChooserBroadcastReceiver(private val vm: MyViewModel): BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val selectedComponent: String = intent?.extras?.get(Intent.EXTRA_CHOSEN_COMPONENT).toString()
vm.doOnChooserBroadcastReceiver(selectedComponent = selectedComponent)
}
}
....
@AndroidEntryPoint
class MyFragment : Fragment() {
...
override fun onResume() {
super.onResume()
registerBroadcast()
}
private fun registerBroadcast() {
chooserBroadcastReceiver = ChooserBroadcastReceiver(vm = vm)
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_SEND)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requireActivity().registerReceiver(chooserBroadcastReceiver, intentFilter, RECEIVER_EXPORTED)
} else {
requireActivity().registerReceiver(chooserBroadcastReceiver, intentFilter)
}
}
...
но почему то значение я не получаю, то есть я вижу, что ивент происходит и я могу выбрать как поделиться контентом (через Google ShareSheet), но ивент не приходит в onReceive
P.S. Для эксперемента я попробовал убрать из конструктора вью модель и зарегистрировать ресивер через манифест и все заработало. Вот так
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<receiver
android:name=".ui.MyBroadcastReceiver"
android:exported="false">
</receiver>
</application>
</manifest>
Но мне нужно передать параметр в конструктор, поэтому этот способ мне не подходит
Что делаю не так? Почему когда регестрирую через манифест все работает, когда через код - ивент не приходит?