0

我想通过使用网络视图选择它来在单独的服务中播放来自 youtube 视频的音频,但是当我单击播放时它会跳到 setOnCompletionListener 部分

我已经尝试将数据源设置为 Uri 而不是 Url 文件路径,但它仍然不起作用

在服务中播放音乐的类

package com.example.music_player;

import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import static android.content.Intent.getIntent;
import static java.lang.String.valueOf;

public class MusicPlayer extends Service {

    MediaPlayer mediaPlayer;

    int i=0;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mediaPlayer=new MediaPlayer();

    }

    int length = 0;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        int k=Integer.parseInt(intent.getStringExtra("position"));
        final ArrayList<String> songs = intent.getStringArrayListExtra("songs");
        String url;
//k's from -1 to 3 are for other settings to play songs from internal storage (skipping songs, pausing audio, etc)
        if (k==1) {}

        if (k==-1) {}

        if (k==0) {}

        if (k==2) {}


        if (k==3) {}

        if (k==4) {

            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            url=intent.getStringExtra("url");
            try {
                mediaPlayer.setDataSource(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
            Toast.makeText(getApplicationContext(),url,Toast.LENGTH_SHORT).show();
        }

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                i++;
                String test="test";
                Toast.makeText(getApplicationContext(),test,Toast.LENGTH_SHORT).show();

                if (i==songs.size()) {

                    i=0;

                }

                mediaPlayer.stop();
                mediaPlayer.reset();
                try {
                    mediaPlayer.setDataSource(songs.get(i));
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    mediaPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.start();

            }
        });
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        mediaPlayer.release();
        super.onDestroy();
    }
}

按下按钮时显示 Web 视图并获取视频 URL 的类

package com.example.music_player;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

import java.util.ArrayList;

public class Youtube_Source extends AppCompatActivity {

    WebView youtube;
    Button play;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_youtube__source);
        youtube=findViewById(R.id.youtube);
        youtube.loadUrl("https://www.youtube.com");
        youtube.setWebViewClient(new WebViewClient());

        WebSettings settings=youtube.getSettings();
        settings.setJavaScriptEnabled(true);

        Intent intent=getIntent();
//getting the list of songs from the internal memory from MainActivity
        final ArrayList <String> songs=intent.getStringArrayListExtra("songs");

        //Toast.makeText(this,String.valueOf(songs.size()),Toast.LENGTH_SHORT).show();

        play=findViewById(R.id.button7);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent i=new Intent(Youtube_Source.this,MusicPlayer.class);
                i.putExtra("url",youtube.getUrl());
                i.putExtra("position",String.valueOf(4));
                i.putStringArrayListExtra("songs",songs);
                String url=youtube.getUrl();
                //Toast.makeText(Youtube_Source.this,url,Toast.LENGTH_SHORT).show();
                startService(i);

            }
        });

    }

    @Override
    public void onBackPressed() {
        if (youtube.canGoBack()) {

            youtube.goBack();

        }

        else {

            super.onBackPressed();

        }
    }

}

4

2 回答 2

0

您可以使用 Youtube Player Android SDK ( https://developers.google.com/youtube/android/player/ )。那会更容易。

在您的布局 xml 中,添加以下内容:

<com.google.android.youtube.player.YouTubePlayerView
    android:id="@+id/player"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

在你的主要活动中,

public class SampleActivty extends YouTubeBaseActivity {

进行初始化OnCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_quick_play);

  YouTubePlayerView youTubePlayerView = 
            (YouTubePlayerView) findViewById(R.id.player);

  youTubePlayerView.initialize("YOUR API KEY",
    new YouTubePlayer.OnInitializedListener() {
      @Override
      public void onInitializationSuccess(YouTubePlayer.Provider provider,
        YouTubePlayer youTubePlayer, boolean b) {
          youTubePlayer.loadVideo("5xVh-7ywKpE");

          // If you wish to only load the video but not play, use `cueVideo()` instead of using `loadVideo()`.
          //youTubePlayer.cueVideo("5xVh-7ywKpE");
      }
      @Override
      public void onInitializationFailure(YouTubePlayer.Provider provider,
        YouTubeInitializationResult youTubeInitializationResult) {}
      });
}
于 2019-05-03T20:27:43.980 回答
0

好的,所以我设法解决了由于将数据源设置为错误的 url 地址而引起的问题。

于 2019-05-05T13:52:17.277 回答