Unity安卓端唤起Twitter页面 客户端不存在时跳转浏览器的可靠方案
现有实现的问题
你当前的代码无法检测安卓设备是否安装Twitter客户端,直接调用Application.OpenURL打开网页链接的逻辑受系统跳转策略限制,大概率会直接打开浏览器而不是优先唤起已安装的APP,无法满足你的需求。
更稳定的实现方案
实现逻辑
- 安卓11及以上版本需要先申请应用可见性权限,才能检测第三方APP是否安装
- 先调用安卓原生API检测Twitter客户端是否已安装
- 已安装时通过Twitter的APP专属协议唤起客户端打开对应主页
- 未安装时跳转浏览器打开网页版主页
完整代码实现
using UnityEngine; public class TwitterJump : MonoBehaviour { // 替换为你的Twitter账号名 private const string TWTR_NAME = "你的账号名"; // Twitter安卓端固定包名 private const string TWTR_PACKAGE_NAME = "com.twitter.android"; // Twitter APP唤起协议前缀 private const string TWTR_APP_SCHEME = "twitter://user?screen_name="; // Twitter网页版访问前缀 private const string TWTR_WEB_URL = "https://twitter.com/"; public void OpenTWTR() { #if UNITY_ANDROID && !UNITY_EDITOR if (CheckAppInstalled(TWTR_PACKAGE_NAME)) { // 已安装APP,优先唤起APP打开 Application.OpenURL($"{TWTR_APP_SCHEME}{TWTR_NAME}"); } else { // 未安装,打开网页版 Application.OpenURL($"{TWTR_WEB_URL}{TWTR_NAME}"); } #elif UNITY_EDITOR // 编辑器环境直接打开网页版调试 Application.OpenURL($"{TWTR_WEB_URL}{TWTR_NAME}"); #else // 其他平台默认走网页版逻辑 Application.OpenURL($"{TWTR_WEB_URL}{TWTR_NAME}"); #endif } /// <summary> /// 安卓端检测指定包名的APP是否已安装 /// </summary> private bool CheckAppInstalled(string packageName) { bool isInstalled = false; using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager"); try { packageManager.Call<AndroidJavaObject>("getPackageInfo", packageName, 0); isInstalled = true; } catch (System.Exception) { isInstalled = false; } } return isInstalled; } }
必要配置(安卓11及以上必须配置)
你需要在Unity的安卓自定义Manifest文件的manifest标签下添加应用可见性查询配置,否则包检测逻辑会失效:
<queries> <package android:name="com.twitter.android" /> </queries>
如果你的项目没有自定义AndroidManifest,可以在Unity的Assets/Plugins/Android目录下新建AndroidManifest.xml文件,内容参考如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools"> <queries> <package android:name="com.twitter.android" /> </queries> <application> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

