【问题标题】:Make mine the Default App to open csv file in Android让我的默认应用程序在 Android 中打开 csv 文件
【发布时间】:2019-02-12 03:51:28
【问题描述】:

我希望我的应用在 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. 如何将文件 url 传递给我的应用程序,以便它知道从哪里访问它?

【问题讨论】:

标签: android file csv types


【解决方案1】:

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

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

  • 使用 mimeType 过滤器代替 pathPattern,pathPattern 很难与各种可能的文件名正确匹配,因为要打开 csv 文件最好使用 mimeType 过滤器“text/csv”应该这样做

  • 将方案更改为“内容”,方案文件在 Android 7 后不起作用

Android 7.0 Behavior Changes

在应用程序之间共享文件 对于面向 Android 7.0 的应用,Android 框架强制执行 StrictMode API 策略,该策略禁止在应用外部公开 file:// URI。如果包含文件 URI 的意图离开您的应用程序,则应用程序将失败并出现 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>

【讨论】:

  • 这成功了!非常感谢。如果可以的话,一个后续问题:如何获取打开的文件的 Uri,以便我的应用可以访问它?
【解决方案2】:

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

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

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

Uri uri= getIntent().getData();

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

BufferedReader br = new BufferedReader(new 
InputStreamReader(getContentResolver().openInputStream(uri), "UTF-8"));

然后使用BufferedReader 读取每一行:

String strLine = br.readLine();

希望这对其他人有所帮助!

【讨论】:

    【解决方案3】:

    这段代码对我有用:

            !-- 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多