Android ndk 设置提取器数据源时出错,使用音频文件位于媒体存储中的AMediaExtractor时出现错误-10002
我正在尝试从MediaStore获取一个音频文件,从中提取音频数据,解码并在Android 10上播放 在我的Android ndk 设置提取器数据源时出错,使用音频文件位于媒体存储中的AMediaExtractor时出现错误-10002,android-ndk,android-permissions,mediastore,android-10.0,mediaextractor,Android Ndk,Android Permissions,Mediastore,Android 10.0,Mediaextractor,我正在尝试从MediaStore获取一个音频文件,从中提取音频数据,解码并在Android 10上播放 在我的MediaExtractor实例上调用setDataSource时,我遇到以下错误: Error setting extractor data source, err -10002 复制: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
MediaExtractor
实例上调用setDataSource
时,我遇到以下错误:
Error setting extractor data source, err -10002
复制:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val path = getSong().get(0).path
stringToJNI("file://"+ path)
val URI = Uri.parse(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.toString() + "/" + getSong().get(0).id)
stringToJNI(URI!!.toString())
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
external fun stringToJNI(URI: String)
companion object {
// Used to load the 'native-lib' library on application startup.
init {
System.loadLibrary("native-lib")
}
}
fun getSong() : MutableList<Songs> {
val SONGS_PROJECTION = arrayOf(
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA
)
val cursor = contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
SONGS_PROJECTION,
null,
null,
MediaStore.Audio.Media._ID +
" ASC LIMIT 100"
)
val items: MutableList<Songs> = mutableListOf()
cursor?.let {
if (cursor.count > 0) {
cursor.moveToFirst()
while (!cursor.isAfterLast) {
val s0 = cursor.getString(cursor.getColumnIndex(SONGS_PROJECTION[0]))
val s1 = cursor.getString(cursor.getColumnIndex(SONGS_PROJECTION[1]))
val s2 = cursor.getString(cursor.getColumnIndex(SONGS_PROJECTION[2]))
items.add(Songs(s0, s1, s2))
cursor.moveToNext()
}
}
cursor.close()
}
return items
}
}
从日志:
2019-11-20 01:09:03.519 8270-8270/com.example.mediastoretonativeaudio E/NdkMediaExtractor: can't create http service
2019-11-20 01:09:03.519 8270-8270/com.example.mediastoretonativeaudio E/MediaStoreToNativeAudio: AMediaExtractor_setDataSource called with: [file:///storage/emulated/0/Music/Thank you for the drum machine/01 - Everything Moves.mp3]
2019-11-20 01:09:03.519 8270-8270/com.example.mediastoretonativeaudio E/MediaStoreToNativeAudio: Error setting extractor data source, err -10002
2019-11-20 01:09:03.543 8270-8270/com.example.mediastoretonativeaudio E/NdkMediaExtractor: can't create http service
2019-11-20 01:09:03.543 8270-8270/com.example.mediastoretonativeaudio E/MediaStoreToNativeAudio: AMediaExtractor_setDataSource called with: [content://media/external/audio/media/472]
2019-11-20 01:09:03.543 8270-8270/com.example.mediastoretonativeaudio E/MediaStoreToNativeAudio: Error setting extractor data source, err -10002
我的舱单:
安装应用程序后,我还通过设置授予权限
编辑:
带有测试代码的公共存储库:
相同的行为结果使用:
android:requestLegacyExternalStorage="true"
在我看来,这似乎是安卓10上的一个bug。android:requestLegacyExternalStorage=“true”似乎并没有改变这种情况。您可能需要请求清单,并在运行时请求相同的权限。必须在连接到Java的线程上调用AMediaExtractor_setDataSource函数。正确地完成所有这些将允许您在其他版本的Android上工作,但不能在Android 10上工作。我已经在Android Bug Tracker上报告了这个问题:根据google的回答,似乎所有使用本机库的应用程序都会受到影响,它们需要通过路径访问文件,并且它们知道这个问题 在我的案例中,一个解决方法是使用AMediaExtractor_setDataSourceFd,通过contentResolver及其方法openFileDescriptor在Java级别获取文件描述符
android:requestLegacyExternalStorage="true"