如何在Android的”打开方式”菜单中列出你的cordova应用并处理Intent事件

Android打开方式

如果我们希望我们的应用程序出现在android的打开方式列表中, 则需要在AndroidManifest.xml文件中允许此意图。

所需的插件

  1. cordova-custom-config:我们需要更改AndroidManifest.xml的默认配置, 但是由于在以后的构建中更改可能会丢失, 因此我们不会手动操作它, 因此我们需要使用一个插件, 该插件在每次构建时都会添加自定义配置具有不同版本的应用程序。
  2. cordova-plugin-intent:当上一个插件的配置准备就绪时, 我们需要在每次调用时操纵文件Intents(当用户从​​另一个应用程序执行Open With并且未初始化我们的应用程序时, 等等)
  3. 耐心点!

在继续之前

我们需要知道我们要做什么以及为什么。

我们需要修改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意向插件的更多信息。

构建你的应用程序, 然后你将看到你的应用程序在”打开方式”菜单上列出, 并且你可以执行一些操作, 例如使用具有给定信息的应用程序打开文件, 祝你玩得开心!

测试
微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?