离子应用程序 - 从邮件附件中打开自定义类型的文件



我正在开发一个小型的Ionic应用程序,需要以某种方式处理和显示一些数据。数据最初存储在XLSX格式的文件中,然后文件的扩展名更改为自定义扩展名,假设.myext(对于那些想知道的人:我这样做是为了.xlsx所有文件都不会自动打开我的应用程序,这需要一定的数据结构(。

正如您在我之前关于此应用程序的帖子中看到的那样,我设法使我的应用程序能够打开XLSX文件,然后能够打开.myext文件。但是,我只能在通过Android设备上的文件系统资源管理器(在我的情况下为文件指挥官(打开.myext文件时自动打开文件。我希望当用户在其邮件收件箱(无论是专用应用程序还是浏览器(中收到.myext文件时,设备会自动打开带有我的应用程序的文件;当我尝试这样做时,我收到一条警告,说我的设备上没有能够打开此类文件的应用程序(无论如何该文件都会下载,我仍然可以通过设备文件系统资源管理器打开它(。

我试图在 AndroidManifest 中更改我的意图声明,但暂时没有任何运气(请注意android:scheme行;我尝试了几种组合,同时使用一个、两个、三个或全部(:

<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.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="file" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:scheme="content" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*\.myext" />
        <data android:host="*" />
    </intent-filter>
</activity>

我觉得我错过了一些东西,或者无法通过邮件附件打开自定义文件扩展名。你有什么想法吗?

在用户 e666 和他/她的研究的帮助下,我设法修改了我的 Ionic 应用程序的意图声明,现在在我的 AndroidManifest 中如下所示.xml(说我的自定义文件扩展名是".myapp"(:

<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>
        <data android:mimeType="application/vnd.myapp" android:pathPattern=".*\.myapp" android:scheme="content" />
        <data android:mimeType="application/myapp" android:pathPattern=".*\.myapp" android:scheme="content" />
        <data android:mimeType="application/octet-stream" android:pathPattern=".*\.myapp" android:scheme="content" />
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.GET_CONTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    <intent-filter>
        <data android:scheme="file" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*\.myapp" />
        <data android:host="*" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

第一个意图是Ionic框架在添加Android平台支持时创建的默认意图。第二个目的是用于从邮件附件下载的文件。第三个也是最后一个意图过滤器适用于通过用户 android 设备上的文件资源管理器打开的文件。

请注意,当您在应用程序的后端 Ionic Javascript 部分中获取 URI 时,当您尝试通过邮件应用程序或邮件浏览器界面打开.myapp文件时,您将获得一个content:// URI。但是,如果您尝试使用邮件应用程序/浏览器界面直接打开文件(案例 1(,并且如果您下载文件,则尝试通过点击"下载完成"通知(案例 2(打开它,则 content:// URI 的类型不同:

  • 案例 1:你会得到类似 content://gmail-ls/myemail@gmail.com/messages/520/attachments/0.1/BEST/false
  • 案例 2:你会得到类似 content://downloads/all_downloads/283

在第一种情况下,我找不到将此 URI 解析为file:/// URI(我需要打开然后读取文件中的数据(的方法。

在第二种情况下,我安装了cordova-plugin-filepath包(创建window.FilePath对象(,并按如下方式使用它将content URI解析为file URI(请参阅我之前关于该主题的文章,了解如何将文件馈送到您的应用程序(:

window.plugins.webintent.getUri(function (url) { // success getUri
    if(url.startsWith('content://')){
        window.FilePath.resolveNativePath(url, function(res){
            // parse content uri to file uri
            var converted_url = "file://" + res;
            // extract path and filename from parsed uri
            var path = converted_url.slice(0, converted_url.lastIndexOf('/') + 1);
            var filename = converted_url.substring(converted_url.lastIndexOf('/') + 1);
            // read the file
            $cordovaFile.readAsBinaryString(path, filename).then(function (result) { // success readAsBinaryString
                // use the data
            }, function(error){ //failure readAsBinaryString
                // error when trying to open the file
            });
        }, function(error) { // failure resolveNativePath
            // couldn't parse content URI to file URI
        });
    } else {
        // the given URI is not a content URI
    }
}, function(error) { // failure getUri
    // no URI has been given to the app
}

我希望这将在未来对其他人有所帮助。

 window.plugins.webintent.getUri(function(url) {
 if(url.startsWith('content://')) {
window.resolveLocalFileSystemURL(url, success, fail);
function success(fileEntry){
    alert("present");
    fileEntry.file(function(file){
        alert("is")
    var ft=new FileReader();
    ft.onloadend=function(e){
       // Do something
    }
    ft.readAsText(file);
});

}

如果是"ontent://gmail-ls/myemail@gmail.com/messages/520/attachments/0.1/BEST/false"案例 1 .这有效

相关内容

  • 没有找到相关文章

最新更新