安卓:分享CSV文件

5

我的应用程序可以生成CSV文件并想要分享。我正在使用MIME类型text/comma_separated_values/csv,但是当我发送Intent时,选择器没有显示出来,我猜测我的设备不知道如何处理该文件。我应该使用哪种类型呢?

这是我的代码:

    Uri csv = lh.createDailyCSV();

    if(csv == null){
         Toast.makeText(this, getString(R.string.error_creating_csv), Toast.LENGTH_LONG).show();
    }
    else{
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
        sharingIntent.setType("text/comma_separated_values/csv");
        sharingIntent.setData(csv); 
        startActivity(Intent.createChooser(sharingIntent, getResources().getText(R.string.send_to)));
    }   

我在清单文件中声明:

    <intent-filter>
        <action android:name="android.intent.action.SEND" />

        <category android:name="android.intent.category.DEFAULT" />

        <data android:mimeType="text/comma_separated_values/csv" />
    </intent-filter>

我遇到了异常

03-12 12:19:23.430: E/ActivityThread(24011): Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver com.android.internal.app.ResolverActivity$1@412fc920 that was originally registered here. Are you missing a call to unregisterReceiver()?

我看到这个异常在选择器中没有或仅有一个选项时会出现。

[编辑]

我改变了将数据附加到意图的方式。不再使用sharingIntent.setData(csv),而是使用:

sharingIntent.putExtra(Intent.EXTRA_STREAM, csv);

现在选择器可以正常工作,但是如果我尝试通过电子邮件发送文件,会出现错误:文件无法显示。[/编辑]

“异常”并不是一个异常(至少在您的应用程序中不是),也与您遇到的问题无关。 - class stacker
在您进行编辑后,请澄清您是想通过电子邮件发送文件还是与其他应用程序共享,其中可能包括电子邮件应用程序。 - class stacker
3个回答

13

正确的MIME类型应该是text/csv。如果不起作用,可以使用text/plain,这样用户就可以从很多应用程序中选择,包括Evernote等。

更新 更新后,似乎您不想将文件与其他任意应用程序共享,而只是通过电子邮件发送?请澄清。


@ClassStacker:你提出的建议都对我不起作用。尝试过 text/plaintext/csv,但是只有 */* 可以正常工作... - Luis A. Florit
8
@ClassStacker:实际上对我有用的是 text/comma-separated-values - Luis A. Florit
1
@ClassStacker:实际上,这是操作系统本身的问题。长格式是我从 getmimefromextension() 方法中获取的。我的应用程序只通过其清单声明一个带有长格式的 intent-filter 来打开 csv 文件。短格式会失败。 - Luis A. Florit
@LuisA.Florit 你尝试过哪些Android操作系统版本? - class stacker
1
@ClassStacker JB 4.1.2。顺便说一句,以防万一,我现在添加了text/csvtext/comma-separated-values。谁知道呢... - Luis A. Florit
显示剩余2条评论

2
在我的情况下,以下方法适用于Goo:
intent.setType("text/*");

在许多情况下,使用text/*并不理想。我猜你的测试系统上没有安装太多应用程序。否则,你会注意到处理这个(实际上他们并没有)的应用程序选择变得有点冗长了。 - class stacker

0
<intent-filter>
    <action android:name="android.intent.action.SEND"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="image/*"/>
    <data android:mimeType="text/*"/>
</intent-filter>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接