我正在开发Titanium SDK 2.1.3并为Android部署,我跟着this article将我的应用程序包含在可以打开mime类型的应用程序列表中,例如application / *,image / *和audio / *。它使我的Android Manifest看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nenvo.com.desktop" android:versionCode="1"
android:versionName="1">
<uses-sdk android:minSdkVersion="8" />
<!-- TI_MANIFEST -->
<application android:icon="@drawable/appicon"
android:label="Desktop Lite" android:name="DesktopLiteApplication"
android:debuggable="false">
<!-- TI_APPLICATION -->
<activity android:name=".DesktopLiteActivity"
android:label="Desktop Lite" android:theme="@style/Theme.Titanium"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data android:scheme="content" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- open any mime type file -->
<data android:mimeType="application/*" />
<data android:mimeType="audio/*" />
<data android:mimeType="image/*" />
<data android:mimeType="text/*" />
<data android:mimeType="video/*" />
</intent-filter>
</activity>
<activity android:name="org.appcelerator.titanium.TiActivity"
android:configChanges="keyboardHidden|orientation" />
<activity android:name="org.appcelerator.titanium.TiTranslucentActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent" />
<activity android:name="org.appcelerator.titanium.TiModalActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent" />
<activity android:name="ti.modules.titanium.ui.TiTabActivity"
android:configChanges="keyboardHidden|orientation" />
<activity android:name="ti.modules.titanium.ui.android.TiPreferencesActivity" />
<service android:name="org.appcelerator.titanium.analytics.TiAnalyticsService"
android:exported="false" />
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</manifest>
现在我的应用程序在尝试打开电子邮件附件时启动,问题是我不知道如何检索我正在尝试打开的文件,我在启动时尝试以下操作并恢复事件我的Android应用程序:
activity.addEventListener('start', function() {
Ti.API.log('*** Start Event Called ***');
var args = activity.getIntent().getData(); // this is null
functions.handleFunction(args);
});
activity.addEventListener('resume', function() {
Ti.API.log('*** Resume Event Called ***');
var args = activity.getIntent().getData(); //this is also null
functions.handleFunction(args);
});
当我尝试检索intent的数据时,结果是null。当我显示Intent对象时,我得到以下内容:
{"flags":0,"type":null,"data":null,"action":null}
为什么我没有收到有关意图的任何数据?我做错了吗?
修改
我注意到当我从可以打开特定文件的应用列表中打开我的应用时,我的应用就会像之前关闭一样开始(即使之前已经打开过)。我试着在我的app.js文件加载期间获取Intent,令我惊讶的是我获得了intent的数据,其中包括:
content://com.android.email.attachmentprovider/1/2/RAW
我如何打开它?如何从该地址检索文件,以便将其保存到我的应用程序目录中?
编辑2
我试图从这个地址获取文件:
var tmpFile = Ti.Filesystem.getFile(String(currentActivity.getIntent().getData()));
但我得到的是一个看起来像这样的File对象:
{
"writable": false,
"symbolicLink": false,
"parent": null,
"readonly": true,
"nativePath": "content://com.android.email.attachmentprovider/1/2/RAW",
"executable": false,
"name": "api-eventos.txt",
"directoryListing": null,
"hidden": false,
"size": 0
}
它确实显示了原始文件的名称,但是大小为0并且似乎它不包含原始文件的任何信息,我试图读取它并因此得到null。如何从附件地址获取文件?
答案 0 :(得分:2)
终于找到了解决这个问题的方法。内容返回一个URI,我可以使用它来获取文件,但我无法读取它,但我可以将其复制到另一个文件中。然后可以像任何其他File对象一样读取和使用新文件。这是我的代码:
var currentActivity = Ti.Android.currentActivity;
var passedData = currentActivity.getIntent().getData();
if(passedData !== null)
{
var tmpFile = Ti.Filesystem.getFile(String(passedData));
var fileData = Ti.Filesystem.getFile(Ti.Filesystem.getTempDirectory() + tmpFile.name);
tmpFile.copy(fileData.nativePath); //the copy can be handled like any other normal file
Ti.App.Properties.setString('passedData', JSON.stringify(fileData)); // in my case I place it in a Ti.App.Property for later use
}
我希望这能帮助其他人处于同样的境地。这适用于2.1.3和3.0。