我有一个 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)
}
}
但这将使应用程序本身再次打开,进入循环状态并且无法解决问题。
您可以从意图中提取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>