Android - Как получить Uri из необработанного файла?
Я пытаюсь получить Uri
из необработанного файла, который я включил в проект в raw
папка. Но я получаю FileNotFoundException
, не важно что.
Файл является .wav
файл, также попробовал это с .mp4
Также не работает. Воспроизведение обоих файлов с MediaPlayer
Работает.
Uri
возвращает: mark.dijkema.android.eindopdracht/2130968576
Мой код:
package mark.dijkema.android.eindopdracht;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.net.Uri;
import android.os.Bundle;
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PlayWaveFile();
}
private void PlayWaveFile()
{
// define the buffer size for audio track
int minBufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
int bufferSize = 512;
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
Uri url = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.usa_for_africa_we_are_the_world);
File file = new File(url.toString());
int count = 0;
byte[] data = new byte[bufferSize];
try {
FileInputStream fileInputStream = new FileInputStream(file);
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
audioTrack.play();
while((count = dataInputStream.read(data, 0, bufferSize)) > -1)
{
audioTrack.write(data, 0, count);
}
audioTrack.stop();
audioTrack.release();
dataInputStream.close();
fileInputStream.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Ошибка:
java.io.FileNotFoundException: /mark.dijkema.android.eindopdracht/2130968576: open failed: ENOENT (No such file or directory)
5 ответов
Попробуйте этот подход, используйте getResources().openRawResource(ResourceID)
как ваш inputStream. Где-то вдоль этого:
//FileInputStream fileInputStream = new FileInputStream(file);
InputStream inputStream = getResources().openRawResource(R.raw.usa_for_africa_we_are_the_world);
DataInputStream dataInputStream = new DataInputStream(inputStream);
audioTrack.play();
getResources().openRawResource(ResourceID)
возвращает InputStream
РЕДАКТИРОВАТЬ: удалить этот код, если вы используете вышеупомянутый подход
Uri url = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.usa_for_africa_we_are_the_world);
File file = new File(url.toString());
Надеюсь это поможет. Удачи! ^^
Попробуй это:
uri = Uri.parse(
ContentResolver.SCHEME_ANDROID_RESOURCE
+ File.pathSeparator + File.separator + File.separator
+ context.getPackageName()
+ File.separator
+ R.raw.myrawname
);
Не допускайте жесткого кодирования в коде! Использовать это:
val uri = Uri.Builder()
.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(packageName)
.appendPath("${R.raw.your_music_file_or_whatever}")
.build()
Вот несколько методов, которые могут кому-то помочь:
public Uri getRawUri(String filename) {
return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/raw/" + filename);
}
public Uri getDrawableUri(String filename) {
return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/drawable/" + filename);
}
public Uri getMipmapUri(String filename) {
return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/mipmap/" + filename);
}
Просто вызовите метод так:
Uri rawUri = getRawUri("myFile.filetype");
Вы можете открыть свой InputStream для необработанного ресурса следующим образом:
InputStream rawInputStream = getResources().openRawResource(R.raw.usa_for_africa_we_are_the_world)
DataInputStream dataInputStream = new DataInputStream(rawInputStream);