6

我有一个使用专门创建的二进制 (.gcsb) 文件类型的应用程序。这些文件保存在 SD 卡上的一个文件夹中。

目前,它们使用 ES 文件资源管理器或手机制造商的“表现得像 USB 驱动器”传输实用程序来打开和关闭。笨重。我想要的是能够将文件通过电子邮件发送到手机,然后从 gmail 中将文件作为附件打开,这应该会启动应用程序,然后将它们保存到适当的 SD 卡文件夹中。

我发现了一些关于设置意图的东西 - 希望 - 通过单击 gmail 中的“预览”来启动应用程序(特别是在我的 Android 应用程序中打开自定义 Gmail 附件),但我完全不确定如何访问文件数据!我想它必须是 Intent.get...Extra() 函数之一,但是哪个以及如何使用它?

4

2 回答 2

21

了解如何做到这一点。希望这可以帮助其他人。派对我的,部分来自其他职位。它旨在处理 .gcsb 文件附件。

意图过滤器是

<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:mimeType="application/octet-stream" />
</intent-filter>

并且活动 onCreate() / onRestart() 中的代码是

Intent intent = getIntent();
InputStream is = null;
FileOutputStream os = null;
String fullPath = null;

try {
    String action = intent.getAction();
    if (!Intent.ACTION_VIEW.equals(action)) {
        return;
    }

    Uri uri = intent.getData();
    String scheme = uri.getScheme();
    String name = null;

    if (scheme.equals("file")) {
        List<String> pathSegments = uri.getPathSegments();
        if (pathSegments.size() > 0) {
            name = pathSegments.get(pathSegments.size() - 1);
        }
    } else if (scheme.equals("content")) {
        Cursor cursor = getContentResolver().query(uri, new String[] {
            MediaStore.MediaColumns.DISPLAY_NAME
        }, null, null, null);
        cursor.moveToFirst();
        int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
        if (nameIndex >= 0) {
            name = cursor.getString(nameIndex);
        }
    } else {
        return;
    }

    if (name == null) {
        return;
    }

    int n = name.lastIndexOf(".");
    String fileName, fileExt;

    if (n == -1) {
        return;
    } else {
        fileName = name.substring(0, n);
        fileExt = name.substring(n);
        if (!fileExt.equals(".gcsb")) {
            return;
        }
    }

    fullPath = ""/* create full path to where the file is to go, including name/ext */;

    is = getContentResolver().openInputStream(uri);
    os = new FileOutputStream(fullPath);

    byte[] buffer = new byte[4096];
    int count;
    while ((count = is.read(buffer)) > 0) {
        os.write(buffer, 0, count);
    }
    os.close();
    is.close();
} catch (Exception e) {
    if (is != null) {
        try {
            is.close();
        } catch (Exception e1) {
        }
    }
    if (os != null) {
        try {
            os.close();
        } catch (Exception e1) {
        }
    }
    if (fullPath != null) {
        File f = new File(fullPath);
        f.delete();
    }
}

它似乎适用于标准的 Android gmail 和邮件应用程序。根据在 gmail 中是否按下“下载”(方案文件)或“预览”(方案内容),可以通过两种不同的方式获得文件名。

请注意,活动不设置为单实例非常重要。

于 2013-07-07T06:46:39.467 回答
2

nwm01223'的答案是正确的!一个小附录:他的答案只适用于 ACTION_VIEW。如果你添加

Uri uri = null;
if(Intent.ACTION_VIEW.equals(action)){
    uri = intent.getData();
} else if(Intent.ACTION_SEND.equals(action)){
    uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
}

它也适用于 ACTION_SEND

于 2016-10-27T10:47:33.747 回答