Member 13593129 Ответов: 0

Как открыть yt video, нажав на listview?


Я создаю приложение и застрял на части youtube.Мне нужно решение о том, как открыть видео на youtube, нажав на элемент listview.Я использую фрагменты и уже получил данные из Firebase.Эти данные представляют собой альбомы и треки указанных альбомов.Когда вы нажимаете на любой альбом, он открывает новое действие с треками.Теперь я хочу, чтобы, когда пользователь нажимает на любой из треков, открывалось видео этого трека. Мне нужен самый простой код, ничего слишком сложного.Я отправлю свой код.Я надеюсь, что вы, ребята и девочки, сможете мне помочь, потому что я делаю это в первый раз и мне действительно нужна помощь.Заранее спасибо.

public class TracksActivity extends FragmentActivity implements ValueEventListener {


    public static final String TRACKS = "Tracks";
    public static final String DB_NAME = "MetalApp";
    public static final String ALBUM_KEY = "SelectedAlbumKey";
    public static final String LOG_TAG = "FB_database_tag";


    private int targetPosition = -1;

    private DatabaseReference mDatabaseReference;
    private TrackAdapter tAdapter;
    @BindView(R.id.lvTracks)
    ListView lvTracks;


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

    }

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        Intent podaci = getIntent();
        targetPosition = podaci.getIntExtra(ALBUM_KEY, -1);
        this.mDatabaseReference = FirebaseDatabase.getInstance().getReference(DB_NAME).child(TRACKS);
        this.mDatabaseReference.addValueEventListener(this);

        return super.onCreateView(name, context, attrs);
    }

    @Override
    public void onDataChange(DataSnapshot s) {
        final List<Track> tracskList = new ArrayList<>();
        HashMap<String, HashMap> tracksInDatabase = (HashMap<String, HashMap>) s.getValue();

        Set<String> keys = tracksInDatabase.keySet();
        List<String> tempKeys = new ArrayList<>();
        tempKeys.addAll(keys);
        Collections.sort(tempKeys, new Comparator<String>() {
            @Override
            public int compare(String s, String t1) {
                return s.compareToIgnoreCase(t1);

            }

        });

        int currentPosition = 0;
        for (String albumTrack : tempKeys) {
            if (currentPosition == targetPosition) {
                HashMap<String, HashMap> trackList = tracksInDatabase.get(albumTrack);
                List<Track> tracks = mapTracks(trackList);
                Collections.sort(tracks, new Comparator<Track>() {
                    @Override
                    public int compare(Track track, Track t1) {
                        return track.getId().compareTo(t1.getId());
                    }
                });
                tAdapter = new TrackAdapter(tracks);
                this.lvTracks.setAdapter(tAdapter);

            }

            currentPosition++;
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

        Log.e(LOG_TAG, databaseError.getMessage());

    }

    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");
            String url = (String) album.get("url");
            Track t = new Track(id, title, url);
            r.add(t);
        }

        return r;

    }

    @OnItemClick(R.id.lvTracks)
    public void onItemClick(int position){
        String[] arrayList = this.getResources().getStringArray(R.array.tracks);
        String tr = arrayList[position];
        Uri uri = Uri.parse(tr);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        this.startActivity(intent);
        
    }
    
}


Метод onItemClick, вероятно, ошибочен, поэтому я бы попросил вас помочь мне в этом.

Это действие, которое должно содержать код для youtube. Кроме того, мой xml. это фрагмент.

public class YT_Activity extends AppCompatActivity  {

    @BindView(R.id.f_Youtube)
    Fragment f_Yotube;


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

    }
}


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

Я попытался найти ответ с помощью google, но не нашел того, что искал.То же самое и на Youtube.

David Crow

"Теперь я хочу, когда пользователь нажимает на любой из треков, чтобы открыть видео этого трека."

Где находится видео?

Member 13593129

Все мои данные находятся на Firebase, включая url каждого видео.

David Crow

Итак, в ответ на вопрос: ListView нажмите, может быть, у вас есть что-то вроде:

public static void watchYoutubeVideo(Context context, String id)
{    
    Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + id));    
    Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=" + id));

    try     
    {        
        context.startActivity(appIntent);    
    }     
    catch (ActivityNotFoundException ex)     
    {        
        context.startActivity(webIntent);    
    }
}
Таким образом, он вернется к просмотру в браузере, если приложение YouTube недоступно.

Member 13593129

Итак, вы говорите, что я должен поставить этот метод вместо моего метода onItemClick? Я сделал это, и ничего не происходит.Когда я нажимаю на трек, а youtube doeesn' t открывается. Я нашел пример кода Youtube_Activity. Это выглядит так:

публичный класс Youtube_class расширяет YouTubePlayerSupportFragment {


частная статические заключительные строки currentVideoID = "идентификатор";
частный YouTubePlayer yPlayer;
@Компании bindview(Р. ИД.frame_layout) так frame_Layout;

@Ручная коррекция
public void onCreate(Bundle bundle) {
супер.метод onCreate(Bundle на);
}

@Ручная коррекция
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
Вид = насос.надуть(Р. макета.activity_yt_,контейнер, ложные);



возвращение смотреть;
}

public static Youtube_class newInstance(String url) {

Youtube_class youtube_activity = новый Youtube_class();

Bundle bundle = новый пакет();
пакет.putString("ссылка", URL-адрес);
youtube_activity.setArguments(Bundle на);
youtube_activity.инит();


вернуться youtube_activity;

}


частный недействительными инициализации() {

инициализируйте(Youtube_key.getAPI_KEY(), новый YouTubePlayer.OnInitializedListener() {

@Ручная коррекция
public void onInitializationFailure(YouTubePlayer.Поставщик arg0, YouTubeInitializationResult arg1) {
}

@Ручная коррекция
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
yPlayer = игрок;
yPlayer.setPlayerStyle(YouTubePlayer.Стиль игрока.ПО УМОЛЧАНИЮ);

если (!был восстановлен) {
yPlayer.loadVideo(getArguments().getString("url"), 0);

Youtube_class myFragment = Youtube_class.newInstance("video_id");
getFragmentManager().beginTransaction().replace(R. id.frame_layout, myFragment).commit();

}

}

});
}
/* public void onYouTubeVideoPaused() {
yPlayer.пауза();


}*/

}

David Crow

"Итак, вы говорите, что я должен поместить этот метод вместо моего метода onItemClick?"

- Конечно, нет. onItemClick() требуется ответить на щелчок элемента. В нем вы можете вызвать функцию, которую я предложил, или взять код из нее и поместить в свой onItemClick() непосредственно.

Member 13593129

Хорошо, я попробовал это сделать, и вот что я получаю:Error:(131, 17) error: Unable to match @OnItemClick method arguments. (com.example.lordofsummer.metalapp.Трексактивность.onItemClick)

Параметр #1: android.content.Контекст
не соответствовал никаким параметрам прослушивателя

Параметр #2: java.lang.Строка
не соответствовал никаким параметрам прослушивателя

Методы могут иметь до 4 параметров(ов):

android.виджет.AdapterView<?>
андроид.смотреть.Смотреть
int
длинный

Они могут быть перечислены в любом порядке, но поиск будет осуществляться сверху вниз.

David Crow

Поэтому измените сигнатуру метода на то, что он должен быть.

Member 13593129

Вот что я сделал:
@OnItemClick(R. id.lvTracks)
public void onItemClick(контекст context) {


Идентификатор строки;
Intent appIntent = новое намерение(намерение.ACTION_VIEW, URI-кода.синтаксический анализ("ВНД.ютуб:" + идентификатор));
Intent webIntent = новое намерение(Intent.ACTION_VIEW, URI-кода.разобрать("http://www.youtube.com/watch?v=" + ИД));

пробовать
{
context.startActivity(appIntent);
}
поймать (ActivityNotFoundException экс)
{
context.startActivity(webIntent);
}

Я инициализировал id, но id в первой строке кода говорит "не инициализирован", и единственный способ исправить это сказать так: String id = null;.
И когда я запускаю свое приложение, я получаю то же самое сообщение, что и ранее.

Я тоже пытался сделать вот так:
Контекст контекст;


@Ручная коррекция
public void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.track_fragment);
ButterKnife.bind(это);

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

Intent appIntent = новое намерение(намерение.ACTION_VIEW, URI-кода.синтаксический анализ("ВНД.ютуб:" + идентификатор));
Intent webIntent = новое намерение(Intent.ACTION_VIEW, URI-кода.разобрать("http://www.youtube.com/watch?v=" + ИД));

пробовать
{
context.startActivity(appIntent);
}
поймать (ActivityNotFoundException экс)
{
context.startActivity(webIntent);
}

}
});

И когда я нажимаю на listview, он давит, и я получаю кучу ошибок...не связанных с текущей проблемой.

David Crow

Вы должны предоставить действительный (YouTube) id. Ранее вы говорили, что URL-адрес каждого видео YouTube хранится в Firebase. Эти URL-адреса должны содержать идентификатор.

0 Ответов