寻找更新的解决方案,运行使用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已停止。
任何人都可以建议一个解决方案,让分享意图与我的应用程序一起工作......或者我忘记了某些事情并做错了什么。
谢谢!
答案 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的插件正常工作。