我正在开发一个小型离子应用程序,需要以某种方式处理和显示某些数据。数据最初存储在XLSX格式的文件中,然后文件的扩展名更改为自定义文件,让我们说.myext
(对于那些想知道的人:我这样做所有{我的应用程序不会自动打开{1}}文件,这需要一定的数据结构。
我管理,就像您在a previous post I made about this app中看到的那样,让我的应用能够打开XLSX文件,然后能够打开.xlsx
个文件。但是,我只能通过Android设备上的文件系统资源管理器(在我的文件指令器中)打开它时,自动打开我的应用程序.myext
文件。我希望当用户在他/她的邮件收件箱(无论是专用应用还是浏览器)中收到此类文件时,设备会自动使用我的应用打开.myext
个文件;当我尝试这样做时,我收到一条警告,说我的设备上没有能够打开这些文件的应用程序(无论如何都要下载文件,我仍然可以通过设备文件系统资源管理器打开它)。
我试图在AndroidManifest中更改我的意图声明,暂时没有任何运气(注意.myext
行;我尝试了几种组合,同时使用其中的一个,两个,三个或全部) :
android:scheme
我觉得我错过了一些东西,或者无法通过邮件附件打开自定义文件扩展名。你有任何想法吗?
答案 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):
content://gmail-ls/myemail@gmail.com/messages/520/attachments/0.1/BEST/false
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.这是有效的