【问题标题】:FileProvider in Android 4.1/4.3/4.4 Email App fails with column '_data' does not existAndroid 4.1/4.3/4.4 电子邮件应用程序中的 FileProvider 失败,列“_data”不存在
【发布时间】:2016-04-08 08:26:22
【问题描述】:

我有一个FileProvider,用于将 SD 卡上的文件附加到电子邮件中。

这适用于任何使用Intent 的应用中的LollipopMarshmallow

但是,在Android 4.3 中,当使用Email 应用程序时,附件会在撰写时出现在电子邮件中,但在发送时,在收件人端,附件不存在。它适用于所有其他经过测试的应用程序(Gmail、Evernote、Drive)。

我不会在发送电子邮件之前删除文件。

这是我的代码。

final Intent fileShareIntent = new Intent(android.content.Intent.ACTION_SEND);
fileShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, emailSubject);
fileShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, emailText);
Uri fileUri = STFileProvider.getContentUriForProvidedFile(this,file);
fileShareIntent.putExtra(Intent.EXTRA_STREAM,fileUri);
fileShareIntent.setType(mimeType);
fileShareIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{prefs.getString("default_email_preference", "")});
startActivity(Intent.createChooser(fileShareIntent,getString(R.string.share_with)));

编辑我发现了一个异常的堆栈跟踪,它符合@CommonsWare 的建议

01-04 17:39:00.430 6828-6828/? W/System.err: java.lang.IllegalArgumentException: column '_data' does not exist
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose.getFilePath(MessageCompose.java:21476)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose.getFilePathOfAttachment(MessageCompose.java:17710)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose.addAttachment(MessageCompose.java:19140)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose.access$11000(MessageCompose.java:362)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose$LoadAttachmentsTaskFromIntent.onProgressUpdate(MessageCompose.java:15277)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.email.activity.MessageCompose$LoadAttachmentsTaskFromIntent.onProgressUpdate(MessageCompose.java:15101)
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:647)
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.os.Looper.loop(Looper.java:176)
01-04 17:39:00.430 6828-6828/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5419)
01-04 17:39:00.430 6828-6828/? W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
01-04 17:39:00.430 6828-6828/? W/System.err:     at java.lang.reflect.Method.invoke(Method.java:525)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
01-04 17:39:00.430 6828-6828/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
01-04 17:39:00.430 6828-6828/? W/System.err:     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你可以试试this fix。我在my CWAC-Provider library 中有该解决方案的打包版本。
  • 我不认为这是同一个问题。它根本没有崩溃,只是发送时附件没有保持连接状态。
  • 我没有使用过电子邮件应用程序。如果它在其 UI 中显示一些只能从实际流中获取的细节,那么你是对的,这不是问题。 OTOH,如果您在 UI 中看到的唯一内容是可以在不实际使用 Uri 内容的情况下确定的内容,那么它们可能只是捕获了与 DATA 相关的实现损坏的异常。由于您已经有一个自定义 FileProvider 子类,添加我的 LegacyCompatCursorWrapper 应该只需要大约 6 行左右(依赖 + query()),所以它可能值得一试。
  • 目前我没有对 CRUD 操作做任何事情。事实上,在学习完教程之后,他们所做的只是抛出新的 RuntimeExceptions。我不确定如何将LegacyCompatCursorWrapper 与我的FileProvider 子类一起使用,因为我没有Cursor 开头
  • @CommonsWare 请参阅堆栈跟踪更新的原始问题

标签: android android-intent


【解决方案1】:

我知道,可能为时已晚,但我偶然发现了完全相同的问题,我花了一段时间才发现我的错误:

我的错是,当我的应用从电子邮件应用返回时,我删除了我喜欢发送的原始文件。(我试图清理临时文件)

不幸的是,电子邮件应用程序不会立即发送邮件,也不会复制附件。因此,在发送邮件之前删除文件时(就像我一样)附件丢失了。

这种行为与大多数其他应用程序(包括 Gmail 应用程序)不同,它们会在返回我的应用程序之前处理文件。

【讨论】:

    【解决方案2】:

    这是关于数据库 sqlite 的。

    有两种可能性

    1. 您更改了数据库或表中的某些内容。

    1. 您的访问字段可能不正确或代码中不存在。

    解决方案:

    1. 卸载应用并使用 db 中的新更改再次测试。

    2. 更正你的数据库代码。

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2017-12-25
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多