我正在开发一个小型的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 .这有效