Member 13593129 Ответов: 0

Как играть в yt_video, нажав на listview?


Hi, I know I post similar question already, but I decided to go with simpler version of playing videos.I have most of the code, but the crucial thing is missing.The thing that I want to accomplish is to play video by clicking on the listview items.I'll explain what kind of app I am making. It's about Metallica band, and I have Fragment that shows Albums, and when you click on of the albums, it opens a new Activity with Tracks inside of said activity.And when you click on of the songs, I want to open yt_video of that song. That's it.My main problem is yt_Activity, cause in TracksActivity I know I have to use Intent.Almost forgot, all my data is stored on Firebase, so in Tracks there is id, title and url of every song in particular.I would be grateful to anyone who could tell me how to solve my problem.

public class YT_activity extends YouTubeFailureRecoveryActivity {

    @BindView(R.id.youtube_view) YouTubePlayerView youtube_view;
    @BindView(R.id.lvTracks) ListView lvTracks;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_yt);
        ButterKnife.bind(this);

        youtube_view.initialize(Youtube_key.getAPI_KEY(),this);
    }

    @Override
    protected YouTubePlayer.Provider getYouTubePlayerProvider() {
        return (YouTubePlayerView) findViewById(R.id.youtube_view);
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {

        if (!wasRestored){

        }

    }
}

public abstract class YouTubeFailureRecoveryActivity extends YouTubeBaseActivity
implements YouTubePlayer.OnInitializedListener{


    private static final int RECOVERY_DIALOG_REQUEST = 1;

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider,
                                        YouTubeInitializationResult errorReason) {
        if (errorReason.isUserRecoverableError()) {
            errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
        } else {
            String errorMessage = String.format(getString(R.string.error_player), errorReason.toString());
            Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == RECOVERY_DIALOG_REQUEST) {
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(Youtube_key.getAPI_KEY(), this);
        }
    }

    protected abstract YouTubePlayer.Provider getYouTubePlayerProvider();


}


Это часть кода из TracksActivity:

private List<Track> mapTracks(HashMap<String, HashMap> m) {
        List<Track> r = new ArrayList<>();
        Set<String> keys = m.keySet();
        for (String key : keys) {
            HashMap<String, Object> album = m.get(key);
            String id = (String) album.get("id");
            String title = (String) album.get("title");
            final String url = (String) album.get("url");
            Track t = new Track(id, title, url);
            r.add(t);

            lvTracks.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                   Intent intent = new Intent(getApplicationContext(),YT_activity.class);
                    intent.putExtra("position", position);
                    intent.putExtra("url",url);
                    startActivity(intent);



                }
            });


        }
            return r;

        }

    }


Что я уже пробовал:

Меня пробовали находить решение с помощью Google.

David Crow

Каков URL-адрес видео, которое вы хотите воспроизвести?

Member 13593129

Все мои URL-адреса находятся на Firebase в пределах треков(дочерних).Как вы можете видеть в методе выше lvTracks.setOnItemClickListener.

David Crow

Не где, а что. Как выглядит сам URL-адрес (например, https://www.youtube.com/watch?v=6H02UCzHf-U)?

На вашем устройстве установлено приложение YouTube?

Member 13593129

Выглядит это примерно так: https://www.youtube.com/watch?v=VuDaPSdHQ5o"..
Да, у меня есть приложение Youtube на моем устройстве.

David Crow

Так почему же вы не можете сделать (что-то вроде) этого:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:VuDaPSdHQ5o"));    

context.startActivity(intent);    

Member 13593129

Я сделал это так: lvTracks.setOnItemClickListener(новый AdapterView.OnItemClickListener() {
@Ручная коррекция
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Intent appIntent = новое намерение(намерение.ACTION_VIEW, URI-кода.синтаксический анализ("ВНД.ютуб:" + URL-адрес));
Intent webIntent = новое намерение(Intent.ACTION_VIEW, URI-кода.разобрать("http://www.youtube.com/watch?v=" + адрес));
// Intent intent = Intent.createChooser(appIntent, "открыть с помощью");
Intent i = новое намерение(getApplicationContext(), YT_activity.class);
startActivity(i);
пробовать {
context.startActivity(appIntent);
} catch (ActivityNotFoundException ex) {
context.startActivity(webIntent);
}

Но я не знаю, как туда попасть YT_Activity.class-да. И я хочу, чтобы, когда пользователь нажимает на какой-то трек, он открывал видео этого трека, а не открывал только одно видео при каждом щелчке по другому треку.

David Crow

Если только я чего-то не упустил, я не вижу необходимости в вашей помощи. YT_Activity класс. Все, что вам нужно сделать, это поместить предыдущие две строки кода в onItemClick() метод.

Как только вы увидите, что он работает (я только что попробовал его, и он работает нормально), вы можете извлечь фактический URL-адрес из ListView's адаптер, так что правильный трек играет.

Member 13593129

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

David Crow

-...Мне нужен урок ИТ."

С какой целью? Потому что так сказал профессор, или потому что это действительно обеспечивает потребность в проблеме, которую вы пытаетесь решить?

Поскольку приложение YouTube "выставляет" намерение для воспроизведения видео (см. мои предыдущие примеры), я не вижу необходимости в дополнительных слоях между этим намерением и вашим кодом, который выбирает URL-адрес.

После краткого взгляда на YouTubeBaseActivity, из которого вы выводите класс, это выглядит так, как будто вы хотите включить класс. YouTubePlayerView вид пользовательского интерфейса вашего приложения. Это сильно отличается от простой передачи URL-адреса в приложение YouTube. Это правильная оценка?

Что касается звонков getIntent() изнутри YT_Activity- а вы пробовали это в прошлом? onCreate() метод:

Bundle b = getIntent().getExtras();
if (b != null)
{
    String sPosition = b.getString("position");
    String sURL = b.getString("url");
}

Member 13593129

Я решаю свою проблему. Спасибо за помощь.

0 Ответов