Скопируйте файл из res/raw на SD-карту для отправки с помощью Intent.ACTION_SEND

Цель состоит в том, чтобы скопировать файл из необработанной папки моего apk на SD-карту, чтобы затем его можно было передать в выбранное пользователем приложение с помощью Intent.createChooser. Это будет файл example.ogg, который уже находится в папке res/raw.

Я пробовал дюжину или около того вариантов, предоставленных ответами на stackoverflow, но ничего не могу заставить работать...

Это была интересная попытка.

    public void playSound1(View view) {
        exampleSound.start();
        if (cb.isChecked()){



            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("audio/ogg");
            share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///android:asset/example.ogg"));
            startActivity(Intent.createChooser(share, "Share Sound File"));
        }
    }

Если выбрать текстовую опцию в селекторе, это просто скажет мне, что тип файла не поддерживается. Однако, если я выберу Gmail, он откроет приложение Gmail и покажет, что вложенный файл есть, но когда я отправлю файл себе, он выдаст сообщение «невозможно прикрепить файл».

После небольшого исследования кажется, что с леденцом на палочке все изменилось, что усложняет доступ к необработанным файлам. Обходной путь заключается в том, чтобы скопировать файл ресурсов на SD-карту, а затем удалить файл, когда ваше приложение закрыто. Причина удаления файла, когда приложение закрыто, заключается в том, что вам нужно, чтобы файл существовал до тех пор, пока приложение выбора не завершит его передачу.

Вот что у меня есть.

Фрагмент ActivityMain.java

    public void playSound2(View view) throws IOException {
        exampleSound.start();

        InputStream in = getResources().openRawResource(R.raw.example1);
        FileOutputStream out = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
        byte[] buff = new byte[1024];
        int read = 0;

        try {
            while ((read = in.read(buff)) > 0) {
                out.write(buff, 0, read);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            in.close();
            out.close();
        }
    }

Вот AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anjosoft.demo">

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

Я проверил, вставив exampleSound.start(); после каждой строки и воспроизводится до тех пор, пока я не поставлю его после FileOutputStream. Приложение вылетает тогда. Как я могу записать на SD-карту?


person Jeaux    schedule 30.12.2015    source источник
comment
Неясно. Если файл находится в /res/raw, он уже внутри вашего приложения. Это означает, что у пользователей вашего приложения уже есть этот файл - нет необходимости отправлять его самим   -  person Phantômaxx    schedule 30.12.2015
comment
они поделятся этим с кем-то   -  person Jeaux    schedule 30.12.2015


Ответы (1)


Попробуйте добавить разрешение на запись во внешнее хранилище в AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Faraz    schedule 30.12.2015
comment
святая корова, разрешение на ЧТЕНИЕ должно было быть НАПИСАТЬ. Не могу поверить, что я сделал это... - person Jeaux; 30.12.2015