如果我们希望我们的应用程序出现在android的打开方式列表中, 则需要在AndroidManifest.xml文件中允许此意图。
所需的插件
- cordova-custom-config:我们需要更改AndroidManifest.xml的默认配置, 但是由于在以后的构建中更改可能会丢失, 因此我们不会手动操作它, 因此我们需要使用一个插件, 该插件在每次构建时都会添加自定义配置具有不同版本的应用程序。
- cordova-plugin-intent:当上一个插件的配置准备就绪时, 我们需要在每次调用时操纵文件Intents(当用户从另一个应用程序执行Open With并且未初始化我们的应用程序时, 等等)
- 耐心点!
在继续之前
我们需要知道我们要做什么以及为什么。
我们需要修改intent-filter并添加以下权限(此显式示例将使我们的应用程序可以打开所有类型的文件, 在此处阅读有关android mimetypes的更多信息以按所需的扩展名进行过滤)
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.txt" />
</intent-filter>
现在的问题是, 我们不能简单地将先前的代码块添加到config.xml中, 因为它无法被识别, 这就是cordova-custom-config可以帮助我们从config.xml直接修改AndroidManifest.xml的地方。
最后, 我们将使用cordova-plugin-intent从javascript处理应用程序的intent事件。
在你的应用程序中启用Intent的使用
Intent是一个消息传递对象, 可用于从另一个应用程序组件请求操作。下载所需的cordova插件:
# Install custom configuration
$ cordova plugin add cordova-custom-config
# Then install the intent handler
$ cordova plugin add https://github.com/napolitano/cordova-plugin-intent
然后, 你需要允许对项目使用自定义配置, 将xmlns:android =” http://schemas.android.com/apk/res/android”属性添加到config.xml文件中的小部件节点, 小部件应如下所示:
<?xml version='1.0' encoding='utf-8'?>
<!-- Note the xmlns:android="blabla" as property of the widget node -->
<widget id="com.ourcodeworld.ourcodeeditorfree" version="1.3.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- We will make some changes in this node later -->
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
</widget>
现在, 修改config.xml文件, 并使用config块添加intent-filter(custom-config插件会将config-block的内容直接添加到AndroidManifest.xml文件中, 而无需删除任何现有节点):
注意:你需要在AndroidManifest.xml文件中创建一个额外的intent-filter节点, 如果将这些属性添加到现有的intent-filter中, 则你的应用程序将进行编译, 但以后将看不到启动该应用程序的图标。
<!-- Locate the android platform -->
<platform name="android">
<!--
Add a new intent-filter node to the app activity :
-->
<config-file target="AndroidManifest.xml" parent="./application/activity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.txt" />
</intent-filter>
</config-file>
</platform>
如果你决定立即构建你的应用, 则AndroidManifest.xml现在应在intent-filter节点内包括属性:
而且, 如果你使用(任何应用程序)触发打开操作且mimeType是正确的, 则你的应用程序应立即出现在该列表中, 但是我们仍然需要操纵如何使用Javascript处理打开的文件。
处理意图
这就是cordova-plugin-intent对我们有帮助的时候。我们需要对接收到的文件(文件信息)做一些事情, 我们将使用以下代码(在onDeviceReady事件之后)对其进行处理:
document.addEventListener('deviceready', function(){
var HandleIntent = function (Intent) {
console.log(intent);
// With intent you'll do almost everything
if(Intent.hasOwnProperty('data')){
// Do something with the File
}else{
// this will happen in getCordovaIntent when the app starts and there's no
// active intent
console.log("The app was opened manually and there's not file to open");
}
};
// Handle the intent when the app is open
// If the app is running in the background, this function
// will handle the opened file
window.plugins.intent.setNewIntentHandler(HandleIntent);
// Handle the intent when the app is not open
// This will be executed only when the app starts or wasn't active
// in the background
window.plugins.intent.getCordovaIntent(HandleIntent, function () {
alert("Error: Cannot handle open with file intent");
});
}, false);
一个意图对象, 看起来像:
{
"action": "android.intent.action.SEND_MULTIPLE", "clipItems": [
{
"uri": "file:///storage/emulated/0/Download/example-document.pdf", "type": "application/pdf", "extension": "pdf"
}, {
"uri": "file:///storage/emulated/0/Download/example-archive.zip", "type": "application/zip", "extension": "zip"
}
{
"uri": "content://media/external/images/media/29", "type": "image/jpeg", "extension": "jpeg"
}
], "flags": 390070273, "type": "*/*", "component": "ComponentInfo{com.example.droid/com.example.droid.MainActivity}", "extras": "Bundle[mParcelledData.dataSize=596]"
}
在此处阅读有关cordova意向插件的更多信息。
构建你的应用程序, 然后你将看到你的应用程序在”打开方式”菜单上列出, 并且你可以执行一些操作, 例如使用具有给定信息的应用程序打开文件, 祝你玩得开心!