FileProvider в Android 4.1/4.3/4.4 Приложение электронной почты не работает с столбцом "_data" не существует
У меня есть FileProvider
, который я использую при прикреплении файлов на SD-карте к сообщениям электронной почты.
Это работает в Lollipop
и Marshmallow
в любом приложении, используя Intent
.
Однако в 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)));
EDIT Я нашел трассировку стека исключений, которая встроена в предложение @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)
Ответы
Ответ 1
Я знаю, это может быть поздно, но я наткнулся на ту же проблему, и мне потребовалось некоторое время, чтобы найти мою ошибку:
Моя ошибка заключалась в том, что я удаляю исходный файл, который мне нравится отправлять, когда мое приложение вернулось из почтового приложения. (я пытался очистить временные файлы)
К сожалению, приложение электронной почты не отправляет почту сразу и не делает копию вложения. Поэтому, когда файл будет удален до отправки почты (как и я), вложение потерялось.
Это поведение отличается от большинства других приложений (включая gmail-app), которые заботятся о файле, прежде чем возвращаться к моему приложению.
Ответ 2
Речь идет о базе данных sqlite.
есть 2 возможности
- Вы изменили что-то в базе данных или таблице.
или
- Ваше поле доступа, которое может быть неправильным или отсутствовать в коде.
Решение: