当前位置: 首页 > 知识库问答 >
问题:

从另一个应用程序通过webintents发送url到ionic android应用程序

桂浩言
2023-03-14

寻找更新的解决方案,运行最新的离子1.1.0版本,使用科尔多瓦5. x。尝试能够在chrome中浏览一个网站,并使用网络意图将该网址发送到我的ionicAndroid应用程序。我的应用程序编译和运行,但是当我试图使用共享功能从chrome(或任何其他应用程序),并选择我的应用程序共享,我的应用程序崩溃。

我第一次尝试使用插件:

离子插件添加https://github.com/Initsogar/cordova-webintent

然后删除插件,我还尝试了一个最近更新的叉子:

离子插件添加https://github.com/fluentstream/cordova-webintent

在我的应用程序中。js文件我输入了以下代码:

.run(function($ionicPlatform, $rootScope, $ionicHistory, $state) { 
  $ionicPlatform.ready(function() {
    window.plugins.webintent.getExtra(window.plugins.webintent.EXTRA_TEXT,
    function(url) {
      incomingURL = url;
      //alert(incomingURL);
      console.log(incomingURL);
    }, function() {
      incomingURL = false;
      //alert("no url");
      console.log("no url");
    });
  });
})

我也尝试过:

.run(function($ionicPlatform, $rootScope, $ionicHistory, $state) { 
  $ionicPlatform.ready(function() {
    window.plugins.webintent.getUri(function(url) {
      if(url !== "") {
          alert(url);//url is the url the intent was launched with
      }
    }); 
  });
})

在文件中config.xml我会写:

<plugin name="WebIntent" value="com.borismus.webintent.WebIntent"/>

在Androidanifest.xml我会手动输入:

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

应用程序正在运行,但当我转到chrome并单击“共享”按钮,然后选择“我的应用程序”时,应用程序将关闭,并显示以下android消息:

不幸的是,MyAppName已经停止。

有人能提出一个解决方案,让共享意图与我的应用程序一起工作吗...或者我忘记了什么,做错了什么。

非常感谢。

共有3个答案

谢高峯
2023-03-14

我想添加到@axel napolitano的答案中,明确说明在Ionic 3应用程序中应该在哪里添加代码。免责声明:我几乎无法编写Ionic应用程序。

在撰写本文时,我目前正在使用Ionic 3.9。经过多次尝试和错误,并将答案拼凑在一起,我能够让它工作(也就是说,让我的Ionic应用共享另一个应用)

此时,你应该已经为Android编译了应用程序,并将Android手机连接到电脑上,以便应用程序在其上运行。查找有关如何在物理Android设备上运行ionic应用程序的文档。

下面是命令:ionic cordova run android-l-c

您还应该添加

将代码放入/pages/home/home。ts-确保您的构造器已注入“平台”。

export class HomePage {

  constructor(private platform:Platform){
     ...
   }
...
}

创建此方法(在home.ts中)以接收应用程序未处于加载状态时的意图:

ionViewDidLoad(){
  this.platform.ready().then(() => {

    (<any>window).plugins.intent.getCordovaIntent(
      function (Intent) {
        //you should filter on the intents you actually want to receive based on Intent.action
        console.log('intent received on app launch' + JSON.stringify(Intent));
    },
    function () {
        console.log('Error getting cordova intent');
    }
    );
  });
}

若要接收应用已加载时的意图:

ionViewDidEnter() {
    this.platform.ready().then(() => {
      (<any>window).plugins.intent.setNewIntentHandler(
        function (Intent) {
            console.log('new intent' + JSON.stringify(Intent) );
        }
    );

    });
  }

有趣的事实:“官方”网络意图插件(darryncambell的)——我无法使用——归功于纳波利塔诺的插件。来源

我最终用同样的方法让darryncambell的插件工作。

阎安邦
2023-03-14

发现问题是由于我如何设置我的Androidanifest.xml文件。

我使用了一个额外的活动标签,而我本应该在1活动中包含意图。

例如,我有:

<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>
</activity>
<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

当我应该拥有的时候:

<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>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
     </intent-filter>
</activity>
宫瀚
2023-03-14

这个问题有点陈旧了。但我也有过类似的挑战。我没有运气与WebIntent插件,因此我开发了自己的插件处理Android上的Intents。

你可以检查这个:https://github.com/napolitano/cordova-plugin-intent

虽然我还在为自己的项目开发这个插件,但它几乎是可用的,而且文档应该足够好,足以让我入门。

一些背景:

要允许第三方应用向你的应用发送内容,你必须在AndroidManifest中向你的MainActivity添加一个意图过滤器。xml。

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.catehtml" target="_blank">gory.DEFAULT" />
    <data android:mimeType="*/*" />
</intent-filter>

虽然你可以手动操作,但这也有一些缺点——所以你可能想要一个钩子或类似的东西。如果你去上面的存储库,你会发现并举例说明这一点。

除了intent filter之外,您目前还需要一个插件,该插件允许您a)访问cordova intent(这对于在应用程序启动时访问发送的内容很重要),并在触发了onNewIntent事件时接收通知,如果在应用程序运行时发送内容,就会发生这种情况。

我的插件就是这么做的。它允许您访问cordova intent,并允许您处理onNewIntent事件。

例如:

window.plugins.intent.getCordovaIntent(function (Intent) {
    console.log(Intent);
}, function () {
    console.log('Error');
});

window.plugins.intent.setNewIntentHandler(function (Intent) {
    console.log(Intent);
});

成功后,您将收到一个有限意图对象。这可以由你的应用程序处理。

例子:

{
    "action": "android.intent.action.SEND_MULTIPLE",
    "clipItems": [
        {
            "uri": "file:///storage/emulated/0/Download/example-document.pdf"
        },
        {
            "uri": "file:///storage/emulated/0/Download/example-archive.zip"
        }
    ],
    "flags": 390070273,
    "type": "*/*",
    "component": "ComponentInfo{com.example.droid/com.example.droid.MainActivity}",
    "extras": "Bundle[mParcelledData.dataSize=596]"
}

虽然这个例子实际上显示了JSON,但您将收到一个随时可用的对象。

请注意,我目前开发这个插件只是为了满足自己的需要。然而,它可能也适用于你。目前,自述文件中没有添加任何角度的示例,但我认为这应该不是一个大问题。

 类似资料:
  • 我正在开发两个应用程序。让第一个应用程序是APP1,第二个应用程序为APP2。现在在APP1中,我不提供任何用户权限,如INTERNET权限,但它将发送任何http url,如http://www.google.com我的第二个APP2将包含INTERNET等用户权限。Http请求将从APP1发送到APP2,APP2将响应该请求,然后将结果发送回APP1。最后APP1包含一个Web视图以显示结果。

  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 我正在构建一个spring boot rest API,其中。我想通过HTTP将文件从一个spring rest API应用程序发送到另一个rest API应用程序,并获得文件是否成功发送的响应。 关于上述场景的更多解释 我有2个spring rest API。一个在本地机器上的端口4000上运行,另一个在5000上运行。我想通过post请求将一个文件从4000端口rest API发送到5000端

  • 我想从我的应用程序在不同的社交应用程序中共享音频文件。我正在使用以下代码来共享音频。它适用于Whatsapp,但不适用于共享。共享应用程序打开但无法检索文件并显示“不支持发送此类内容”。该文件为“mp3”格式。我可以使用android通用共享选项从文件管理器共享文件,然后选择共享。

  • 我在google play商店里有两个应用程序。有可能在第一个描述中创建一个从一个到另一个的http链接吗?

  • Google在这里有一个很好的页面展示了如何这样做:https://developer.android.com/distribute/tools/promote/linking.html 基本上,使用这段代码,它将打开Play Store到新apps页面: 我错过了什么?我肯定它非常简单,也许我需要进口的东西。 解决方案:导入Uri类是一个问题。我仍然不确定新的热键是什么来导入它。Apple-Sh