【问题标题】:Share something to a phonegap app将某些内容分享到 phonegap 应用程序
【发布时间】:2013-05-30 06:45:50
【问题描述】:

有没有办法注册一个phonegap应用程序以显示在要共享的应用程序菜单中?

【问题讨论】:

    标签: cordova phonegap-plugins phonegap-build


    【解决方案1】:

    要出现在此列表中,您必须修改 AndroidManifest.xml 文件并在您的活动下添加以下行:

    <intent-filter> 
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    

    这将使您的应用出现在列表中。现在我想你可能还想知道如何在你的代码中处理这个问题。当另一个应用程序要与您共享一些文本时,它将使用 Android“Intent”启动您的应用程序。为了能够使用 Intents,您需要一个 PhoneGap 插件。我认为 WebIntent 可能适合你。这将是代码:

    // deviceready is PhoneGap's init event
    document.addEventListener('deviceready', function () {
      window.plugins.webintent.getExtra(WebIntent.EXTRA\_TEXT, function (url) {
        // url is the value of EXTRA_TEXT 
      }, function() {
        // There was no extra supplied.
      });
    });
    

    更多关于 WebIntent 的信息:http://smus.com/android-phonegap-plugins/

    注意:我认为您无法使用 PhoneGap Build 来执行此操作……您只能使用受支持的插件,并且不能对 AndroidManifest.xml 文件进行太多更改。您可能不得不走 Cordova 路线并在您的机器上构建所有内容。


    编辑:有几个人问如何在 iOS 上做到这一点。有两个步骤可以做到这一点:

    1. 通过在 info.plist 中添加相关信息,将您的应用与正确的文件类型关联相关联。这个 SO 答案解释了如何做到这一点:How do I associate file types with an iPhone application?。这将使您的应用出现在列表中,但您的应用还不会收到数据。
    2. 您的应用程序现在将使用新参数启动。您现在必须能够读取这些参数。检查这个问题/答案,它确实做到了:How to pass arguments to app built on Phonegap

    【讨论】:

    • 看来这个答案是从旧的 webIntent 插件网站复制的......还有更多吗?我没有在 deviceready 或 resume 上通过 WebIntent 接收 EXTRA_TEXT 或 URI。
    • @ericpeters0n 你确定插件安装正确吗?我从来没有用 PhoneGap 做过这里要求的事情,但是用其他技术,并且确定如果意图过滤器作为您的活动的子项如上所述编写,那么您的活动将出现在列表中并接收意图。如果您没有使用 WebIntent 获得它,则意味着 WebIntent 没有正确安装/运行,或者 WebIntent 不再适用于最新版本的 Android(Kitkat ?),但我对后者有一些疑问......原理意图已经有一段时间没有改变了......
    • 这将如何在 iPhone 上运行?上面的示例仅适用于 Android,我很想知道如何在 iPhone 上类似地注册一个应用程序以通过该应用程序共享。
    • @SébastienNussbaumer - 感谢您的跟进;这是一个明显的问题,因为它解决了。
    • @MariusGeorge - 在新版本 (8) 之前,iOS 的架构不支持这种行为。现在我们只是在等待一个 Cordova 插件来包装类似的 iOS 行为。
    【解决方案2】:

    我设法获取了要共享的文件的 URL;通过在 deviceready 中使用 EXTRA_TEXT 的 EXTRA_STREAM 插入,修改 Webintent.java,并在 AndroidMenifest.xml 中添加一个意图过滤器。

    这是我的主要活动的样子:

        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter android:label="@string/app_name">
                <data android:mimeType="*/*" />
                <action android:name="android.intent.action.SEND" />                
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    

    我发现插件有一个EXTRA_STREAM部分的错误,所以我根据这个修改了我的javafile:

    https://github.com/Initsogar/cordova-webintent/issues/23

    同样在我的 js 文件中,我必须像这样调用函数:(使用 EXTRA_STREAM 而不是 EXTRA_TEXT )

        window.plugins.webintent.getExtra(window.plugins.webintent.EXTRA_STREAM, function (url) {
            // url is the value of EXTRA_STREAM 
            alert(url);
          }, function() {
            // There was no extra supplied.
            alert("no url");
          });
    

    我得到了文件的 URI。

    【讨论】:

    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。
    • 我以为我输入并回答了......虽然我很抱歉,如果它看起来像一个答案太混乱(试图简单化它检查编辑)
    【解决方案3】:

    @ericpeters0n - 当使用 iPhone 应用程序和共享时,这个应用程序列表从何而来?例如,当我在照片库中并分享时,列表包括消息、邮件、Twitter、Facebook、Flickr。这些应用程序是如何注册自己以显示在此列表中的?

    【讨论】:

    • iOS 8 之前的版本必须将此功能硬连线到其中。相比之下,Android 应用程序只需注册即可接收共享意图并自动添加到列表中(恕我直言,设计更智能:-)
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多