【问题标题】:Android - create a schema for my app that will open from a webpage linkAndroid - 为我的应用创建一个架构,该架构将从网页链接打开
【发布时间】:2015-06-02 19:46:09
【问题描述】:

我正在尝试创建一个类似于 myapp://somthing/anotherthing 的架构,如果网页或任何其他应用程序链接到该架构将打开我的应用程序。

我已将此添加到我的 AndroidManifest.xml 中以用于我的主要活动:

    <activity
        android:name="com.example.MainActivity"
        android:label="@string/title_activity_main"
        android:configChanges="orientation"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Light.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="myapp" />
        </intent-filter>
    </activity>

但是当我点击链接到 myapp://somthing/anotherthing 的网页中的链接时,它只会给我一个页面未找到类型的错误并且不会打开我的应用程序。

我看到的每一个地方,我都发现我需要在&lt;intent-filter&gt; 中添加&lt;data&gt; 标签。这里缺少什么?

【问题讨论】:

  • 从我在docs 中读到的内容看来,过滤器需要指定路径、类型和方案。其中类型看起来像 MIME 类型。也许尝试添加权限(服务器)或路径前缀?
  • 这可能是重复的,请参阅this question
  • @Diederik 您提供的链接无效。另外,我尝试指定主机 - 它不起作用。
  • @mmark 正如我所提到的,我已经搜索并尝试了各种建议的答案——包括那个“重复”的答案——如果我没有,我不会写我有问题。

标签: android android-intent android-manifest


【解决方案1】:

在其他相关问题中搜索示例我找不到同时使用这两个问题的示例 &lt;action android:name="android.intent.action.MAIN" /&gt;&lt;action android:name="android.intent.action.VIEW" /&gt; (后者似乎对于这种行为是强制性的)。

无论如何,两者都可以使用。这是我的工作示例:

<activity
        android:name="com.example.MainActivity"
        android:label="@string/title_activity_main"
        android:configChanges="orientation"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Light.NoTitleBar" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

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

                <data android:scheme="myapp" />
            </intent-filter>
        </activity>

因此,以下标签似乎可以解决问题:

android:exported="true"
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

这是我在网页上使用的锚点:

<a href="myapp://somthing/anotherthing">Open the app!</a>

更新: 正如 cmets 中提到的 developer82,如果您这样做,应用程序图标将消失,用户将无法打开应用程序。要解决此问题,您需要创建一个新标签,将 &lt;data&gt;defaultbrowsable 类别和 view 操作放在一起。

&lt;activity&gt; 标记应如下所示:

    <activity
            android:name="com.example.MainActivity"
            android:label="@string/title_activity_main"
            android:configChanges="orientation"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Light.NoTitleBar" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <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:scheme="myapp" />
            </intent-filter>
            </activity>

如果有帮助请告诉我!

【讨论】:

  • 这样做的另一个副作用是在主活动中使用 标记会使图标不会出现在抽屉中 - 因此用户实际上无法启动应用程序。我所做的是创建一个虚拟活动,该活动将响应我的架构并从传入该活动的数据中打开我需要的活动。
  • @developer82 是正确的。但是,根据this的回答,可以通过添加一个新的 标签来修复它。您无需使用虚拟活动。我用一个经过测试的例子编辑了我的答案。让我知道是否有帮助
  • 您做了哪些主要更改? category.DEFAULTcategory.BROWSABLE?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多