使我的默认应用程序在Android中打开csv文件

时间:2017-11-19 01:26:59

标签: android file csv types

我希望我的应用程序在android上打开csv文件。我在AndroidManifest中添加了以下代码,但是当我在我的Android模拟器或手机上安装它并试图从我的存储空间打开.csv文件时没有任何反应。

    <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="file" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.csv" />
            <data android:host="*" />
        </intent-filter>
  1. 我错过了什么阻止我从手机上打开.csv文件?
  2. 如何将文件网址传递给我的应用,以便知道在哪里访问它?

3 个答案:

答案 0 :(得分:1)

我错过了什么阻止我从手机中打开.csv文件?

您的意图过滤器需要进行以下更改

  • 使用mimeType过滤器而不是pathPattern,pathPattern很难用各种可能的文件名来解决,因为要打开csv文件最好使用mimeType过滤器“text / csv”应该做< / p>

  • 将方案更改为“内容”,方案文件在Android 7后无效

  

Android 7.0 Behavior Changes

     

在应用之间共享文件   对于定位到Android 7.0的应用,Android框架会强制执行StrictMode API策略,该策略禁止在应用外部公开file:// URI。如果包含文件URI的intent离开了您的应用程序,则该应用程序将失败,并显示FileUriExposedException异常。

     

要在应用程序之间共享文件,您应该发送content:// URI并授予对URI的临时访问权限。授予此权限的最简单方法是使用FileProvider类。有关权限和共享文件的详细信息,请参阅共享文件。

将您的意图过滤器更改为以下内容,它应该可以正常工作。

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="content" />
            <data android:mimeType="text/csv"/>
            <data android:host="*" />
        </intent-filter>

答案 1 :(得分:0)

感谢您的上述回复。有效!

现在,要从应用程序访问该文件: https://richardleggett.com/blog/2013/01/26/registering_for_file_types_in_android/

简而言之,在主文件的onCreate(Bundle savedInstanceState)方法中使用此:

val listOfProjectMaps = resultList.groupBy(t => (t._1, t._2))
 .map({
  case (k, v) => Map(
    "id" -> k._1,
    "name" -> k._2,
    "projects" ->
      v.groupBy(tv => tv._3.get)
      .map({
        case (k1, v1) =>
          Map(
            "name" -> k1,
            "staffs" ->
              v1.map(v2 => Map(
                "name" -> v2._4,
                "added" -> v2._5.get)))
      }))
})

获得URI后,您可以使用常用代码访问该文件:

Uri uri= getIntent().getData();

然后使用BufferedReader br = new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(uri), "UTF-8")); 读取每一行:

BufferedReader

希望这有助于其他人!

答案 2 :(得分:0)

此代码对我有用:

        !-- default intent filter for launching activity -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <!-- example filter to retrieve or view plain text -->
        <!-- adds a custom title and icon for the share option -->
        <intent-filter
            android:icon="@mipmap/icon3"
            android:label="@string/app_name">

            <data android:mimeType="text/csv" />
            <data android:mimeType="text/comma-separated-values" />

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

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