Ionic App - 从邮件附件打开自定义类型的文件

时间:2015-11-30 13:04:40

标签: android-intent ionic email-attachments

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

我管理,就像您在a previous post I made about this app中看到的那样,让我的应用能够打开XLSX文件,然后能够打开.xlsx个文件。但是,我只能通过Android设备上的文件系统资源管理器(在我的文件指令器中)打开它时,自动打开我的应用程序.myext文件。我希望当用户在他/她的邮件收件箱(无论是专用应用还是浏览器)中收到此类文件时,设备会自动使用我的应用打开.myext个文件;当我尝试这样做时,我收到一条警告,说我的设备上没有能够打开这些文件的应用程序(无论如何都要下载文件,我仍然可以通过设备文件系统资源管理器打开它)。

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

android:scheme

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

2 个答案:

答案 0 :(得分:1)

在用户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>

当我添加android平台的支持时,第一个意图是Ionic框架创建的默认意图。第二个意图是从邮件附件下载的文件。第三个也是最后一个意图过滤器是通过用户的Android设备上的文件浏览器打开的文件。

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

  • 案例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 (请参阅有关主题的my previous post了解如何将文件提供给您的应用):

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
}

我希望将来可以帮助其他人。

答案 1 :(得分:1)

 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.这是有效的