分享内容到PhoneGap应用程序

26
有没有办法注册PhoneGap应用程序,使其出现在应用程序共享菜单中?
3个回答

43

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

要出现在此列表中,必须修改 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的更多信息。

注意:我认为您无法使用PhoneGap Build实现此目标...您只能使用受支持的插件,并且不能太多地更改AndroidManifest.xml文件。您可能需要使用Cordova路线,并在计算机上构建所有内容。


编辑:有一些人询问如何在iOS上执行此操作。这里有两个步骤:

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

@ericpeters0n,你确定插件已经正确安装了吗?我从未在PhoneGap上完成过这里所要求的操作,但是在其他技术中,我知道如果意图过滤器像上面那样作为您的活动的子级编写,那么您的活动将出现在列表中并将接收到该意图。如果您无法通过WebIntent获得它,则意味着WebIntent未正确安装/运行,或者WebIntent不再与最新版本的Android(Kitkat?)一起使用,但我对后者有些怀疑...意图的原则已经有一段时间没有改变了... - Sébastien Nussbaumer
@SébastienNussbaumer - 感谢您的跟进;这是一个清单问题,现在已经解决了。 - ericpeters0n
在新版本(8)之前,iOS的架构不支持这种行为。现在我们只需要等待一个Cordova插件来包装类似的iOS行为。 - ericpeters0n
@ericpeters0n:现在在iOS8上能做到吗?有什么想法吗? - Hitu Bansal
@SébastienNussbaumer:我已经尝试过了,但并没有成功... 我也发布了一个新的问题https://dev59.com/IIvda4cB1Zd3GeqPdsTh - Hitu Bansal
显示剩余2条评论

4

我成功获取了要共享的文件的URL; 通过在deviceready中使用EXTRA_STREAM而不是EXTRA_TEXT,修改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部分时存在一个错误,所以我根据以下方式修改了我的Java文件:

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。


如果您有新的问题,请通过点击提问按钮进行提问。如果有必要,可以包含此问题的链接以提供上下文。 - ryanyuyu
我本以为我已经回答了,但如果我的回答过于混乱而看起来不像是一个答案的话,我很抱歉(尝试简化它,请检查编辑)。 - Moinkhan

1
@ericpeters0n - 当使用iPhone应用程序和共享功能时,这个应用程序列表是从哪里来的?例如,当我在照片库中分享时,列表包括信息、邮件、Twitter、Facebook、Flickr。这些应用程序是如何注册自己出现在这个列表上的?

iOS 8之前的版本必须将此功能硬编码到其中。相比之下,Android应用程序只需注册以接收共享意图,并自动添加到列表中(在我看来是更智能的设计 :-))。 - Eno

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