是否有可能将一个应用作为 Android 分享选项多次列出(YouTube 播放和队列)

Is it possible for one app to be listed multiple times as an Android share option (YouTube play & queue)

我想知道我的 Android 应用是否可以在 YouTube 的“分享”(应用选择器)对话框下显示 2 个不同的 'share' 选项?

我的应用正在接受 Android 获取共享 URL 的意图,但我想在 YouTube 的应用选择器对话框中提供两个共享选项,一个是直接 play URL 和另一个 queue URL (我不想在我的应用程序中显示额外的对话框)。

目前,在应用程序的清单文件中,我指定:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xxx.XX_Remote"
        android:versionCode="202"
        android:versionName="2.0.2"
        android:installLocation="auto">

    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="False" 
        android:restoreAnyVersion="False" 
        android:label="XX Remote" 
        android:debuggable="True" 
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true"
        android:resizeableActivity="false">
        
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="XX Remote"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="XX_Remote" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
            <intent-filter android:label="Play in XX">  
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter> 
            <intent-filter android:label="Queue in X">  
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter> 
        </activity>
        
        <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />

    </application>
</manifest>

然而,第二个(队列)意图根本没有出现。

如果它确实出现了,我不确定如何通过代码读取意图标签以便区分这两个意图。

一个 <activity> 标签不能同时匹配多个 intent 过滤器。

为此,您可以在您的清单中使用 <activity-alias>,它将 activity 作为单独的实体呈现:

<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
          android:label="XX Remote"
          android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
          android:launchMode="singleTask">
    <!-- Tell NativeActivity the name of our .so -->
    <meta-data android:name="android.app.lib_name"
          android:value="XX_Remote" />
    <intent-filter>  
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- use only one intent filter for SEND action in activity tag-->
    <intent-filter android:label="Play in XX">  
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter> 
</activity>
<!-- note that we will use android:name for resolving if this alias was used to start activity -->
<activity-alias
        android:targetActivity=".com.embarcadero.firemonkey.FMXNativeActivity"
        android:name=".com.embarcadero.firemonkey.FMXNativeActivity.Queue">
    <!-- Put second SEND action inside activity-alias tag -->
    <intent-filter android:label="Queue in X">
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity-alias>

然后在您的 activity 中,您可以通过检查 intents 组件来确定它是否是通过别名启动的:

// inside onCreate and/or onNewIntent (after resolving that intent action is SEND):

if (intent.component.className.endsWith(".Queue"){
    // putting data in the queue...
} else {
    // playing requested data...
}