【问题标题】:Android - How to open email attachment with Titanium 2.1.3?Android - 如何使用 Titanium 2.1.3 打开电子邮件附件?
【发布时间】:2013-07-01 20:54:24
【问题描述】:

我正在开发 Titanium SDK 2.1.3 并针对 Android 进行部署,我按照 this article 将我的应用程序包含在可以打开 mime 类型(如 application/*、image/* 和 audio/*)的应用程序列表中。它使我的 Android 清单看起来像这样:

<?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);
});

当我尝试检索意图的数据时,结果为 null。当我显示 Intent 对象时,我得到以下信息:

{"flags":0,"type":null,"data":null,"action":null}

为什么我没有收到有关 Intent 的任何数据?我是不是做错了什么?

编辑

我注意到,当我从可以打开特定文件的应用程序列表中打开我的应用程序时,我的应用程序会像以前关闭过一样启动(即使它以前已打开过)。在我的 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。如何从附件地址获取文件?

【问题讨论】:

    标签: android filesystems titanium-mobile intentfilter appcelerator-mobile


    【解决方案1】:

    终于找到解决这个问题的方法了。内容返回一个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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多