如何在没有接收方Intent的组件类的情况下处理createChooser的IntentSender

时间:2019-01-16 19:14:22

标签: android android-intent android-broadcast android-broadcastreceiver android-intent-chooser

当用户选择要共享图像的应用程序时,我正在尝试处理IntentSender中的Intent.createChooser()。我在这里找到的大多数示例(在下面发布)都需要使用BroadcastReceiver as follows

Intent receiver = new Intent(context, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
String type = "image/*";
Intent share = new Intent(Intent.ACTION_SEND);
share.setType(type);
share.putExtra(Intent.EXTRA_STREAM, awesome_photo_uri);
startActivity(Intent.createChooser(share, "some_title", pendingIntent.getIntentSender()));

此解决方案的我的问题位于以下行:

Intent receiver = new Intent(context, MyReceiver.class);

这些示例中使用的Intent constructor要求我创建一个静态MyReceiver类,因此我有一个要传递给构造函数的第二个参数的类。但是,这会引起问题,因为我希望BroadcastReceiver的{​​{1}}在片段中进行填充。因此,我更愿意创建一个{{1} }动态显示在我的片段中。

无济于事,我尝试了以下解决方法:

onReceive内部:

BroadcastReceiver

MyFragment.kt内部:

private val receiver: BroadcastReceiver = getBroadcastReceiver()
private val intentFilter = IntentFilter("com.my.app.CHOOSER_ACTION")

override fun onResume() {
    requireContext().registerReceiver(receiver, intentFilter)
    super.onResume()
}

override fun onPause() {
    requireContext().unregisterReceiver(receiver)
    super.onPause()
}

private fun shareImage(imageFile: File) {
    Intent().apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK
        action = Intent.ACTION_SEND
        type = "image/*"
        putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(
            requireContext(),
            "${myPackageName}.fileprovider",
            imageFile
        ))

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            val receiver = Intent("com.my.app.CHOOSER_ACTION")
            val pendingIntent = PendingIntent.getBroadcast(requireContext(), 0, receiver, PendingIntent.FLAG_CANCEL_CURRENT)
            startActivity(Intent.createChooser(this, "Share image using", pendingIntent.intentSender))
        } else {
            startActivity(Intent.createChooser(this, "Share image using"))
        }
    }
}

private fun getBroadcastReceiver() : BroadcastReceiver {
    return object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            intent?.extras?.keySet()?.forEach {
                Log.v("MyTest", "$it: ${intent.extras?.get(it)}")
            }
            doSomethingInMyFragment()
        }
    }
}

不幸的是,用户按下选项后,动态AndroidManifest.xml的{​​{1}}函数就永远不会被调用。一些问题:

  1. 为什么这不起作用?我想念什么?我是否以某种方式错误地设置了<activity android:name="MyActivityThatHasMyFragment" /> <intent-filter> <action android:name="com.my.app.CHOOSER_ACTION" /> </intent-filter> </activity> BroadcastReceiver
  2. 是否甚至可以使用动态onReceive()处理Intent的{​​{1}}?如果没有,如何创建一个静态IntentFilter来触发BroadcastReceiver中发生的事情?

资源:

0 个答案:

没有答案