通过其他应用程序

时间:2015-09-30 00:50:46

标签: android cordova ionic-framework ionic

寻找更新的解决方案,运行使用Cordova 5.x的最新离子1.1.0版本。试图能够浏览Chrome中的网站,并使用网络意图将该网址发送到我的离子Android应用程序。我的应用程序编译并运行,但是当我尝试使用Chrome(或任何其他应用程序)的共享功能并选择我要分享的应用程序时,我的应用程序崩溃了。

我首先尝试使用插件:

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

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

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

在我的app.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"/>

在AndroidManifest.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并单击共享按钮,然后选择我的应用程序时,应用程序关闭以下安卓消息:

  

不幸的是,MyAppName已停止。

任何人都可以建议一个解决方案,让分享意图与我的应用程序一起工作......或者我忘记了某些事情并做错了什么。

谢谢!

3 个答案:

答案 0 :(得分:5)

这个问题有点老了。但我有一个或多或少类似的挑战。我没有使用WebIntent插件,因此我开发了自己的插件来处理Android上的Intents。

您可以查看: https://github.com/napolitano/cordova-plugin-intent

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

一些背景知识:

要允许第三方应用向您的应用发送内容,您必须在AndroidManifest.xml中为MainActivity添加intent-filter。

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

虽然你可以手动执行此操作,但这有一些缺点 - 所以你可能想要一个钩子或类似的东西。如果您前往上面的存储库,您将找到并为此做出示例。

除了intent-filter之外,您目前还需要一个插件,允许您a)访问cordova意图(在应用程序启动时访问已发送内容非常重要)并在{{{{如果在应用程序运行时发送了内容,则会触发事件。

这是我的插件所做的事情。它使您可以访问cordova intent并允许您处理onNewIntent事件。

示例:

onNewIntent

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

示例:

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

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

虽然此示例实际显示了JSON,但您将收到一个即用型对象。

请注意,我目前仅根据自己的需要开发插件。但它也可能对你有用。目前README中没有添加任何角度示例,但我认为这不应该是一个大问题。

答案 1 :(得分:4)

发现问题是由于我如何设置AndroidManifest.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>

答案 2 :(得分:2)

我想添加到@ axel-napolitano的答案中,以明确指出应在Ionic 3应用程序中的何处添加代码。免责声明:我几乎无法编写Ionic应用程序的代码。

在撰写本文时,我当前正在使用Ionic 3.9。经过大量的试验和错误并在SO上拼凑了答案,我才能够正常工作(即与Ionic应用共享另一个应用。)

这时,您应该已经为Android编译了您的应用程序,并将您的Android手机连接到了计算机上,以便该应用程序可以在其上运行。查找有关如何在物理Android设备上运行离子应用程序的文档。

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

您还应该将<intent-filter>添加到AndroidManifest.xml中。

将代码放在/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's)-我无法使用-感谢Napolitano的插件。 Source

我最终使用相同的方法使darryncambell的插件正常工作。