Android - 如何忽略带有查询参数的深层链接

问题描述 投票:0回答:1

我有一个 Android 应用程序,我想支持“https://www.example.com/”深层链接,但我不想支持“https://www.example.com/?section=footer”深层链接。 换句话说:如果安装了我的应用程序的用户单击“https://www.example.com/?section=footer”链接,则应打开设备的浏览器而不是应用程序,但如果他单击“https ://www.example.com/”链接,应用程序应该打开。 这可能吗?

我的 AndroidManifest 文件中有以下内容:

<intent-filter
    android:autoVerify="true"
    tools:targetApi="m">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" />
    <data android:host="www.example.com" />
    <data android:path="/" />
</intent-filter>

我尝试检测应用程序是否使用带有查询参数的链接打开,然后使用相同的链接启动 ACTION_VIEW Intent,以便打开浏览器。

fun handleIntent(intent: Intent) {
    val uri = intent.data ?: return
    if (!uri.getQueryParameter("section").isNullOrBlank()) {
        val openInBrowserIntent = Intent(Intent.ACTION_VIEW, uri)
        openInBrowserIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intent)
    }
}

但这将使应用程序本身再次打开,进入循环状态并且无法解决问题。

android kotlin deep-linking android-deep-link
1个回答
0
投票

您可以从意图中提取URI并检查是否与您想要处理的深度链接模式匹配,然后您可以进行相应的处理。您可以选择通过不处理带有查询参数的深层链接来忽略它们。

public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    handleDeepLink(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    handleDeepLink(intent);
}

private void handleDeepLink(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null && uri.getPath().equals("/?section")) {
        // Handle deep link without query parameters
        // You can ignore deep links with query parameters here
    }
}
}

单击“https://www.example.com/?section=footer”会在设备浏览器而不是应用程序中打开链接

public class BrowserRedirectActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get URL from intent
    Uri uri = getIntent().getData();

    // Open URL in browser
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(browserIntent);

    // Finish activity to prevent it from staying in back stack
    finish();
}
}

完整的 Android 清单 XML

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <!-- Deep Link configuration -->
        <nav-graph android:value="@navigation/nav_graph" />
    </activity>

    <!-- Define deep link handling activity -->
    <activity
        android:name=".DeepLinkActivity"
        android:label="@string/deep_link_activity_title">
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="www.example.com"
                android:scheme="https" />
        </intent-filter>
    </activity>

    <!-- Add a separate intent filter for specific URL to open in browser -->
    <activity
        android:name=".BrowserRedirectActivity"
        android:label="@string/browser_redirect_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="www.example.com"
                android:scheme="https"
                android:path="/"
                android:query="section=footer" />
        </intent-filter>
    </activity>
</application>
© www.soinside.com 2019 - 2024. All rights reserved.