Цель состоит в том, чтобы скопировать файл из необработанной папки моего 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-карту?
/res/raw
, он уже внутри вашего приложения. Это означает, что у пользователей вашего приложения уже есть этот файл - нет необходимости отправлять его самим - person Phantômaxx   schedule 30.12.2015