Отправка базы данных Sqlite в виде вложения электронной почты в Android - PullRequest
3 голосов
/ 24 августа 2011

У меня есть простое приложение, которое я использую для ускорения отправки вложений.

Мне удалось отправить текстовый файл с SD-карты (хотя я не смог заставить его работать с файлом, созданным в личной области приложений с использованием openFileOutput(fileName, 0)), но теперь я хочу отправить базу данных.

Путем отладки я могу убедиться, что база данных существует и в ее единственной таблице есть запись. Мой код для отправки выглядит так:

gmailButton = (Button) findViewById(R.id.button);
gmailButton.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        Intent sendIntent = new Intent(Intent.ACTION_SEND); 
        sendIntent.putExtra(Intent.EXTRA_SUBJECT, "subject line"); 
        sendIntent.putExtra(Intent.EXTRA_TEXT,"Body of email"); 
        Uri uri = Uri.fromFile(getDatabasePath("TEST_DB"));
        //uri = file:///data/data/com.gmailspike/databases/TEST_DB
        sendIntent.putExtra(Intent.EXTRA_STREAM, uri); 
        sendIntent.setType("application/octet-stream");

        startActivity(Intent.createChooser(sendIntent,"Email:"));
    }
})

;

Однако, когда почтовый клиент открывает вложение, имеет размер 0 байт, и если я коснусь, чтобы открыть вложение, клиент скажет, что файл не найден.

Есть идеи? Я не уверен, что тип пантомимы правильный, или даже если это важно!

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Я помню, что у меня тоже была такая проблема, когда я пытался отправить электронное письмо с вложенным изображением, связанное с файлом, хранящимся в папке личных данных приложений.Вложение просто отсутствует.

Использование почтового намерения открывает новое приложение для обработки создания почты.Поэтому вам нужно либо написать контент-провайдер , чтобы разрешить другим приложениям доступ к вашим личным данным.

Или сначала скопировать контент в общедоступную область и добавить оттуда в почтовое сообщение (этоработает только при наличии SD-карты в большинстве телефонов). External Storage.getExternalStorageDirectory () может быть использовано в этом случае.

Надеюсь, это поможет найти решение.

1 голос
/ 24 августа 2011

Что касается типа MIME, он, безусловно, важен, так как приложение должно поддерживать его (явно или через подстановочный знак), чтобы ответить на намерение и быть найденным через createChooser.

Я думаю, что Gmail, например, принимает */* как MIME-тип с ACTION_SEND, но я не знаю о других почтовых клиентах.

Редактировать: А что касается разрешения, взгляните на флаг FLAG_GRANT_READ_URI_PERMISSION из класса Intent: http://developer.android.com/reference/android/content/Intent.html#FLAG_GRANT_READ_URI_PERMISSION

...