在短信中点击链接时启动安卓应用程序

19

我不知道有多少人尝试过这个,但我正在尝试构建一个应用程序,需要用户在收到的短信中点击链接,这将启动Android应用程序。 在Android中是否有可能实现这一点? 如果是,我该如何做? 我知道在IOS中可以实现这一点。 任何建议或帮助将不胜感激。 谢谢。

3个回答

13
在你的清单文件(Manifest)中,针对你想要从消息应用程序中点击链接接收数据的 Activity,定义类似于以下方式的内容:
<activity android:name=".SomeActivityName" >

    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="com.your_package.something" />
    </intent-filter>

</activity>

android:scheme=""这里确保了Activity会对带有此内容的任何数据做出响应:

<data android:scheme="com.your_package.something" />

SomeActivityName名称仅用作示例。自然地,您会使用自己的 :-))中,您可以像这样运行检查:

Uri data = getIntent().getData();
String strData = data.toString();
if (strScreenName.equals("com.your_package.something://"))  {
    // THIS IS OPTIONAL IN CASE YOU NEED TO VERIFY. THE ACTUAL USAGE IN MY APP IS BELOW THIS BLOCK
}

我的应用程序的相似用法:

Uri data = getIntent().getData();
strScreenName = data.toString()
        .replaceAll("com.some_thing.profile://", "")
        .replaceAll("@", "");

我在我的应用程序中使用这个来处理点击Twitter@username链接。我需要去掉com.some_thing.profile://@,以获取用户名进行进一步的处理。清单代码与之前完全相同,只是namescheme已更改。


当我收到一条消息时(例如:myapp://get/256298xxxx),它应该在文本中突出显示myapp://get/256298xxxx部分。但是它没有。我该如何解决这个问题?如果myapp://get/256298xxxx部分甚至不能自动突出显示为可点击的链接,那么应用程序将如何启动? - nishantvodoo
@nishan_vodoo:这是因为_myapp://get/256298xxxx_不是一个有效的URL,无法被短信应用程序解析并显示为链接。最好的情况是将数字序列解析为电话号码。您需要在短信中发送一个有效的URL。请参考以下示例:https://dev59.com/AnA75IYBdhLWcg3w0sp9#3865145。 - Siddharth Lele
感谢大家抽出时间回答我的问题。 - nishantvodoo
@Fred:是的。无论连接如何,此函数都可以正常工作。但是,如果打开的Activity需要互联网,则情况就不同了。 - Siddharth Lele
也许正确的应该是 if (strData.equals 而不是 if (strScreenName.equals - user2342558

5

在你的应用程序中添加一个意图过滤器(intent-filter),以便监听符合你所需格式的链接并启动你的应用程序。

然而,这将是一个全局监听器,任何符合该格式的链接即使在短信应用之外也会触发你的应用程序。因此,如果用户在Web浏览器中点击类似的链接,你的应用程序将尝试响应它。

此外,如果除了你的应用程序之外还有另一个应用程序可以处理此链接,Android 将创建一个选择器,允许用户选择他们想要使用的任何应用程序。你无法做任何事情来解决这个问题,除了建议用户将你的应用程序设置为处理此类链接的默认程序。


0
  <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE"
        <data android:scheme="https" android:host="${hostName}" android:pathPattern="/.*" />
  </intent-filter>

之前的答案是可以的,但不要忘记指定模式。

在这里查看更多细节。

还要在Gradle文件中定义您的主机名,例如:

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"subdomain.example.com"]
    }
}

关于manifestPlaceholders的更多信息在这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接