Anrdoid Media Player не может воспроизвести аудиофайл по пути - PullRequest
0 голосов
/ 11 февраля 2020

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

//This testing code works
mediaPlayer = MediaPlayer.create(this, R.raw.sample_audio1)
mediaPlayer.start()
//setDataSource does not work for me
mediaPlayer.setDataSource(this, Uri.parse("/storage/emulated/0/Music/thomasF1.mp3"))
mediaPlayer.prepare()
mediaPlayer.start()
//This does not work for me as well
mediaPlayer = MediaPlayer.create(this, Uri.parse("/storage/emulated/0/Music/thomasF1.mp3")
mediaPlayer.start()
//manifest xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mediaplayer">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
//in the MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
        Log.i("mpdebug", "onCreate")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        list = getAudioDirectories()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), requestCode)
        } else {
            Log.i("mpdebug", list.toString())
            Log.i("mpdebug", "permission granted")
            initListeners()
        }
    }
private fun initListeners() {

        // Start the media player
        playBtn.setOnClickListener {
            if (pause) {
                mediaPlayer.seekTo(mediaPlayer.currentPosition)
                mediaPlayer.start()
                pause = false
                Toast.makeText(this, "media playing", Toast.LENGTH_SHORT).show()
            } else {

                val path =
                    Environment.getExternalStorageDirectory().absolutePath + "/Music/thomasF1.mp3"
                    Log.i("mpdebug path", path)
                try {
                    mediaPlayer = MediaPlayer.create(applicationContext, Uri.parse(path))
//                        mediaPlayer = MediaPlayer.create(applicationContext, R.raw.sample_audio1)//                   
                    mediaPlayer.start()
                } catch (e: Exception) {
                    Log.i("mpdebug", e.toString())
                }
Toast.makeText(this, "media playing", Toast.LENGTH_SHORT).show()
   }
...
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

определяйте разрешение в файле манифеста, проверяйте и запрашивайте разрешение перед воспроизведением мультимедиа, не запрещайте разрешение внешнего хранилища, поскольку мы воспроизводим мультимедиа из внутреннего хранилища и анализируем в URI.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
musicUrl = "yourURL";
try {
   mPlayer.setDataSource(getContext(), Uri.parse(musicUrl));
   mPlayer.prepareAsync();
} catch (IOException e) {
   e.printStackTrace();
}
0 голосов
/ 11 февраля 2020

проверьте первое время выполнения разрешения, а также файл манифеста и попробуйте этот способ

String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Music/thomasF1.mp3";
        MediaPlayer mp = MediaPlayer.create(getApplicationContext(),Uri.parse(path));
        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {

                mp.start();
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...