Совместное использование файла с Android Intent: расширение файла удалено - PullRequest
0 голосов
/ 24 апреля 2019

Я использую следующий код для обмена аудиофайлами с Android Studio 3.3.2 и Java. Файл извлекается из папки / raw /.

public void funktionTeilen(String file) {
    Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/raw/" + file);
    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("audio/mpeg3");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(share, "Audio teilen"));
}

В принципе, общий доступ работает нормально, но файл отправляется без расширения, что, конечно, делает его недоступным для чтения большинством приложений. Если я добавлю расширение файла вручную (например, после загрузки его из почтового клиента), MP3 будет работать нормально.

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

Итак, как я могу поделиться файлом с сохранением расширения файла? Спасибо за вашу помощь!

Обновление № 1

public void funktionTeilen(String Datei) {


    try {
        File tmpFile = new File(this.getCacheDir() + "/tmpfile.mp3");
        InputStream in = getResources().openRawResource(R.raw.meise1);
        FileOutputStream out = new FileOutputStream(tmpFile, true);
        byte[] buff = new byte[1024];
        int read = 0;

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

        // Uri uri = FileProvider.getUriForFile(this, this.getPackageName(), tmpFile);
        Uri uri = Uri.fromFile(tmpFile);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("audio/*");
        share.putExtra(Intent.EXTRA_STREAM, uri);
        startActivity(Intent.createChooser(share, "Audio teilen"));

    } catch (Exception e) {
        Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    }

}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Я разработал решение!

MainActivity.java

public void funktionTeilen(String Datei) {

    try {
        File tmpFile = new File(this.getCacheDir() + "/tmpfile.mp3");
        InputStream in = getResources().openRawResource(R.raw.meise1);
        FileOutputStream out = new FileOutputStream(tmpFile, false);
        byte[] buff = new byte[1024];
        int read = 0;

        try {
            while ((read = in.read(buff)) > 0) {
                out.write(buff, 0, read);
            }
        } finally {
            in.close();
            out.close();
            /* if (tmpFile.exists()) {
                Toast.makeText(MainActivity.this, tmpFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
            } */
        }

        Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, tmpFile.getAbsoluteFile());
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("audio/mpeg3");
        share.putExtra(Intent.EXTRA_STREAM, uri);
        startActivity(Intent.createChooser(share, "Audio teilen"));

    } catch (Exception e) {
        Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    }

}

AndroidManifest.xml

<application>
        <provider
        android:name="android.support.v4.content.FileProvider"
        android:grantUriPermissions="true"
        android:exported="false"
        android:authorities="${applicationId}">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths"/>

    </provider>

</application>

file_provider_paths.xml

<paths>
    <cache-path name="cache" path="/" />
    <files-path name="files" path="/" />
</paths>
0 голосов
/ 24 апреля 2019

Я использую следующий код для обмена аудиофайлами с Android Studio 3.3.2 и Java

Вы делитесь ресурсом. Это файл на вашей машине для разработки. Это не файл на устройстве.

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

В Android у ресурсов нет расширений файлов, когда мы работаем с ними с помощью Android SDK.

Итак, как я могу поделиться файлом с сохранением расширения файла?

Если вы поделитесь фактическим файлом , используя FileProvider, у него будет расширение файла. Итак, скопируйте байты, соответствующие вашему ресурсу, в файл (например, в getCacheDir()), затем установите FileProvider и используйте FileProvider.getUriForFile(), чтобы получить Uri для использования с EXTRA_STREAM.

...