Как прочитать медиа файл из raw папки (native)?
Сейчас у меня есть нативная имплементация которая использует JNI. Медиа файлы сейчас (для примера) лежат тут /storage/emulated/0/Android/data/com.my_app.debug/files/Models/my_media_file.mp4 то в дириктории самого приложения. Для того, чтоб начать читать медиа файл мне нужно вызвать JNI метод и передать ему этот путь к файлу. Нативный метод откроет этот файл, вот метод
bool Decoder::InitFromFile(std::string const &filename)
{
m_file.open(filename, std::ios::binary);
if (!m_file.is_open())
{
return false;
}
...
}
Так все работает, но сейчас мне нужно прочитать файл из raw папки, теперь, чтоб получить путь к файлу я делаю так
fun foo()
{
...
val path = "android.resource://" + activity!!.packageName + "/" + R.raw.my_media_file
val uri = Uri.parse(path)
JNIImplementation.InitFromFile(uri.path)
...
}
Но теперь uri = android.resource://com.my_app.debug/2131492865 и uri.path = /2131492865.
Проблема в том, что если передаю uri.path как путь к файлу в этот метод InitFromFile то я получаю ошибку, так как я не могу открыть файл по такому пути /2131492865
Я так понимаю, что должен быть способ передать AssertManager имя ресурса и открывать файл из raw или assert дириктории (нативно)
Как это сделать?
Или может есть путь, как сделать так, чтоб медиа файл был build-in, но при этом можно было бы получить к нему путь так, чтоб можно было открыть как файл? Я имею ввиду, смотреть на файл не как на ресурс, а как на стандартный файл который можно открыть с помощью моего метода (по его пути)?
Ответы (1 шт):
Точно не скажу как это решается на уровне NDK, но на уровне Java это решается так:
Полученная ссылка Uri разрешается через ContentResolver, типа content.getContentResolver().openInputStream(uri), в итоге вы получаете InputStream, пользуясь которым уже можно прочитать сам контент файла.
Очевидно вам надо такой же фокус проделать и в NDK.